# ByteLyst Ecosystem — Web Apps Inventory & Vercel Deployment Audit

> **Generated:** 2026-03-29
> **Scope:** All web applications across the ByteLyst ecosystem
> **Purpose:** Assess Vercel deployment readiness for every web surface

Related:

- [`../ENDPOINT_INVENTORY.md`](../ENDPOINT_INVENTORY.md) — canonical endpoint inventory across local, Azure VM, and public-domain patterns

---

## Executive Summary

**14 web applications** discovered across 12 repositories. All are Next.js 16 except:

- **EffoRise** — Vite + React 19 SPA
- **Productivity Web** — Next.js 15 (standalone, no ecosystem deps)

### Readiness Scorecard

| #   | App               | Product       | Framework         | Vercel-Ready | Blockers                                                                                  |
| --- | ----------------- | ------------- | ----------------- | :----------: | ----------------------------------------------------------------------------------------- |
| 1   | Admin Dashboard   | Platform      | Next.js 16        |    ✅ Yes    | `workspace:*` deps (monorepo — Vercel handles)                                            |
| 2   | Tracker Dashboard | Platform      | Next.js 16        |    ✅ Yes    | `workspace:*` deps (monorepo — Vercel handles)                                            |
| 3   | User Dashboard    | LysnrAI       | Next.js 16        |  ⚠️ Partial  | Server-side Cosmos/Stripe; env vars needed                                                |
| 4   | ChronoMind Web    | ChronoMind    | Next.js 16        |    🔴 No     | `file:` refs (design-tokens, ui); Serwist PWA                                             |
| 5   | JarvisJr Web      | JarvisJr      | Next.js 16        |    🔴 No     | `file:` ref (@bytelyst/ui)                                                                |
| 6   | NomGap Web        | NomGap        | Next.js 16        |    🔴 No     | `file:` ref (@bytelyst/ui); hardcoded `output: standalone`                                |
| 7   | FlowMonk Web      | FlowMonk      | Next.js 16        |    🔴 No     | `file:` ref (@bytelyst/ui)                                                                |
| 8   | NoteLett Web      | NoteLett      | Next.js 16        |    🔴 No     | `file:` ref (@bytelyst/ui); hardcoded `output: standalone`                                |
| 9   | ActionTrail Web   | ActionTrail   | Next.js 16        |  ⚠️ Partial  | Hardcoded `output: standalone`; no TailwindCSS                                            |
| 10  | MindLyst Web      | MindLyst      | Next.js 16        |  ⚠️ Partial  | Vercel-aware config; many `@bytelyst/*` registry deps                                     |
| 11  | LocalMemGPT Web   | LocalMemGPT   | Next.js 16        |    🔴 No     | `file:` ref (@bytelyst/ui); hardcoded `output: standalone`                                |
| 12  | LLM Lab Dashboard | Local LLM Lab | Next.js 16        |    🔴 No     | `file:` refs (design-tokens, ui); hardcoded `output: standalone`; local Ollama dependency |
| 13  | EffoRise Client   | EffoRise      | Vite 7 + React 19 |  ⚠️ Partial  | SPA — needs Vite adapter or static deploy; API proxy to backend                           |
| 14  | Productivity Web  | Standalone    | Next.js 15        |    ✅ Yes    | Standalone app, no ecosystem deps, ready as-is                                            |

### Blocker Categories

| Blocker                                     |  Count  |                          Fix Effort                          |
| ------------------------------------------- | :-----: | :----------------------------------------------------------: |
| **`file:` refs to common-plat**             | 7 apps  | ~5 min/app — convert to `^0.1.0` (packages already on Gitea) |
| **Gitea registry inaccessible from Vercel** | 12 apps |   One-time fix — deploy Gitea to Azure VM with public URL    |
| **Hardcoded `output: standalone`**          | 4 apps  |          ~5 min/app — add Vercel-aware conditional           |
| **No TailwindCSS**                          | 2 apps  |             Cosmetic — not a deployment blocker              |
| **Serwist PWA**                             |  1 app  |          May need Vercel config for service worker           |
| **Local-only dependencies**                 |  1 app  |   LLM Lab needs Ollama — Vercel won't work for API routes    |

