Commit

6ce2973

I am thinking about deployment and start doubting my own decisions. With Dokploy, deploying a new version of the server is just a matter of pushing to the repo. Dokploy also allows bind mount, so I can bind mount the vault into the server container. Only uid needs to match. What…
I think it's better. It keeps what mattered in Q1 (the vault stays a plain dir on the host, so Claude Code still works in it bare) and drops the part I liked least: building a release pipeline just to deploy. What changes: - Q25: no bundled-JS release needed for the server. A…
@dtinth Updated docs/SPEC.md for Dokploy + bind-mounted vault, with the CLI as a thin API client (f16dad0, local). Still waiting on a yes to push next and start on legacy parity.
On it: plan/apply against Supabase, behind an interface with an in-memory fake and tests. No live Supabase access here, so I will test against the fake and leave a read-only notes plan for you to run against the real one.
On it: adversarial security review of next (server auth, API, git/token handling, path traversal, preview iframe, Docker). Will post findings and fixes.
Review pass done, now fixing. Worst find: the GitHub App token for one repo works on every repo in the installation. Also: note aliases can write files outside the site dir (../), and symlinks in the vault are followed.
I created a dedicated app and installed it on just two directories. BTW, my GITHUB_APP_PRIVATE_KEY is a PEM file with multiline, how do I set it in .env?
Paste it as one line, either way works now (650a0f2): GITHUB_APP_PRIVATE_KEY=<output of base64 -w0 key.pem> (on macOS: base64 -i key.pem), or the PEM with \n escapes. A dedicated app on just those two repos is ideal. Tokens are now also scoped to one repo each.
Security review done, fixes in eb17fe7, CI green. Fixed: 1. GitHub App token for one repo reached every repo in the installation. Now each token covers only its own repo, contents only. 2. A note alias like ../x wrote files outside the site dir. Ids and aliases must now be plain file names. 3. Symlinked .md files in the vault were read, and saves followed them. Now they are skipped, and saves use O_NOFOLLOW. 4. API key compared in constant time; a warning if it is under 32 chars, since it also signs session tokens. 5. The backoffice can no longer be framed (clickjacking Publish). 6. Downloaded notes-frontend tarballs are checked against the bun.lock hash. Checked and fine: auth on every /api route, Supabase uid check, path traversal on /admin and note ids, a sandboxed preview iframe with no access to the token, no v-html, the token kept out of .git/config. Accepted risks: a. Any XSS on dt.in.th gets your Supabase session, which can mint a backoffice token. b. Anything that can write vault/.git (hooks, config) can run code in the container with its secrets, so keep agents out of .git. c. Session tokens last 1h and cannot be revoked short of rotating NOTES_API_KEY. @dtinth want any of a–c tightened?
dt.in.thThai Pangsakulyanont

commit 6ce2973