Files
synq/README.md
2026-05-21 13:20:30 -04:00

98 lines
2.6 KiB
Markdown

# 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`.
<p>
<img src="docs/home-v1.png" alt="home-screen-v1" width="220">
<img src="docs/history-v1.png" alt="history-screen-v1" width="220">
<img src="docs/settings-v1.png" alt="settings-v1" width="220">
</p>
## Architecture
```text
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)
```bash
# 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`:
```bash
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:
```bash
cd android
./gradlew assembleRelease
# output: app/build/outputs/apk/release/app-release-unsigned.apk
```
sideload to a connected device:
```bash
adb install app/build/outputs/apk/release/app-release-unsigned.apk
```
### releasing on gitea
tag the commit and push the tag:
```bash
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.