Remote Projects in Electron
Allow the Electron app to connect to roject.rokojori.com and list remote projects
alongside local ones. The JWT is already available;
it's a matter of pointing requests at the remote URL with the token.
Unauthenticated Landing Screen
Unauthenticated users currently crash on dashboard components.
They should land on a screen that explains the app and shows a login link.
Replace browser confirm() in group editor and account delete
The group editor and account delete button still use the browser confirm() dialog.
Replace with the custom <confirm-dialog> component already used elsewhere.
MediaViewerPanel for images and PDFs
Non-text files (images, PDFs) are visible in the file tree but not openable.
Add a MediaViewerPanel and register it in FileEditorRegistry for common media types.
Investigate Gitea webhook auto-deploy
The webhook did not fire on the last two pushes to main. Check the Gitea
webhook delivery log for the response code from /api/deploy. Also run
journalctl -u roject -n 100 on the server to see whether the endpoint
was reached at all. Most likely causes: signature mismatch, wrong branch
ref, or the deploy command failing silently.
Roject: wire lookup-email for member storage migration
The rokojori-auth side (POST /api/auth/lookup-email) is live.
Remaining Roject-side work:
— Add SERVICE_SECRET to Roject .env (must match rokojori-auth SERVICE_SECRET)
— In POST /api/projects/:id/members: call account.rokojori.com/api/auth/lookup-email,
receive the user ID, store member_id as the user ID instead of the email
— In source/server/projectAccess.ts change memberMatchesUser()
from member.member_id === user.email
to member.member_id === user.userId
— Write a one-off migration script: for each member row, call lookup-email
with the stored email and replace member_id with the returned user ID
Investigate session logout after ~1 hour
Users are logged out after a couple of hours. The access token issued by
rokojori-auth expires after 1 hour; the refresh token lasts 30 days.
Roject should silently refresh via GET account.rokojori.com/api/auth/refresh-session
before the token expires.
Investigate:
— Is the 401 response from any API route triggering a redirect to refresh-session?
— Is the refreshToken cookie present and being sent cross-domain?
— Is the refresh-session endpoint actually rotating both cookies correctly?
— Check journalctl on the server for 401 patterns and the browser network tab
for which request first returns 401.
Switch Gitea webhook to dev branch
The Gitea webhook currently triggers on pushes to main, redeploying on every commit.
Switch to a dev branch so main is the stable release target.
rokojori-tunnel — Phase 2
Phase 1 complete: relay server, CRUD tunnel API, WebSocket agent endpoint,
HTTP proxy, test agent script. Tested end-to-end with local LLM (gemma4-coding
on port 8900) — request relayed and response returned correctly.
Service lives at C:\rokojori\projects\web-projects\tunnel.
Phase 2 remaining:
— Allowed users list enforcement (multi-user private access)
— GET /api/tunnels/available with ?purpose= filter
— Public access mode (no auth required on proxy route)
— Roject LLM provider picker integrating the discovery API
styles.rokojori.com — complete deployment
Service is built and running manually via npm start on the server.
Remaining work:
— Set up systemd service (styles-rokojori.service) so it survives restarts
— Download Barlow from /add-fonts (weights 100, 400, 700, 900)
— Verify CORS is working for roject.rokojori.com font imports
— Add to the add-subdomain deployment guide as a reference example
Local Filesystem Access
Extend the file tree to browse arbitrary directories on the host
machine using Node.js fs rather than the server's JSON-backed project storage.
CI deploy email notification
EmailService added to Roject (SMTP via Nodemailer, same credentials as rokojori-auth).
Startup email sent from startServer() listen callback; deploy email sent from
/api/deploy after signature verification passes. reportEmail defined as a static
field on EmailService.
Electron Desktop App Shell
Login window, JWT auth via API, Authorization header injection, token persistence,
ROJECT_ROOT path fix, ELECTRON_RUN_AS_NODE workaround. Full local-only Electron app working.