---

## Detailed App Inventory

### 1. Admin Dashboard (`@bytelyst/admin-web`)

| Field                 | Value                                                                    |
| --------------------- | ------------------------------------------------------------------------ |
| **Repo**              | `learning_ai_common_plat`                                                |
| **Path**              | `dashboards/admin-web/`                                                  |
| **Framework**         | Next.js 16.1.6, React 19.2.3                                             |
| **Styling**           | TailwindCSS v4, shadcn/ui                                                |
| **Port**              | 3001                                                                     |
| **Build**             | `next build --webpack`                                                   |
| **Output**            | Vercel-aware (`process.env.VERCEL ? {} : { output: 'standalone' }`)      |
| **@bytelyst/\* deps** | 13 packages via `workspace:*` (monorepo)                                 |
| **Server-side**       | Azure Cosmos DB, AKV, JWT (jose), bcryptjs                               |
| **Env vars**          | COSMOS_ENDPOINT, COSMOS_KEY, JWT_SECRET, SEED_SECRET, AZURE_KEYVAULT_URL |
| **Dockerfile**        | ✅ Yes                                                                   |
| **Vercel status**     | ✅ Ready — monorepo `workspace:*` resolved by Vercel's pnpm support      |

### 2. Tracker Dashboard (`@bytelyst/tracker-web`)

| Field                 | Value                          |
| --------------------- | ------------------------------ |
| **Repo**              | `learning_ai_common_plat`      |
| **Path**              | `dashboards/tracker-web/`      |
| **Framework**         | Next.js 16.1.6, React 19.2.3   |
| **Styling**           | TailwindCSS v4                 |
| **Port**              | 3003                           |
| **Build**             | `next build --webpack`         |
| **Output**            | Vercel-aware                   |
| **@bytelyst/\* deps** | 6 packages via `workspace:*`   |
| **Server-side**       | AKV (instrumentation.ts)       |
| **Env vars**          | JWT_SECRET, AZURE_KEYVAULT_URL |
| **Dockerfile**        | ✅ Yes                         |
| **Vercel status**     | ✅ Ready                       |

### 3. User Dashboard (`user-dashboard-web`)

| Field                 | Value                                                                                                                             |
| --------------------- | --------------------------------------------------------------------------------------------------------------------------------- |
| **Repo**              | `learning_voice_ai_agent`                                                                                                         |
| **Path**              | `user-dashboard-web/`                                                                                                             |
| **Framework**         | Next.js 16.1.6, React 19.2.3                                                                                                      |
| **Styling**           | TailwindCSS v4, shadcn/ui                                                                                                         |
| **Port**              | 3002                                                                                                                              |
| **Build**             | `next build --webpack`                                                                                                            |
| **Output**            | Vercel-aware                                                                                                                      |
| **@bytelyst/\* deps** | 14 packages via Gitea registry (`^0.1.0`)                                                                                         |
| **Server-side**       | Azure Cosmos DB, Stripe, JWT, bcryptjs                                                                                            |
| **Env vars**          | COSMOS_ENDPOINT, COSMOS_KEY, JWT_SECRET, STRIPE_SECRET_KEY, STRIPE_PUBLISHABLE_KEY, PLATFORM_SERVICE_URL, ACTIONTRAIL_SERVICE_URL |
| **Dockerfile**        | ✅ Yes                                                                                                                            |
| **Vercel status**     | ⚠️ Partial — needs Gitea registry access during Vercel build                                                                      |

### 4. ChronoMind Web

| Field                 | Value                                                                         |
| --------------------- | ----------------------------------------------------------------------------- |
| **Repo**              | `learning_ai_clock`                                                           |
| **Path**              | `web/`                                                                        |
| **Framework**         | Next.js 16.1.6, React 19.2.3                                                  |
| **Styling**           | TailwindCSS v4                                                                |
| **Port**              | 3030                                                                          |
| **Build**             | `next build --webpack`                                                        |
| **Output**            | Vercel-aware                                                                  |
| **@bytelyst/\* deps** | 10 packages — **2 via `file:` refs** (`design-tokens`, `ui`), 8 via Gitea     |
| **Special**           | Serwist PWA (service worker)                                                  |
| **Env vars**          | NEXT_PUBLIC_PLATFORM_URL                                                      |
| **Dockerfile**        | ✅ Yes                                                                        |
| **Vercel status**     | 🔴 Blocked — `file:` refs; Serwist service worker needs Vercel headers config |

