synq, a tiny android-to-org capture system.

synq consists of:

  • an Android app for capturing notes items
  • a docker-based agent that pulls notes and saves them to a local .org file
  1. Open Synq app
  2. Type note, mark as TODO (opt), add tags (opt), save.
  3. If home server accessible, post unsynced captures to lan-only service and appended to synq.org.

home-screen-v1 history-screen-v1 settings-v1

Architecture

android app
  kotlin + jetpack compose
  room sqlite local queue
  workmanager + manual sync
  okhttp/retrofit client

home server
  docker container on jeeves/unraid
  python + fastapi
  sqlite idempotency store
  append-only org writer
  1. user saves capture locally
  2. app marks it pending
  3. sync runs when server is reachable
  4. app posts pending captures to fastapi
  5. server validates, dedupes by id, appends to phone.org
  6. app marks capture synced

Build & Deploy

  1. First, build and deploy synq-server, the docker container that listens for new notes and writes to the local file.
  2. Then, build and install the synq app.
  3. Finally, retrieve the token (token.txt in the docker container's data directory, or from the container logs docker logs synq-server)

1. synq-server (docker)

# build
docker build -t synq-server ./server

# run (replace paths and token as needed)
docker run -d --name synq --restart=unless-stopped \
  -p 8765:8765 \
  -v /mnt/user/synq/data:/data \
  synq-server

The server generates a random token on first start and logs it prominently. copy it into the android app settings. To use a fixed token instead, pass -e PHONE_CAPTURE_TOKEN=yourtoken.

To rebuild after a git pull:

git pull
docker build -t synq-server ./server
docker stop synq && docker rm synq
# re-run the docker run command above

2. synq (android)

Open android/ in Android Studio and hit Sync. then either:

  • run on device/emulator directly from Android Studio (▶), or
  • build a release APK from the terminal:
cd android
./gradlew assembleRelease
# output: app/build/outputs/apk/release/app-release-unsigned.apk

sideload to a connected device:

adb install app/build/outputs/apk/release/app-release-unsigned.apk

releasing on gitea

tag the commit and push the tag:

git tag v1.0.0
git push gitea v1.0.0

then go to Releases → New Release in the Gitea UI, pick the tag, and drag the APK into the assets box. anyone on the LAN can download it from there.

Description
Local phone > server todo sync
Readme 952 KiB
v1.0.1 Latest
2026-05-18 16:54:37 -04:00
Languages
Kotlin 65.9%
Python 33.6%
Dockerfile 0.5%