diff --git a/workspace/_assets_/nav-data.js b/workspace/_assets_/nav-data.js
index 0695fa8..622f158 100644
--- a/workspace/_assets_/nav-data.js
+++ b/workspace/_assets_/nav-data.js
@@ -17,6 +17,7 @@ var NAV_DATA = {
{ title: 'Writing Editor Panels', path: 'guides/writing-editor-panels/index.html' },
{ title: 'Writing Backend Routes', path: 'guides/writing-backend-routes/index.html' },
{ title: 'Locales', path: 'guides/locales/index.html' },
+ { title: 'Agent Memory', path: 'guides/agent-memory/index.html' },
]
},
{
diff --git a/workspace/guides/agent-memory/index.html b/workspace/guides/agent-memory/index.html
new file mode 100644
index 0000000..c030518
--- /dev/null
+++ b/workspace/guides/agent-memory/index.html
@@ -0,0 +1,70 @@
+
+
+
+
+
+
+
+
+ The rule
+
+
+
The workspace is the memory
+
+ All persistent knowledge about this project — planned features, decisions made,
+ open improvements, session notes — lives in workspace/ and is
+ version-controlled. Agents must write project knowledge here, not into local
+ Claude memory files (~/.claude/memory/). The workspace is visible
+ to the user, survives across machines, and is the single source of truth.
+
+
+
+
+
What goes where
+
+ Planned features and open items → workspace/outline/index.html, Smaller open improvements list or a numbered priority card.
+ Session notes and what was built → workspace/history/YYYY/MM-Month/DD-Day/index.html via the Update History action.
+ Coding conventions and how-tos → a new page under workspace/guides/.
+ Recurring procedures → a new page under workspace/actions/.
+
+
+
+
+
What may go in Claude local memory
+
+ Only things that genuinely cannot live in the repo:
+
+
+ The path to the project directory on the local machine.
+ Paths to sibling projects (e.g. rokojori-auth).
+ User preferences that predate or are unrelated to this project.
+
+
+ Never write planned features, open bugs, session summaries, or architectural
+ decisions into Claude local memory. If it belongs to the project, it belongs
+ in the workspace.
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/workspace/guides/index.html b/workspace/guides/index.html
index 31267df..01a8f4c 100644
--- a/workspace/guides/index.html
+++ b/workspace/guides/index.html
@@ -65,6 +65,18 @@
+
+
Agent Memory
+
+ Where agents should store and recall project knowledge — the rule that the
+ workspace is the memory, what goes in the outline vs. history vs. guides,
+ and what (little) may go in Claude local memory files.
+
+
+ Read the guide
+
+
+
diff --git a/workspace/history/2026/07-July/13-Sunday/index.html b/workspace/history/2026/07-July/13-Sunday/index.html
index d18de89..675cf84 100644
--- a/workspace/history/2026/07-July/13-Sunday/index.html
+++ b/workspace/history/2026/07-July/13-Sunday/index.html
@@ -213,6 +213,39 @@
+
+ What we built — CI/CD pipeline
+
+
+
Webhook-based auto-deploy
+
+ Replaced the manual git pull && npm run build && systemctl restart roject
+ deploy with a Gitea webhook calling POST /api/deploy on the Roject server itself.
+ The endpoint verifies the X-Gitea-Signature HMAC-SHA256 signature against
+ DEPLOY_WEBHOOK_SECRET, checks the push is to refs/heads/main,
+ responds 200 immediately, then spawns a detached bash process that pulls, builds, and
+ restarts the service — surviving the systemctl restart that kills the parent.
+
+
+ Gitea webhook
+ HMAC-SHA256
+ detached spawn
+ /api/deploy
+
+
+
+
+
Why not Gitea Actions runner
+
+ Spent significant time attempting a gitea-runner (act_runner) setup.
+ The runner requires Docker to execute job steps; without it the :host
+ execution mode produced a path-resolution bug. Installing Docker would have made
+ systemctl restart from inside a container awkward. A direct webhook
+ to the server is simpler, fully transparent, and fits a single-server deploy perfectly.
+
+
+
+
What's next
@@ -223,6 +256,10 @@
Also: graceful 401 handling in data-fetching components (groups, projects, etc.)
so they display a sensible message instead of throwing a JS error.
+
+ CI improvements planned: send an email notification after each auto-deploy restart;
+ switch webhook trigger to a dev branch to avoid deploying on every commit to main.
+
diff --git a/workspace/history/index.html b/workspace/history/index.html
index 0f5aef5..63a5899 100644
--- a/workspace/history/index.html
+++ b/workspace/history/index.html
@@ -21,7 +21,7 @@
-
rokojori-auth built and deployed; Roject local auth replaced with JWT middleware — cookie-based login via account.rokojori.com, systemd EnvironmentFile fix.
+
rokojori-auth built and deployed; Roject local auth replaced with JWT middleware; CI/CD pipeline — webhook-based auto-deploy on push to main via /api/deploy.
diff --git a/workspace/outline/index.html b/workspace/outline/index.html
index 0eedc72..963a358 100644
--- a/workspace/outline/index.html
+++ b/workspace/outline/index.html
@@ -91,24 +91,7 @@
-
1 — CI pipeline (server is live)
-
- The server is deployed and running at https://roject.rokojori.com
- (nginx + systemd + Let's Encrypt on Server A). What remains is automating the
- deploy on push: a Gitea Actions runner installed on Server A registers with the
- repo on community.rokojori.com and runs a workflow that pulls,
- builds, and restarts the service on every push to main. This is the last piece
- that turns the manual deploy into a proper CI/CD pipeline.
-
-
- Gitea Actions runner
- act_runner
- auto-deploy on push
-
-
-
-
-
2 — Electron desktop app + local filesystem access
+
1 — Electron desktop app + local filesystem access
Package Roject as a standalone desktop application using Electron. Since the
frontend is already plain HTML/JS/CSS, the Electron integration is mostly
@@ -139,7 +122,7 @@
-
3 — Local git repository integration
+
2 — Local git repository integration
Git integration inside the editor: file status indicators in the tree, staging,
commit, push and pull, and eventually diffs and history. This depends on local
@@ -163,7 +146,7 @@
-
4 — Internet tunnel / port pass-through relay
+
3 — Internet tunnel / port pass-through relay
A tunneling feature that allows local devices — a main workstation running
Stable Diffusion, a local LLM, a GDScript language server, or any other
@@ -201,7 +184,7 @@
-
5 — Mobile app (PWA first, native shell later)
+
4 — Mobile app (PWA first, native shell later)
Make Roject usable on a phone or tablet. The quickest path given the existing
web frontend is a Progressive Web App (PWA) — a manifest file and a service
@@ -230,6 +213,23 @@
+
+
Done — CI/CD pipeline
+
+ Auto-deploy on push to main via a Gitea webhook calling
+ POST /api/deploy on the Roject server. The endpoint verifies the
+ X-Gitea-Signature HMAC-SHA256 signature, checks the branch is
+ main, responds immediately, then spawns a detached bash process
+ that runs git pull && npm run build && systemctl restart roject.
+ The detached process survives the systemctl restart that kills the parent.
+
+
+ Gitea webhook
+ HMAC-SHA256
+ detached spawn
+
+
+
Done — Centralized auth: rokojori-auth
@@ -283,6 +283,8 @@
The group editor and account delete button still use the browser confirm() instead of the custom <confirm-dialog>.
Non-text files (images, PDFs) are visible in the tree but not openable — a MediaViewerPanel is planned.
No real-time multi-user collaboration yet.
+
CI deploy endpoint (/api/deploy) should send an email notification after each restart so deploys are visible without checking logs.
+
The Gitea webhook currently triggers on pushes to main — switch to a dev branch so every commit doesn't redeploy.