### 5. JarvisJr Web (`jarvisjr-web`)

| Field                 | Value                                                  |
| --------------------- | ------------------------------------------------------ |
| **Repo**              | `learning_ai_jarvis_jr`                                |
| **Path**              | `web/`                                                 |
| **Framework**         | Next.js 16.1.6, React 19.2.3                           |
| **Styling**           | TailwindCSS v4                                         |
| **Port**              | 3035                                                   |
| **Build**             | `next build --webpack`                                 |
| **Output**            | Vercel-aware                                           |
| **@bytelyst/\* deps** | 6 packages — **1 via `file:` ref** (`ui`), 5 via Gitea |
| **Env vars**          | NEXT_PUBLIC_PLATFORM_URL, NEXT_PUBLIC_BACKEND_URL      |
| **Dockerfile**        | ✅ Yes                                                 |
| **Vercel status**     | 🔴 Blocked — `file:` ref for @bytelyst/ui              |

### 6. NomGap Web (`@nomgap/web`)

| Field                 | Value                                                    |
| --------------------- | -------------------------------------------------------- |
| **Repo**              | `learning_ai_fastgap`                                    |
| **Path**              | `web/`                                                   |
| **Framework**         | Next.js 16.1.6, React 19.2.0                             |
| **Styling**           | TailwindCSS v4                                           |
| **Port**              | 3055                                                     |
| **Build**             | `next build --webpack`                                   |
| **Output**            | ❌ Hardcoded `output: "standalone"`                      |
| **@bytelyst/\* deps** | 14 packages — **1 via `file:` ref** (`ui`), 13 via Gitea |
| **Special**           | `outputFileTracingRoot` set to parent dir                |
| **Env vars**          | NEXT_PUBLIC_PLATFORM_URL, NEXT_PUBLIC_BACKEND_URL        |
| **Dockerfile**        | ✅ Yes                                                   |
| **Vercel status**     | 🔴 Blocked — `file:` ref; hardcoded standalone output    |

### 7. FlowMonk Web (`@flowmonk/web`)

| Field                 | Value                                                  |
| --------------------- | ------------------------------------------------------ |
| **Repo**              | `learning_ai_flowmonk`                                 |
| **Path**              | `web/`                                                 |
| **Framework**         | Next.js 16.1.6, React 19.2.3                           |
| **Styling**           | No TailwindCSS (minimal CSS)                           |
| **Port**              | 3040                                                   |
| **Build**             | `next build --webpack`                                 |
| **Output**            | Vercel-aware                                           |
| **@bytelyst/\* deps** | 6 packages — **1 via `file:` ref** (`ui`), 5 via Gitea |
| **Special**           | `typedRoutes: true`, `outputFileTracingRoot` set       |
| **Env vars**          | NEXT_PUBLIC_BACKEND_URL                                |
| **Dockerfile**        | ✅ Yes                                                 |
| **Vercel status**     | 🔴 Blocked — `file:` ref for @bytelyst/ui              |

### 8. NoteLett Web (`@notelett/web`)

| Field                 | Value                                                   |
| --------------------- | ------------------------------------------------------- |
| **Repo**              | `learning_ai_notes`                                     |
| **Path**              | `web/`                                                  |
| **Framework**         | Next.js 16.1.6, React 19.2.0                            |
| **Styling**           | TailwindCSS v4                                          |
| **Port**              | 3045                                                    |
| **Build**             | `next build --webpack`                                  |
| **Output**            | ❌ Hardcoded `output: "standalone"`                     |
| **@bytelyst/\* deps** | 10 packages — **1 via `file:` ref** (`ui`), 9 via Gitea |
| **Special**           | `outputFileTracingRoot` set to parent dir               |
| **Env vars**          | NEXT_PUBLIC_PLATFORM_URL, NEXT_PUBLIC_BACKEND_URL       |
| **Dockerfile**        | ✅ Yes                                                  |
| **Vercel status**     | 🔴 Blocked — `file:` ref; hardcoded standalone output   |

