98 lines
2.6 KiB
Markdown
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.
|