rojects/workspace/boards/backlog.html

125 lines
4.9 KiB
HTML
Raw Normal View History

<!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 &lt;SERVICE_SECRET&gt; 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>
<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 &mdash; 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>