### 9. ActionTrail Web (`@actiontrail/web`)

| Field                 | Value                                                     |
| --------------------- | --------------------------------------------------------- |
| **Repo**              | `learning_ai_trails`                                      |
| **Path**              | `web/`                                                    |
| **Framework**         | Next.js 16.1.6, React 19.2.3                              |
| **Styling**           | No TailwindCSS (minimal CSS)                              |
| **Port**              | 3060                                                      |
| **Build**             | `next build --webpack`                                    |
| **Output**            | ❌ Hardcoded `output: 'standalone'`                       |
| **@bytelyst/\* deps** | 7 packages — all via Gitea registry ✅                    |
| **Env vars**          | NEXT_PUBLIC_BACKEND_URL                                   |
| **Dockerfile**        | ✅ Yes                                                    |
| **Vercel status**     | ⚠️ Partial — hardcoded standalone output; no `file:` refs |

### 10. MindLyst Web (`mindlyst-web`)

| Field                 | Value                                                                                              |
| --------------------- | -------------------------------------------------------------------------------------------------- |
| **Repo**              | `learning_multimodal_memory_agents`                                                                |
| **Path**              | `mindlyst-native/web/`                                                                             |
| **Framework**         | Next.js ^16.0.0, React ^19.0.0                                                                     |
| **Styling**           | Vanilla CSS (globals.css with `--ml-*` custom properties)                                          |
| **Port**              | 3050                                                                                               |
| **Build**             | `next build` (no `--webpack` flag)                                                                 |
| **Output**            | Vercel-aware                                                                                       |
| **@bytelyst/\* deps** | 10 packages — all via Gitea registry ✅                                                            |
| **Server-side**       | Azure Cosmos DB (direct `@azure/cosmos`)                                                           |
| **Special**           | Nested path (`mindlyst-native/web/`); uses `tsconfig.build.json`                                   |
| **Env vars**          | COSMOS_ENDPOINT, COSMOS_KEY, MINDLYST_USER_ID, SEED_SECRET, OPENAI_API_KEY, EXTRACTION_SERVICE_URL |
| **Dockerfile**        | ✅ Yes                                                                                             |
| **Vercel status**     | ⚠️ Partial — needs Vercel root directory config for nested path; many server-side env vars         |

### 11. LocalMemGPT Web (`@localmemgpt/web`)

| Field                 | Value                                                                                  |
| --------------------- | -------------------------------------------------------------------------------------- |
| **Repo**              | `learning_ai_local_memory_gpt`                                                         |
| **Path**              | `web/`                                                                                 |
| **Framework**         | Next.js 16.1.6, React 19.2.3                                                           |
| **Styling**           | TailwindCSS v4                                                                         |
| **Port**              | 3070                                                                                   |
| **Build**             | `next build --webpack`                                                                 |
| **Output**            | ❌ Hardcoded `output: 'standalone'`                                                    |
| **@bytelyst/\* deps** | 7 packages — **1 via `file:` ref** (`ui`), 6 via Gitea                                 |
| **Env vars**          | NEXT_PUBLIC_BACKEND_URL                                                                |
| **Dockerfile**        | ✅ Yes                                                                                 |
| **Vercel status**     | 🔴 Blocked — `file:` ref; hardcoded standalone; web is a thin client for local backend |

### 12. LLM Lab Dashboard

| Field                 | Value                                                                     |
| --------------------- | ------------------------------------------------------------------------- |
| **Repo**              | `learning_ai_local_llms`                                                  |
| **Path**              | `dashboard/`                                                              |
| **Framework**         | Next.js 16.1.6, React 19.2.3                                              |
| **Styling**           | TailwindCSS v4                                                            |
| **Port**              | 3000                                                                      |
| **Build**             | `next build`                                                              |
| **Output**            | ❌ Hardcoded `output: 'standalone'`                                       |
| **@bytelyst/\* deps** | 3 packages — **2 via `file:` refs** (`design-tokens`, `ui`), 1 via Gitea  |
| **Special**           | API routes proxy to local Ollama — **cannot run on Vercel**               |
| **Env vars**          | OLLAMA_HOST, NEXT_PUBLIC_LOCALMEMGPT_URL                                  |
| **Dockerfile**        | ✅ Yes (docker-compose.yml)                                               |
| **Vercel status**     | 🔴 Not viable — requires local Ollama instance; API routes are proxy-only |

