2026-07-14 12:34:47 +00:00
|
|
|
<!DOCTYPE html>
|
|
|
|
|
<html lang="en">
|
|
|
|
|
<head>
|
|
|
|
|
<meta charset="UTF-8">
|
|
|
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
|
|
|
<title>Backlog - Roject</title>
|
|
|
|
|
<link rel="stylesheet" href="../_assets_/styles.css">
|
|
|
|
|
<link rel="stylesheet" href="../_assets_/nav.css">
|
|
|
|
|
<link rel="stylesheet" href="../_assets_/boards.css">
|
|
|
|
|
</head>
|
|
|
|
|
<body>
|
|
|
|
|
<div class="board-page">
|
|
|
|
|
|
|
|
|
|
<header>
|
|
|
|
|
<p class="date">Board</p>
|
|
|
|
|
<h1>Backlog</h1>
|
|
|
|
|
<p class="subtitle">Big visions and user stories. Too complex or vague for tasks, but important for direction.</p>
|
|
|
|
|
</header>
|
|
|
|
|
|
|
|
|
|
<div class="board">
|
|
|
|
|
|
|
|
|
|
<div class="lane">
|
|
|
|
|
<div class="lane-header">MVP</div>
|
|
|
|
|
|
2026-07-14 13:05:04 +00:00
|
|
|
<task-item class="blue hide-content">
|
|
|
|
|
<task-title>Add rokojori-auth lookup-email endpoint</task-title>
|
|
|
|
|
<task-content>
|
|
|
|
|
Project members are currently stored by email (Option B interim). To migrate to
|
|
|
|
|
user-ID-based membership the two services need a server-to-server lookup call.
|
|
|
|
|
|
|
|
|
|
In rokojori-auth:
|
|
|
|
|
— Add POST /api/auth/lookup-email route
|
|
|
|
|
— Body: { email: string }
|
|
|
|
|
— Auth: Authorization: Bearer <SERVICE_SECRET> header (shared env var, not a user JWT)
|
|
|
|
|
— Returns { id, email } on success, 404 if no account exists for that email
|
|
|
|
|
— Add SERVICE_SECRET to rokojori-auth .env and its deployment config
|
|
|
|
|
|
|
|
|
|
In Roject:
|
|
|
|
|
— Add ROJECT_SERVICE_SECRET to .env (must match rokojori-auth)
|
|
|
|
|
— 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 the one line in memberMatchesUser()
|
|
|
|
|
from member.member_id === user.email
|
|
|
|
|
to member.member_id === user.userId
|
|
|
|
|
— Write a one-off migration script to rewrite existing project_members records:
|
|
|
|
|
for each member row, call lookup-email with the stored email, replace member_id
|
|
|
|
|
with the returned user ID
|
|
|
|
|
</task-content>
|
|
|
|
|
</task-item>
|
|
|
|
|
|
2026-07-14 12:34:47 +00:00
|
|
|
<task-item class="blue hide-content">
|
|
|
|
|
<task-title>Local Git Repository Integration</task-title>
|
|
|
|
|
<task-content>
|
|
|
|
|
Git integration inside the editor: file status indicators in the tree, staging,
|
|
|
|
|
commit, push, pull, diffs, and history. Depends on local filesystem access.
|
|
|
|
|
Once Roject can open an arbitrary local directory, the git repo is already there.
|
|
|
|
|
Implementation via simple-git (thin Node.js wrapper around the git CLI).
|
|
|
|
|
</task-content>
|
|
|
|
|
</task-item>
|
|
|
|
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
<div class="lane">
|
|
|
|
|
<div class="lane-header">Nice To Have</div>
|
|
|
|
|
|
|
|
|
|
<task-item class="purple hide-content">
|
|
|
|
|
<task-title>Internet Tunnel / Port Relay</task-title>
|
|
|
|
|
<task-content>
|
|
|
|
|
Allow local devices — a Stable Diffusion instance, a local LLM, a GDScript language
|
|
|
|
|
server — to be accessible to authorised Roject users over the internet, routed through
|
|
|
|
|
the Roject server via a persistent WebSocket. Primary use case: phone as a thin client
|
|
|
|
|
while the main machine handles all heavy processing.
|
|
|
|
|
</task-content>
|
|
|
|
|
</task-item>
|
|
|
|
|
|
|
|
|
|
<task-item class="purple hide-content">
|
|
|
|
|
<task-title>Real-Time Multi-User Collaboration</task-title>
|
|
|
|
|
<task-content>
|
|
|
|
|
Multiple users editing the same file simultaneously with presence indicators
|
|
|
|
|
and conflict resolution. Likely via operational transforms or CRDTs.
|
|
|
|
|
Significant architecture work; not planned for the near term.
|
|
|
|
|
</task-content>
|
|
|
|
|
</task-item>
|
|
|
|
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
<div class="lane">
|
|
|
|
|
<div class="lane-header">To The Moon</div>
|
|
|
|
|
|
|
|
|
|
<task-item class="orange hide-content">
|
|
|
|
|
<task-title>Mobile App (PWA first, native shell later)</task-title>
|
|
|
|
|
<task-content>
|
|
|
|
|
Make Roject usable on a phone or tablet. Quickest path: PWA with a manifest
|
|
|
|
|
and service worker — works in Safari and Chrome on Android and iOS without an
|
|
|
|
|
app store. If native capabilities are later needed, Capacitor can wrap the same
|
|
|
|
|
web app. A React Native or Flutter rewrite is not planned.
|
|
|
|
|
The realistic mobile workflow is browsing files, reading output, and light edits
|
|
|
|
|
rather than heavy coding.
|
|
|
|
|
</task-content>
|
|
|
|
|
</task-item>
|
|
|
|
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
<footer>
|
|
|
|
|
Roject — backlog
|
|
|
|
|
</footer>
|
|
|
|
|
|
|
|
|
|
</div>
|
|
|
|
|
<script>var NAV_ROOT = '../';</script>
|
|
|
|
|
<script src="../_assets_/nav-data.js"></script>
|
|
|
|
|
<script src="../_assets_/nav.js"></script>
|
|
|
|
|
<script>
|
|
|
|
|
document.querySelectorAll( 'task-title' ).forEach( title =>
|
|
|
|
|
{
|
|
|
|
|
title.addEventListener( 'click', () =>
|
|
|
|
|
{
|
|
|
|
|
title.closest( 'task-item' ).classList.toggle( 'hide-content' );
|
|
|
|
|
} );
|
|
|
|
|
} );
|
|
|
|
|
</script>
|
|
|
|
|
</body>
|
|
|
|
|
</html>
|