Full spec for hosting the Elev8 Command Center online, making it mobile-friendly, and migrating Quick Capture from the File System Access API to the Stylify backend.
The Elev8 Command Center is currently a local HTML file that Jason opens manually in Charlotte's Chrome. Two problems have emerged:
1. No mobile access. Jason can't quickly capture a task or check project status from his phone. The current File System Access API approach for Quick Capture is desktop-only by design.
2. Quick Capture is fragile. The File System Access API permission expires every time Chrome restarts, causing captured tasks to silently fail. This has lost at least one item already this session.
The solution: host the Command Center as a Vercel static site at command.stylify-ai.com, rebuild Quick Capture to POST to the Stylify backend API, and add proper mobile-responsive CSS. In Phase 2, sync action item checkbox state to Supabase so checking something off on your phone reflects on your desktop.
The Command Center HTML file will be deployed as a standalone Vercel project, separate from the main Stylify frontend.
command-center/ in the Stylify repo root (or as a separate repo — Stitch's call based on deploy preferences)command-center/index.htmlcommand.stylify-ai.com (add CNAME in Namecheap pointing to Vercel)command.stylify-ai.com now. After the getstylify.com migration completes, update to command.getstylify.com. No rush — the redirect will handle it.
The Command Center displays internal operational data but no customer data or credentials. Simple protection is sufficient for Phase 1: Vercel Password Protection (available on Vercel's free tier via vercel.json). Jason sets a simple password once; the browser remembers it.
{
"headers": [
{
"source": "/(.*)",
"headers": [{ "key": "X-Frame-Options", "value": "DENY" }]
}
]
}
Alternatively, Stitch can gate it behind Stylify JWT — but that's more friction than needed for an internal tool. Password protection is fine.
The current file has a minimal @media (max-width: 600px) block that only adjusts padding. A proper mobile layout requires the following changes:
Problem: 6 tabs in a horizontal bar overflow on small screens. Current fix is overflow-x: auto (sideways scroll). Fine for now, but not ideal.
Fix: On mobile, reduce tab labels to icons only (⚡ 🔗 📊 📄 📈 📨). Keep the icon+label on desktop. Use @media (max-width: 600px) to hide the text spans inside each tab button.
Problem: Expandable detail cards assume wide layout. Steps lists can overflow on narrow screens.
Fix: Ensure word-break: break-word on step items. Max-width on cards is already set correctly. Reduce font size on mobile from 15px → 14px for detail text.
Problem: Cards use a CSS grid with repeat(auto-fill, minmax(220px, 1fr)) — works fine on mobile already since it wraps. No change needed.
Problem: The Connect Inbox button and File System Access flow are desktop-only and meaningless on mobile.
Fix: After Phase 1 backend route is live, the Connect Inbox UI is fully replaced. New mobile-friendly form: Agent picker (dropdown), Priority picker (dropdown), Task title (text input, large tap target), Notes (textarea), Submit button. No file system involved at all.
Problem: On mobile, the header-inner flex row wraps awkwardly — h1 and badges stack but with too much padding.
Fix: On max-width: 600px, reduce header padding to 16px 20px, reduce h1 font-size to 20px, hide the Charlotte note banner (it's operational info Charlotte reads, not critical for Jason on mobile).
This is the only backend change in Phase 1. One new route that accepts a Quick Capture POST and writes the .md file to the inbox folder server-side.
{
"agent": "Charlotte" | "Stitch" | "Pixel",
"priority": "urgent" | "high" | "medium" | "low",
"title": "string (required)",
"notes": "string (optional)"
}
agent, priority, title required — return 400 if missingYYYY-MM-DD_[slugified-title]-[agent-lowercase].mdmdContent using the same template the frontend uses (From / To / Priority / Date / Task / Notes){ success: true, filename } on successrequireAdmin) — same as other /api/admin/* routesquick_captures table (id, agent, priority, title, notes, status, created_at). Charlotte reads from this table at session open via a GET /api/admin/captures?status=pending route instead of reading the file system. This is cleaner and more reliable than trying to write files from Railway.GET /api/admin/captures alongside the file-system inbox scan.
Replace the File System Access API logic in sendCapture() with a fetch() call to /api/admin/capture:
inboxDirHandle, showFolderPicker, queryPermission, requestPermission, and getFileHandle codecapture-log.json write (also no longer needed)localStorage cc_captures log as a local history display only (the recent captures list at the bottom of the Quick Capture tab) — but it's no longer the recovery mechanismPhase 1 leaves one gap: action item checkboxes (the "I've done this" toggles) are stored in localStorage, which is browser-local. If Jason checks off "Subscribe to Kit" on his phone, his desktop still shows it unchecked. Phase 2 fixes this by moving checkbox state to Supabase.
-- Migration: command_center_state CREATE TABLE command_center_state ( id uuid PRIMARY KEY DEFAULT gen_random_uuid(), user_id uuid REFERENCES auth.users(id) ON DELETE CASCADE, item_id text NOT NULL, -- matches ACTION_ITEMS[].id checked boolean DEFAULT false, updated_at timestamptz DEFAULT now(), UNIQUE(user_id, item_id) ); ALTER TABLE command_center_state ENABLE ROW LEVEL SECURITY; -- Policy: users can only read/write their own state CREATE POLICY "Own state only" ON command_center_state FOR ALL USING (user_id = auth.uid());
{ checked: ["kit-subscription", "test-scorecard"] }{ checked: true | false }. Uses Supabase upsert on (user_id, item_id).GET /api/admin/command-center/state and use returned array to populate checkbox states (instead of getState() from localStorage)PATCH /api/admin/command-center/state/:itemId with new checked value (fire-and-forget, optimistic UI)resetAll()) should call PATCH for each checked item with checked: false, or a bulk reset endpoint if Stitch wants to add oneThe Command Center needs to stay current. Charlotte's session-close process already updates ACTION_ITEMS and the Charlotte Note. With the online version, the update workflow is the same — edit the HTML file and push to Vercel. The only new step is:
GET /api/admin/captures?status=pending at session open in addition to the file-system inbox scan| # | Step | Owner | Timing | Depends On |
|---|---|---|---|---|
| 1 | Stitch: Add POST /api/admin/capture backend route (Option A: write to Supabase quick_captures table) |
Stitch | Now | Nothing |
| 2 | Stitch: Add GET /api/admin/captures route for Charlotte to read pending captures at session open |
Stitch | Now (same session as step 1) | Step 1 |
| 3 | Charlotte: Update Command Center HTML — mobile CSS, replace Quick Capture UI with API fetch, remove File System Access API code | Charlotte | Now (can run parallel with steps 1–2) | Nothing (can prep; wire to API after step 1 deploys) |
| 4 | Stitch: Create Vercel project + configure command.stylify-ai.com subdomain in Namecheap |
Stitch | Now | Steps 1–3 |
| 5 | Jason: Test on iPhone — Quick Capture, Action Items, Projects tab | Jason | After step 4 | Steps 1–4 |
| 6 | Stitch: Migration for command_center_state table + state sync routes |
Stitch | Post-Meta approval | Production freeze lifted |
| 7 | Charlotte: Wire frontend to state sync API (replace localStorage with API calls) | Charlotte | Post-Meta approval | Step 6 |
| Decision | Rationale |
|---|---|
| Phase 1 can start now despite production freeze | No database migrations in Phase 1 (unless Stitch chooses Option A for captures, which is a new additive table — low risk). No changes to Instagram/Meta functionality. Purely additive. |
| Vercel static site, not Stylify admin panel | Faster to ship. Charlotte can update it independently of Stitch. Phase 2 migration to admin panel is optional and lower priority than getting mobile access working. |
| Quick Capture → backend API (not file system) | File System Access API permission expires on Chrome restart — fundamentally unreliable. Backend API works from any device, no permission needed. |
| Phase 2 state sync requires production freeze to lift | New Supabase table = migration. Held per standing freeze policy. |
| Jason has no desire to switch from Anthropic | Confirmed 2026-02-28. AI provider resilience analysis done. No portability work needed. |
Created by Charlotte (COO) · 2026-02-28 · Charlotte Session BN