### 13. EffoRise Client

| Field                 | Value                                                                                                |
| --------------------- | ---------------------------------------------------------------------------------------------------- |
| **Repo**              | `learning_ai_efforise`                                                                               |
| **Path**              | `/` (root `vite.config.ts`, client source in `client/`)                                              |
| **Framework**         | Vite 7.1.7, React 19.2.1                                                                             |
| **Styling**           | TailwindCSS v4, shadcn/ui                                                                            |
| **Port**              | 3000 (Vite dev) / 4020 (backend API)                                                                 |
| **Build**             | `vite build` → `dist/public/`                                                                        |
| **@bytelyst/\* deps** | 8 packages via Gitea registry ✅                                                                     |
| **Special**           | SPA with API proxy (`/api` → localhost:4020); `wouter` for routing                                   |
| **Env vars**          | (client-side only via Vite env)                                                                      |
| **Dockerfile**        | ✅ Yes                                                                                               |
| **Vercel status**     | ⚠️ Partial — Vite SPA needs rewrites config for client-side routing; API proxy needs Vercel rewrites |

### 14. Productivity Web

| Field                 | Value                                           |
| --------------------- | ----------------------------------------------- |
| **Repo**              | `learning_ai_productivity_web`                  |
| **Path**              | `/` (root)                                      |
| **Framework**         | Next.js 15.1.7, React ^19.0.0                   |
| **Styling**           | TailwindCSS v3                                  |
| **Port**              | 3000                                            |
| **Build**             | `next build`                                    |
| **Output**            | Default (no standalone)                         |
| **@bytelyst/\* deps** | None                                            |
| **Env vars**          | None                                            |
| **Dockerfile**        | ✅ Yes                                          |
| **Vercel status**     | ✅ Ready — zero external deps, standard Next.js |

---

## Prerequisite: Gitea NPM Registry via HTTPS on Azure VM

All 12 product web apps (everything except admin-web and tracker-web which use `workspace:*`) pull `@bytelyst/*` packages from the Gitea npm registry. Currently Gitea runs at `http://localhost:3300` on the Azure VM, which Vercel can't reach during builds.

### Solution: Expose Gitea via Caddy reverse proxy

The Azure VM deployment will use **Caddy** as the HTTPS gateway (see [`SECURE_API_EXPOSURE.md`](../single_azure_vm/docker/SECURE_API_EXPOSURE.md) for the full decision). Caddy provides automatic Let's Encrypt TLS and simple path/subdomain routing.

**Gitea needs its own subdomain** because the npm registry API (`/api/packages/.../npm/`) expects to be at root:

```
https://gitea.bytelyst.com  →  gitea:3300  (Caddy reverse proxy, auto-TLS)
https://api.bytelyst.com/*  →  backend services (path-based routing)
```

### Concrete steps to unblock all 12 apps

1. **DNS:** Add `A` records for `api.bytelyst.com` and `gitea.bytelyst.com` pointing to the Azure VM IP
2. **Caddy:** Add `gitea.bytelyst.com { reverse_proxy gitea:3300 }` to the Caddyfile
3. **`.npmrc`** in each repo:
   ```
   @bytelyst:registry=https://gitea.bytelyst.com/api/packages/ByteLyst/npm/
   //gitea.bytelyst.com/api/packages/ByteLyst/npm/:_authToken=${GITEA_NPM_TOKEN}
   ```
4. **Vercel:** Set `GITEA_NPM_TOKEN` as an environment variable per project
5. All 49 `@bytelyst/*` packages are already published — no re-publishing needed

**This is the single highest-leverage fix in the ecosystem.** Once done, the per-app registry access gap disappears from every roadmap.

### Backend API URLs for Vercel apps

Apps that call backend APIs at runtime (not just at build time) will also benefit from the Caddy gateway. Instead of hardcoding `http://<vm-ip>:<port>`, apps will use:

