- outline_sync.py: write compare results to /tmp/compare_results.json
with full doc maps for parent-chain lookup during copy operations
- webui.py: /review page with remote-only, local-only, conflict tables;
/review/content endpoint to fetch doc text from either instance;
/review/apply endpoint for copy_to_local, copy_to_remote, keep_remote,
keep_local, skip actions; "Compare Instances" button on dashboard;
"Review Differences" link shown after compare completes
- entrypoint.sh: include local block in generated settings.json
- docker-compose.yml: pass LOCAL_OUTLINE_URL/TOKEN/HOST env vars
- deploy.yml: write LOCAL_* secrets to .env file
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Prevents output from a previous run bleeding into the next panel when
two sync operations are triggered in quick succession.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Both the deploy workflow (.env generation) and docker-compose were
missing the local instance env vars, so entrypoint.sh never had them
to write into settings.json.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Add /compare POST endpoint that runs the two-instance diff
- Add "Compare Instances" button to the dashboard
- Fix double "Done." output: the summary line was logged both as a
regular log event and as the done event message
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Adds LOCAL_OUTLINE_URL and LOCAL_OUTLINE_TOKEN to the generated
settings.json so the compare command can reach the outline-web container.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Adds read-only `compare` command that fetches both the remote Outline
instance (via Tailscale) and a local instance (outline-web container),
matches documents by canonical path key, and reports in_sync / remote_only /
local_only / conflict status. Also adds PRD for the full two-instance sync
workflow.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Break connectivity check into three stages — DNS resolution, TCP connect,
and API auth — each reported separately so failures pinpoint the exact layer.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
extra_hosts is incompatible with network_mode: service:... — move it to the
Tailscale sidecar container whose network namespace is shared with outline-sync-ui.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
outline-sync runs on domverse-berlin and connects to Outline on domverse.de
via Tailscale. Docker DNS does not cross hosts, so map the hostname via
extra_hosts to the Tailscale IP 100.104.53.109.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Add inputs block to workflow_dispatch so Gitea shows the Run button
- Skip version bump on manual triggers to allow redeployment without bumping
- Fall back to VERSION file for APP_VERSION on manual runs
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Adds GET /files/download endpoint that streams all vault files (excl.
.git) as a deflate-compressed vault.zip. Adds Download All button to
the /files page header. Also adds FILES_VIEWER_PRD.md planning doc.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
New documents now placed in parent's subdirectory (coll/Parent/Child.md)
instead of flat in the collection dir. Parent paths registered immediately
so nested children resolve correctly within the same pull.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Dockerfile: ARG/ENV APP_VERSION, copies VERSION file
- compose: passes build arg, removes runtime env var
- webui: reads VERSION file as fallback if env not set
- deploy: explicit build step with --build-arg
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Add VERSION file (starts at 0.1.0)
- Deploy workflow bumps patch on every push, commits back [skip ci]
- APP_VERSION passed into container via env
- Version shown in page header next to title
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Remove auto-reload after job completion
- Re-enable button and refresh stats in-place via /status fetch
- Increase log panel max-height to 600px, add resize:vertical
- Add IDs to stat cells for targeted DOM updates
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Add TS_EXTRA_ARGS=--accept-routes so sidecar uses VPS-advertised subnet
- Use direct container IP (172.29.0.13) instead of unresolvable hostname
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Replace hardcoded IP 172.29.0.7 with container hostname 'outline'
- Fix network name from 'domverse' to 'domnet' (actual external network)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- ts-outline-sync sidecar joins Tailscale and shares network namespace
with the app container (network_mode: service:ts-*)
- Traefik labels on sidecar; app container has no direct network exposure
- OUTLINE_URL now uses internal Docker IP 172.29.0.7:3000 via Tailscale
subnet route (domverse.de advertises 172.29.0.0/16)
- Add TAILSCALE_PRD.md documenting the full setup and admin checklist
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>