| Env Var                   | Value                                 |
| ------------------------- | ------------------------------------- |
| `PLATFORM_SERVICE_URL`    | `https://api.bytelyst.com/platform`   |
| `EXTRACTION_SERVICE_URL`  | `https://api.bytelyst.com/extraction` |
| `NEXT_PUBLIC_BACKEND_URL` | `https://api.bytelyst.com/<product>`  |

See [`DEPLOYMENT_STATUS_2026-03-29.md`](../single_azure_vm/docker/DEPLOYMENT_STATUS_2026-03-29.md) for current VM status and verified healthy backends.

---

## Deployment Architecture on Vercel

This section only covers **public-facing portal web surfaces** that are valid Vercel candidates.
Internal dashboards and internal portals should remain on the Azure VM.

### Recommended Vercel project structure:

```
Vercel Organization: ByteLyst
├── lysnrai-portal          ← user-dashboard-web
├── chronomind-web          ← learning_ai_clock/web
├── jarvisjr-web            ← learning_ai_jarvis_jr/web
├── nomgap-web              ← learning_ai_fastgap/web
├── flowmonk-web            ← learning_ai_flowmonk/web
├── notelett-web             ← learning_ai_notes/web
├── actiontrail-web         ← learning_ai_trails/web
├── mindlyst-web            ← learning_multimodal_memory_agents/mindlyst-native/web
├── localmemgpt-web         ← learning_ai_local_memory_gpt/web
├── efforise-client         ← learning_ai_efforise (Vite SPA)
├── productivity-tools      ← learning_ai_productivity_web
└── (skip) llm-lab-dashboard ← NOT viable on Vercel (needs local Ollama)
```

### Internal dashboards not targeted for Vercel

- `admin-web` stays on the Azure VM as an internal ops/admin surface
- `tracker-web` stays on the Azure VM as an internal tracker surface
- both should be fronted by the VM ingress and internal access controls, not Vercel hosting

### Product web apps (all others)

- Each gets its own Vercel project connected to its repo
- Root directory set to `web/` (or `/` for EffoRise, `mindlyst-native/web/` for MindLyst)
- Gitea npm registry configured via `.npmrc` pointing to Azure VM Gitea + `GITEA_NPM_TOKEN` env var

---

## Per-App Roadmap Documents

Each app has a dedicated roadmap in this folder:

| App                      | Roadmap File                                                   |
| ------------------------ | -------------------------------------------------------------- |
| User Dashboard (LysnrAI) | [`ROADMAP_USER_DASHBOARD.md`](./ROADMAP_USER_DASHBOARD.md)     |
| ChronoMind Web           | [`ROADMAP_CHRONOMIND_WEB.md`](./ROADMAP_CHRONOMIND_WEB.md)     |
| JarvisJr Web             | [`ROADMAP_JARVISJR_WEB.md`](./ROADMAP_JARVISJR_WEB.md)         |
| NomGap Web               | [`ROADMAP_NOMGAP_WEB.md`](./ROADMAP_NOMGAP_WEB.md)             |
| FlowMonk Web             | [`ROADMAP_FLOWMONK_WEB.md`](./ROADMAP_FLOWMONK_WEB.md)         |
| NoteLett Web             | [`ROADMAP_NOTELETT_WEB.md`](./ROADMAP_NOTELETT_WEB.md)         |
| ActionTrail Web          | [`ROADMAP_ACTIONTRAIL_WEB.md`](./ROADMAP_ACTIONTRAIL_WEB.md)   |
| MindLyst Web             | [`ROADMAP_MINDLYST_WEB.md`](./ROADMAP_MINDLYST_WEB.md)         |
| LocalMemGPT Web          | [`ROADMAP_LOCALMEMGPT_WEB.md`](./ROADMAP_LOCALMEMGPT_WEB.md)   |
| LLM Lab Dashboard        | [`ROADMAP_LLM_LAB.md`](./ROADMAP_LLM_LAB.md)                   |
| EffoRise Client          | [`ROADMAP_EFFORISE.md`](./ROADMAP_EFFORISE.md)                 |
| Productivity Web         | [`ROADMAP_PRODUCTIVITY_WEB.md`](./ROADMAP_PRODUCTIVITY_WEB.md) |
