Vectrum
Sign In

Split into a monorepo with the web and Android apps

Bun workspaces with one app per folder: the Next.js forge in apps/web and the Android app in
apps/mobile (a Gradle project; its package.json only wraps ./gradlew). The root package.json
runs either app's scripts (bun dev, bun run build/lint/test, bun run mobile:build/deploy).

The web app now runs from apps/web, so data/ and bin/ live there too. The Dockerfiles moved
into apps/web and still build from the repository root, for the workspace's lockfile.
@types/mdast is declared now that dependencies aren't hoisted.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
JjohannSocommitted 1 parent 5d8c9efcommit6ff391e

Showing 375 changed files with 207 additions and 99 deletions.

+10−8.dockerignoreView File
@@ -1,12 +1,14 @@
11 .git
2- .next
3- node_modules
4- bin
5- data
2+ **/node_modules
3+ **/.next
4+ **/*.tsbuildinfo
5+ **/next-env.d.ts
66 .env*
7- *.tsbuildinfo
8- next-env.d.ts
9- Dockerfile
7+ apps/web/bin
8+ apps/web/data
9+ apps/web/Dockerfile*
10+ # Only the Android app's package.json, which the workspace's lockfile lists.
11+ apps/mobile
12+ !apps/mobile/package.json
1013 docker-compose.yml
1114 .dockerignore
12- mobile
+6−24.gitignoreView File
@@ -1,8 +1,9 @@
11 # See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
2+ # Each app in apps/ has its own .gitignore for what it builds.
23
34 # dependencies
4- /node_modules
5- /.pnp
5+ node_modules/
6+ .pnp
67 .pnp.*
78 .yarn/*
89 !.yarn/patches
@@ -10,16 +11,6 @@
1011 !.yarn/releases
1112 !.yarn/versions
1213
13- # testing
14- /coverage
15-
16- # next.js
17- /.next/
18- /out/
19-
20- # production
21- /build
22-
2314 # misc
2415 .DS_Store
2516 *.pem
@@ -33,15 +24,6 @@ yarn-error.log*
3324 # env files (can opt-in for committing if needed)
3425 .env*
3526
36- # vercel
37- .vercel
38-
39- # typescript
40- *.tsbuildinfo
41- next-env.d.ts
42-
43- # git repositories and issue data
44- /data/
45-
46- # the PocketBase server binary (scripts/install-pocketbase.mjs)
47- /bin/
27+ # editors
28+ .idea/
29+ *.iml
+8−6AGENTS.mdView File
@@ -1,9 +1,11 @@
1- <!-- BEGIN:nextjs-agent-rules -->
1+ # Vectrum monorepo
22
3- # This is NOT the Next.js you know
3+ Bun workspaces, one app per folder in `apps/`:
44
5- This version has breaking changes — APIs, conventions, and file structure may all differ from your training data. Read the relevant guide in `node_modules/next/dist/docs/` (resolved from this file's directory; in monorepos the `next` package may not be visible from the repo root) before writing any code. Heed deprecation notices.
5+ - `apps/web`: the forge itself, a Next.js app (website, git over SSH and HTTPS, MCP, the `/api/v1` JSON API, runners'
6+ API). Read `apps/web/AGENTS.md` before changing it.
7+ - `apps/mobile`: the Android app, in Kotlin with Jetpack Compose, built with Gradle (`apps/mobile/gradlew`). It only
8+ talks to the web app over `/api/v1` (`apps/web/lib/app-api.ts`); keep both sides in step when changing that API.
69
7- This block is written and re-added by `next dev` — verify at `node_modules/next/dist/server/lib/generate-agent-files.js`. Removing it from a diff only re-creates the uncommitted change; committing it with your work keeps the tree clean.
8-
9- <!-- END:nextjs-agent-rules -->
10+ Run commands from the repository root (`bun dev`, `bun run lint`, `bun run test`, `bun run mobile:build`), or inside an
11+ app's folder. Product documentation is in `docs/`.
+14−1README.mdView File
@@ -12,6 +12,11 @@ registry, CI on self-hosted runners, and an Android app. See [all features](docs
1212
1313 Website: [vectrum.cc](https://vectrum.cc)
1414
15+ This repository holds both apps, as Bun workspaces:
16+
17+ - [`apps/web`](apps/web): the forge, a Next.js app
18+ - [`apps/mobile`](apps/mobile): the Android app, in Kotlin with Jetpack Compose
19+
1520 ## Getting started
1621
1722 Requires Node.js 22+ and `git`.
@@ -23,6 +28,13 @@ bun dev
2328
2429 Open http://localhost:3000, sign up, and create a repository.
2530
31+ To build the Android app (needs JDK 17+ and the Android SDK, see [mobile.md](docs/mobile.md)):
32+
33+ ```bash
34+ bun run mobile:build # apps/mobile/app/build/outputs/apk/debug/app-debug.apk
35+ bun run mobile:deploy # onto a connected device or emulator
36+ ```
37+
2638 To run it with Docker:
2739
2840 ```bash
@@ -41,4 +53,5 @@ docker compose up -d --build
4153
4254 ## Contributing
4355
44- Run `bun run lint` and `bun test` before opening a pull request.
56+ Run `bun run lint` and `bun run test` before opening a pull request, and `bun run mobile:build` if you changed the
57+ Android app or the API it uses (`apps/web/lib/app-api.ts`).
+0−0mobile/.gitignore → apps/mobile/.gitignorerenamedView File

File mode or name changed only.

+0−0mobile/app/build.gradle.kts → apps/mobile/app/build.gradle.ktsrenamedView File

File mode or name changed only.

+0−0mobile/app/proguard-rules.pro → apps/mobile/app/proguard-rules.prorenamedView File

File mode or name changed only.

+0−0mobile/app/src/main/AndroidManifest.xml → apps/mobile/app/src/main/AndroidManifest.xmlrenamedView File

File mode or name changed only.

+0−0mobile/app/src/main/java/cc/vectrum/app/MainActivity.kt → apps/mobile/app/src/main/java/cc/vectrum/app/MainActivity.ktrenamedView File

File mode or name changed only.

+0−0mobile/app/src/main/java/cc/vectrum/app/VectrumApp.kt → apps/mobile/app/src/main/java/cc/vectrum/app/VectrumApp.ktrenamedView File

File mode or name changed only.

+0−0mobile/app/src/main/java/cc/vectrum/app/data/Api.kt → apps/mobile/app/src/main/java/cc/vectrum/app/data/Api.ktrenamedView File

File mode or name changed only.

+0−0mobile/app/src/main/java/cc/vectrum/app/data/Models.kt → apps/mobile/app/src/main/java/cc/vectrum/app/data/Models.ktrenamedView File

File mode or name changed only.

+0−0mobile/app/src/main/java/cc/vectrum/app/data/ServerProbe.kt → apps/mobile/app/src/main/java/cc/vectrum/app/data/ServerProbe.ktrenamedView File

File mode or name changed only.

+0−0mobile/app/src/main/java/cc/vectrum/app/data/Session.kt → apps/mobile/app/src/main/java/cc/vectrum/app/data/Session.ktrenamedView File

File mode or name changed only.

+0−0mobile/app/src/main/java/cc/vectrum/app/ui/App.kt → apps/mobile/app/src/main/java/cc/vectrum/app/ui/App.ktrenamedView File

File mode or name changed only.

+0−0mobile/app/src/main/java/cc/vectrum/app/ui/Format.kt → apps/mobile/app/src/main/java/cc/vectrum/app/ui/Format.ktrenamedView File

File mode or name changed only.

+0−0mobile/app/src/main/java/cc/vectrum/app/ui/Loader.kt → apps/mobile/app/src/main/java/cc/vectrum/app/ui/Loader.ktrenamedView File

File mode or name changed only.

+0−0mobile/app/src/main/java/cc/vectrum/app/ui/components/Code.kt → apps/mobile/app/src/main/java/cc/vectrum/app/ui/components/Code.ktrenamedView File

File mode or name changed only.

+0−0mobile/app/src/main/java/cc/vectrum/app/ui/components/Controls.kt → apps/mobile/app/src/main/java/cc/vectrum/app/ui/components/Controls.ktrenamedView File

File mode or name changed only.

+0−0mobile/app/src/main/java/cc/vectrum/app/ui/components/Core.kt → apps/mobile/app/src/main/java/cc/vectrum/app/ui/components/Core.ktrenamedView File

File mode or name changed only.

+0−0mobile/app/src/main/java/cc/vectrum/app/ui/components/Diff.kt → apps/mobile/app/src/main/java/cc/vectrum/app/ui/components/Diff.ktrenamedView File

File mode or name changed only.

+0−0mobile/app/src/main/java/cc/vectrum/app/ui/components/Fields.kt → apps/mobile/app/src/main/java/cc/vectrum/app/ui/components/Fields.ktrenamedView File

File mode or name changed only.

+0−0mobile/app/src/main/java/cc/vectrum/app/ui/components/Glyphs.kt → apps/mobile/app/src/main/java/cc/vectrum/app/ui/components/Glyphs.ktrenamedView File

File mode or name changed only.

+0−0mobile/app/src/main/java/cc/vectrum/app/ui/components/Markdown.kt → apps/mobile/app/src/main/java/cc/vectrum/app/ui/components/Markdown.ktrenamedView File

File mode or name changed only.

+0−0mobile/app/src/main/java/cc/vectrum/app/ui/components/Screen.kt → apps/mobile/app/src/main/java/cc/vectrum/app/ui/components/Screen.ktrenamedView File

File mode or name changed only.

+0−0mobile/app/src/main/java/cc/vectrum/app/ui/components/Sheets.kt → apps/mobile/app/src/main/java/cc/vectrum/app/ui/components/Sheets.ktrenamedView File

File mode or name changed only.

+0−0mobile/app/src/main/java/cc/vectrum/app/ui/components/Toast.kt → apps/mobile/app/src/main/java/cc/vectrum/app/ui/components/Toast.ktrenamedView File

File mode or name changed only.

+0−0mobile/app/src/main/java/cc/vectrum/app/ui/icons/Icons.kt → apps/mobile/app/src/main/java/cc/vectrum/app/ui/icons/Icons.ktrenamedView File

File mode or name changed only.

+0−0mobile/app/src/main/java/cc/vectrum/app/ui/screens/CodeScreens.kt → apps/mobile/app/src/main/java/cc/vectrum/app/ui/screens/CodeScreens.ktrenamedView File

File mode or name changed only.

+0−0mobile/app/src/main/java/cc/vectrum/app/ui/screens/ExploreScreen.kt → apps/mobile/app/src/main/java/cc/vectrum/app/ui/screens/ExploreScreen.ktrenamedView File

File mode or name changed only.

+0−0mobile/app/src/main/java/cc/vectrum/app/ui/screens/HomeScreen.kt → apps/mobile/app/src/main/java/cc/vectrum/app/ui/screens/HomeScreen.ktrenamedView File

File mode or name changed only.

+0−0mobile/app/src/main/java/cc/vectrum/app/ui/screens/IssueScreens.kt → apps/mobile/app/src/main/java/cc/vectrum/app/ui/screens/IssueScreens.ktrenamedView File

File mode or name changed only.

+0−0mobile/app/src/main/java/cc/vectrum/app/ui/screens/ProfileScreens.kt → apps/mobile/app/src/main/java/cc/vectrum/app/ui/screens/ProfileScreens.ktrenamedView File

File mode or name changed only.

+0−0mobile/app/src/main/java/cc/vectrum/app/ui/screens/PullScreen.kt → apps/mobile/app/src/main/java/cc/vectrum/app/ui/screens/PullScreen.ktrenamedView File

File mode or name changed only.

+0−0mobile/app/src/main/java/cc/vectrum/app/ui/screens/RepoScreen.kt → apps/mobile/app/src/main/java/cc/vectrum/app/ui/screens/RepoScreen.ktrenamedView File

File mode or name changed only.

+0−0mobile/app/src/main/java/cc/vectrum/app/ui/screens/RepoTabs.kt → apps/mobile/app/src/main/java/cc/vectrum/app/ui/screens/RepoTabs.ktrenamedView File

File mode or name changed only.

+0−0mobile/app/src/main/java/cc/vectrum/app/ui/screens/Rows.kt → apps/mobile/app/src/main/java/cc/vectrum/app/ui/screens/Rows.ktrenamedView File

File mode or name changed only.

+0−0mobile/app/src/main/java/cc/vectrum/app/ui/screens/RunScreen.kt → apps/mobile/app/src/main/java/cc/vectrum/app/ui/screens/RunScreen.ktrenamedView File

File mode or name changed only.

+0−0mobile/app/src/main/java/cc/vectrum/app/ui/screens/SetupScreen.kt → apps/mobile/app/src/main/java/cc/vectrum/app/ui/screens/SetupScreen.ktrenamedView File

File mode or name changed only.

+0−0mobile/app/src/main/java/cc/vectrum/app/ui/theme/Materials.kt → apps/mobile/app/src/main/java/cc/vectrum/app/ui/theme/Materials.ktrenamedView File

File mode or name changed only.

+0−0mobile/app/src/main/java/cc/vectrum/app/ui/theme/Palette.kt → apps/mobile/app/src/main/java/cc/vectrum/app/ui/theme/Palette.ktrenamedView File

File mode or name changed only.

+0−0mobile/app/src/main/java/cc/vectrum/app/ui/theme/Theme.kt → apps/mobile/app/src/main/java/cc/vectrum/app/ui/theme/Theme.ktrenamedView File

File mode or name changed only.

+0−0mobile/app/src/main/java/cc/vectrum/app/ui/theme/Type.kt → apps/mobile/app/src/main/java/cc/vectrum/app/ui/theme/Type.ktrenamedView File

File mode or name changed only.

+0−0mobile/app/src/main/res/drawable/ic_launcher_background.xml → apps/mobile/app/src/main/res/drawable/ic_launcher_background.xmlrenamedView File

File mode or name changed only.

+0−0mobile/app/src/main/res/drawable/ic_launcher_foreground.xml → apps/mobile/app/src/main/res/drawable/ic_launcher_foreground.xmlrenamedView File

File mode or name changed only.

+0−0mobile/app/src/main/res/drawable/ic_launcher_monochrome.xml → apps/mobile/app/src/main/res/drawable/ic_launcher_monochrome.xmlrenamedView File

File mode or name changed only.

+0−0mobile/app/src/main/res/drawable/ic_splash.xml → apps/mobile/app/src/main/res/drawable/ic_splash.xmlrenamedView File

File mode or name changed only.

+0−0mobile/app/src/main/res/font/geist_bold.ttf → apps/mobile/app/src/main/res/font/geist_bold.ttfrenamedView File

File mode or name changed only.

+0−0mobile/app/src/main/res/font/geist_medium.ttf → apps/mobile/app/src/main/res/font/geist_medium.ttfrenamedView File

File mode or name changed only.

+0−0mobile/app/src/main/res/font/geist_mono_medium.ttf → apps/mobile/app/src/main/res/font/geist_mono_medium.ttfrenamedView File

File mode or name changed only.

+0−0mobile/app/src/main/res/font/geist_mono_regular.ttf → apps/mobile/app/src/main/res/font/geist_mono_regular.ttfrenamedView File

File mode or name changed only.

+0−0mobile/app/src/main/res/font/geist_mono_semibold.ttf → apps/mobile/app/src/main/res/font/geist_mono_semibold.ttfrenamedView File

File mode or name changed only.

+0−0mobile/app/src/main/res/font/geist_regular.ttf → apps/mobile/app/src/main/res/font/geist_regular.ttfrenamedView File

File mode or name changed only.

+0−0mobile/app/src/main/res/font/geist_semibold.ttf → apps/mobile/app/src/main/res/font/geist_semibold.ttfrenamedView File

File mode or name changed only.

+0−0mobile/app/src/main/res/mipmap-anydpi/ic_launcher.xml → apps/mobile/app/src/main/res/mipmap-anydpi/ic_launcher.xmlrenamedView File

File mode or name changed only.

+0−0mobile/app/src/main/res/values-night/colors.xml → apps/mobile/app/src/main/res/values-night/colors.xmlrenamedView File

File mode or name changed only.

+0−0mobile/app/src/main/res/values-night/themes.xml → apps/mobile/app/src/main/res/values-night/themes.xmlrenamedView File

File mode or name changed only.

+0−0mobile/app/src/main/res/values/colors.xml → apps/mobile/app/src/main/res/values/colors.xmlrenamedView File

File mode or name changed only.

+0−0mobile/app/src/main/res/values/strings.xml → apps/mobile/app/src/main/res/values/strings.xmlrenamedView File

File mode or name changed only.

+0−0mobile/app/src/main/res/values/themes.xml → apps/mobile/app/src/main/res/values/themes.xmlrenamedView File

File mode or name changed only.

+0−0mobile/app/src/main/res/xml/network_security_config.xml → apps/mobile/app/src/main/res/xml/network_security_config.xmlrenamedView File

File mode or name changed only.

+0−0mobile/build.gradle.kts → apps/mobile/build.gradle.ktsrenamedView File

File mode or name changed only.

+0−0mobile/gradle.properties → apps/mobile/gradle.propertiesrenamedView File

File mode or name changed only.

+0−0mobile/gradle/libs.versions.toml → apps/mobile/gradle/libs.versions.tomlrenamedView File

File mode or name changed only.

+0−0mobile/gradle/wrapper/gradle-wrapper.jar → apps/mobile/gradle/wrapper/gradle-wrapper.jarrenamedView File

File mode or name changed only.

+0−0mobile/gradle/wrapper/gradle-wrapper.properties → apps/mobile/gradle/wrapper/gradle-wrapper.propertiesrenamedView File

File mode or name changed only.

+0−0mobile/gradlew → apps/mobile/gradlewrenamedView File

File mode or name changed only.

+0−0mobile/gradlew.bat → apps/mobile/gradlew.batrenamedView File

File mode or name changed only.

+13−0apps/mobile/package.jsonaddedView File
@@ -0,0 +1,13 @@
1+ {
2+ "name": "@vectrum/mobile",
3+ "version": "0.1.0",
4+ "private": true,
5+ "description": "Vectrum for Android (Kotlin, Jetpack Compose). Built with Gradle; these scripts only wrap ./gradlew.",
6+ "scripts": {
7+ "build": "./gradlew assembleDebug",
8+ "build:release": "./gradlew assembleRelease",
9+ "deploy": "./gradlew installDebug",
10+ "lint": "./gradlew lintDebug",
11+ "clean": "./gradlew clean"
12+ }
13+ }
+0−0mobile/settings.gradle.kts → apps/mobile/settings.gradle.ktsrenamedView File

File mode or name changed only.

+0−0mobile/third_party/Geist-OFL.txt → apps/mobile/third_party/Geist-OFL.txtrenamedView File

File mode or name changed only.

+22−0apps/web/.gitignoreaddedView File
@@ -0,0 +1,22 @@
1+ # testing
2+ /coverage
3+
4+ # next.js
5+ /.next/
6+ /out/
7+
8+ # production
9+ /build
10+
11+ # vercel
12+ .vercel
13+
14+ # typescript
15+ *.tsbuildinfo
16+ next-env.d.ts
17+
18+ # git repositories and issue data
19+ /data/
20+
21+ # the PocketBase server binary (scripts/install-pocketbase.mjs)
22+ /bin/
+9−0apps/web/AGENTS.mdaddedView File
@@ -0,0 +1,9 @@
1+ <!-- BEGIN:nextjs-agent-rules -->
2+
3+ # This is NOT the Next.js you know
4+
5+ This version has breaking changes — APIs, conventions, and file structure may all differ from your training data. Read the relevant guide in `node_modules/next/dist/docs/` (resolved from this file's directory; in monorepos the `next` package may not be visible from the repo root) before writing any code. Heed deprecation notices.
6+
7+ This block is written and re-added by `next dev` — verify at `node_modules/next/dist/server/lib/generate-agent-files.js`. Removing it from a diff only re-creates the uncommitted change; committing it with your work keeps the tree clean.
8+
9+ <!-- END:nextjs-agent-rules -->
+1−0apps/web/CLAUDE.mdaddedView File
@@ -0,0 +1 @@
1+ @AGENTS.md
+17−9Dockerfile → apps/web/DockerfilerenamedView File
@@ -1,15 +1,21 @@
1- # ---- build: install dependencies (which also downloads PocketBase into bin/) and build Next.js
1+ # The web app's image. Build it from the repository root, which holds the workspace's lockfile:
2+ #
3+ # docker build -f apps/web/Dockerfile -t vectrum .
4+ #
5+ # ---- build: install dependencies (which also downloads PocketBase into apps/web/bin/) and build Next.js
26 FROM node:24-bookworm-slim AS build
37 WORKDIR /app
48 COPY --from=oven/bun:1.4.2 /usr/local/bin/bun /usr/local/bin/bun
59 RUN apt-get update && apt-get install -y --no-install-recommends ca-certificates unzip && rm -rf /var/lib/apt/lists/*
610
711 COPY package.json bun.lock ./
8- COPY scripts ./scripts
912 COPY patches ./patches
13+ COPY apps/mobile/package.json ./apps/mobile/
14+ COPY apps/web/package.json ./apps/web/
15+ COPY apps/web/scripts ./apps/web/scripts
1016 RUN bun install --frozen-lockfile
1117
12- COPY . .
18+ COPY apps/web ./apps/web
1319 ENV NEXT_TELEMETRY_DISABLED=1 NEXT_OUTPUT=standalone
1420 RUN bun run build
1521
@@ -18,12 +24,14 @@ FROM node:24-bookworm-slim
1824 RUN apt-get update && apt-get install -y --no-install-recommends git tini ca-certificates && rm -rf /var/lib/apt/lists/*
1925 WORKDIR /app
2026
21- COPY --from=build --chown=node:node /app/.next/standalone ./
22- COPY --from=build --chown=node:node /app/.next/static ./.next/static
23- COPY --from=build --chown=node:node /app/public ./public
24- COPY --from=build --chown=node:node /app/pb_migrations ./pb_migrations
25- COPY --from=build --chown=node:node /app/bin ./bin
26- COPY --from=build --chown=node:node /app/scripts/create-user.mjs ./scripts/
27+ # The standalone output mirrors the workspace: the server is apps/web/server.js, next to a trimmed node_modules/.
28+ COPY --from=build --chown=node:node /app/apps/web/.next/standalone ./
29+ WORKDIR /app/apps/web
30+ COPY --from=build --chown=node:node /app/apps/web/.next/static ./.next/static
31+ COPY --from=build --chown=node:node /app/apps/web/public ./public
32+ COPY --from=build --chown=node:node /app/apps/web/pb_migrations ./pb_migrations
33+ COPY --from=build --chown=node:node /app/apps/web/bin ./bin
34+ COPY --from=build --chown=node:node /app/apps/web/scripts/create-user.mjs ./scripts/
2735
2836 RUN mkdir /data && chown node:node /data
2937 VOLUME /data
+2−2Dockerfile.runner → apps/web/Dockerfile.runnerrenamedView File
@@ -1,6 +1,6 @@
11 # A Vectrum runner in a container: Node.js, Bun, git and the usual build tools.
22 #
3- # docker build -f Dockerfile.runner -t vectrum-runner .
3+ # docker build -f apps/web/Dockerfile.runner -t vectrum-runner . (from the repository root)
44 # docker run -d -e VECTRUM_URL=https://vectrum.example -e VECTRUM_RUNNER_TOKEN=vrn_… vectrum-runner
55 #
66 # Steps run as the unprivileged node user, inside this container only (no Docker socket).
@@ -10,7 +10,7 @@ RUN ln -s /usr/local/bin/bun /usr/local/bin/bunx \
1010 && apt-get update && apt-get install -y --no-install-recommends tini && rm -rf /var/lib/apt/lists/*
1111
1212 WORKDIR /runner
13- COPY --chown=node:node public/vectrum-runner.mjs ./
13+ COPY --chown=node:node apps/web/public/vectrum-runner.mjs ./
1414 RUN mkdir _work && chown node:node _work
1515 USER node
1616
+0−0app/.well-known/oauth-authorization-server/route.ts → apps/web/app/.well-known/oauth-authorization-server/route.tsrenamedView File

File mode or name changed only.

+0−0app/.well-known/oauth-protected-resource/mcp/route.ts → apps/web/app/.well-known/oauth-protected-resource/mcp/route.tsrenamedView File

File mode or name changed only.

+0−0app/.well-known/oauth-protected-resource/route.ts → apps/web/app/.well-known/oauth-protected-resource/route.tsrenamedView File

File mode or name changed only.

+0−0app/[owner]/[repo]/actions/page.tsx → apps/web/app/[owner]/[repo]/actions/page.tsxrenamedView File

File mode or name changed only.

+0−0app/[owner]/[repo]/actions/runs/[number]/logs/[job]/route.ts → apps/web/app/[owner]/[repo]/actions/runs/[number]/logs/[job]/route.tsrenamedView File

File mode or name changed only.

+0−0app/[owner]/[repo]/actions/runs/[number]/page.tsx → apps/web/app/[owner]/[repo]/actions/runs/[number]/page.tsxrenamedView File

File mode or name changed only.

+0−0app/[owner]/[repo]/archive/[...segments]/route.ts → apps/web/app/[owner]/[repo]/archive/[...segments]/route.tsrenamedView File

File mode or name changed only.

+0−0app/[owner]/[repo]/blob/[...segments]/page.tsx → apps/web/app/[owner]/[repo]/blob/[...segments]/page.tsxrenamedView File

File mode or name changed only.

+0−0app/[owner]/[repo]/branches/page.tsx → apps/web/app/[owner]/[repo]/branches/page.tsxrenamedView File

File mode or name changed only.

+0−0app/[owner]/[repo]/commit/[sha]/page.tsx → apps/web/app/[owner]/[repo]/commit/[sha]/page.tsxrenamedView File

File mode or name changed only.

+0−0app/[owner]/[repo]/commits/[...segments]/page.tsx → apps/web/app/[owner]/[repo]/commits/[...segments]/page.tsxrenamedView File

File mode or name changed only.

+0−0app/[owner]/[repo]/commits/page.tsx → apps/web/app/[owner]/[repo]/commits/page.tsxrenamedView File

File mode or name changed only.

+0−0app/[owner]/[repo]/compare/page.tsx → apps/web/app/[owner]/[repo]/compare/page.tsxrenamedView File

File mode or name changed only.

+0−0app/[owner]/[repo]/delete/[...segments]/page.tsx → apps/web/app/[owner]/[repo]/delete/[...segments]/page.tsxrenamedView File

File mode or name changed only.

+0−0app/[owner]/[repo]/edit/[...segments]/page.tsx → apps/web/app/[owner]/[repo]/edit/[...segments]/page.tsxrenamedView File

File mode or name changed only.

+0−0app/[owner]/[repo]/fork/form.tsx → apps/web/app/[owner]/[repo]/fork/form.tsxrenamedView File

File mode or name changed only.

+0−0app/[owner]/[repo]/fork/page.tsx → apps/web/app/[owner]/[repo]/fork/page.tsxrenamedView File

File mode or name changed only.

+0−0app/[owner]/[repo]/forks/page.tsx → apps/web/app/[owner]/[repo]/forks/page.tsxrenamedView File

File mode or name changed only.

+0−0app/[owner]/[repo]/git-receive-pack/route.ts → apps/web/app/[owner]/[repo]/git-receive-pack/route.tsrenamedView File

File mode or name changed only.

+0−0app/[owner]/[repo]/git-upload-pack/route.ts → apps/web/app/[owner]/[repo]/git-upload-pack/route.tsrenamedView File

File mode or name changed only.

+0−0app/[owner]/[repo]/image/route.ts → apps/web/app/[owner]/[repo]/image/route.tsrenamedView File

File mode or name changed only.

+0−0app/[owner]/[repo]/info/refs/route.ts → apps/web/app/[owner]/[repo]/info/refs/route.tsrenamedView File

File mode or name changed only.

+0−0app/[owner]/[repo]/issues/[number]/page.tsx → apps/web/app/[owner]/[repo]/issues/[number]/page.tsxrenamedView File

File mode or name changed only.

+0−0app/[owner]/[repo]/issues/new/form.tsx → apps/web/app/[owner]/[repo]/issues/new/form.tsxrenamedView File

File mode or name changed only.

+0−0app/[owner]/[repo]/issues/new/page.tsx → apps/web/app/[owner]/[repo]/issues/new/page.tsxrenamedView File

File mode or name changed only.

+0−0app/[owner]/[repo]/issues/page.tsx → apps/web/app/[owner]/[repo]/issues/page.tsxrenamedView File

File mode or name changed only.

+0−0app/[owner]/[repo]/layout.tsx → apps/web/app/[owner]/[repo]/layout.tsxrenamedView File

File mode or name changed only.

+0−0app/[owner]/[repo]/llms.txt/route.ts → apps/web/app/[owner]/[repo]/llms.txt/route.tsrenamedView File

File mode or name changed only.

+0−0app/[owner]/[repo]/new/[...segments]/page.tsx → apps/web/app/[owner]/[repo]/new/[...segments]/page.tsxrenamedView File

File mode or name changed only.

+0−0app/[owner]/[repo]/packages/page.tsx → apps/web/app/[owner]/[repo]/packages/page.tsxrenamedView File

File mode or name changed only.

+0−0app/[owner]/[repo]/page.tsx → apps/web/app/[owner]/[repo]/page.tsxrenamedView File

File mode or name changed only.

+0−0app/[owner]/[repo]/pulls/[number]/commits/page.tsx → apps/web/app/[owner]/[repo]/pulls/[number]/commits/page.tsxrenamedView File

File mode or name changed only.

+0−0app/[owner]/[repo]/pulls/[number]/files/page.tsx → apps/web/app/[owner]/[repo]/pulls/[number]/files/page.tsxrenamedView File

File mode or name changed only.

+0−0app/[owner]/[repo]/pulls/[number]/layout.tsx → apps/web/app/[owner]/[repo]/pulls/[number]/layout.tsxrenamedView File

File mode or name changed only.

+0−0app/[owner]/[repo]/pulls/[number]/page.tsx → apps/web/app/[owner]/[repo]/pulls/[number]/page.tsxrenamedView File

File mode or name changed only.

+0−0app/[owner]/[repo]/pulls/page.tsx → apps/web/app/[owner]/[repo]/pulls/page.tsxrenamedView File

File mode or name changed only.

+0−0app/[owner]/[repo]/raw/[...segments]/route.ts → apps/web/app/[owner]/[repo]/raw/[...segments]/route.tsrenamedView File

File mode or name changed only.

+0−0app/[owner]/[repo]/releases/download/[...segments]/route.ts → apps/web/app/[owner]/[repo]/releases/download/[...segments]/route.tsrenamedView File

File mode or name changed only.

+0−0app/[owner]/[repo]/releases/edit/[...tag]/page.tsx → apps/web/app/[owner]/[repo]/releases/edit/[...tag]/page.tsxrenamedView File

File mode or name changed only.

+0−0app/[owner]/[repo]/releases/latest/download/[name]/route.ts → apps/web/app/[owner]/[repo]/releases/latest/download/[name]/route.tsrenamedView File

File mode or name changed only.

+0−0app/[owner]/[repo]/releases/latest/page.tsx → apps/web/app/[owner]/[repo]/releases/latest/page.tsxrenamedView File

File mode or name changed only.

+0−0app/[owner]/[repo]/releases/new/page.tsx → apps/web/app/[owner]/[repo]/releases/new/page.tsxrenamedView File

File mode or name changed only.

+0−0app/[owner]/[repo]/releases/page.tsx → apps/web/app/[owner]/[repo]/releases/page.tsxrenamedView File

File mode or name changed only.

+0−0app/[owner]/[repo]/releases/tag/[...tag]/page.tsx → apps/web/app/[owner]/[repo]/releases/tag/[...tag]/page.tsxrenamedView File

File mode or name changed only.

+0−0app/[owner]/[repo]/search/page.tsx → apps/web/app/[owner]/[repo]/search/page.tsxrenamedView File

File mode or name changed only.

+0−0app/[owner]/[repo]/settings/access/form.tsx → apps/web/app/[owner]/[repo]/settings/access/form.tsxrenamedView File

File mode or name changed only.

+0−0app/[owner]/[repo]/settings/access/page.tsx → apps/web/app/[owner]/[repo]/settings/access/page.tsxrenamedView File

File mode or name changed only.

+0−0app/[owner]/[repo]/settings/branches/forms.tsx → apps/web/app/[owner]/[repo]/settings/branches/forms.tsxrenamedView File

File mode or name changed only.

+0−0app/[owner]/[repo]/settings/branches/page.tsx → apps/web/app/[owner]/[repo]/settings/branches/page.tsxrenamedView File

File mode or name changed only.

+0−0app/[owner]/[repo]/settings/forms.tsx → apps/web/app/[owner]/[repo]/settings/forms.tsxrenamedView File

File mode or name changed only.

+0−0app/[owner]/[repo]/settings/labels/form.tsx → apps/web/app/[owner]/[repo]/settings/labels/form.tsxrenamedView File

File mode or name changed only.

+0−0app/[owner]/[repo]/settings/labels/page.tsx → apps/web/app/[owner]/[repo]/settings/labels/page.tsxrenamedView File

File mode or name changed only.

+0−0app/[owner]/[repo]/settings/layout.tsx → apps/web/app/[owner]/[repo]/settings/layout.tsxrenamedView File

File mode or name changed only.

+0−0app/[owner]/[repo]/settings/page.tsx → apps/web/app/[owner]/[repo]/settings/page.tsxrenamedView File

File mode or name changed only.

+0−0app/[owner]/[repo]/settings/runners/page.tsx → apps/web/app/[owner]/[repo]/settings/runners/page.tsxrenamedView File

File mode or name changed only.

+0−0app/[owner]/[repo]/settings/webhooks/[id]/page.tsx → apps/web/app/[owner]/[repo]/settings/webhooks/[id]/page.tsxrenamedView File

File mode or name changed only.

+0−0app/[owner]/[repo]/settings/webhooks/forms.tsx → apps/web/app/[owner]/[repo]/settings/webhooks/forms.tsxrenamedView File

File mode or name changed only.

+0−0app/[owner]/[repo]/settings/webhooks/page.tsx → apps/web/app/[owner]/[repo]/settings/webhooks/page.tsxrenamedView File

File mode or name changed only.

+0−0app/[owner]/[repo]/tree/[...segments]/page.tsx → apps/web/app/[owner]/[repo]/tree/[...segments]/page.tsxrenamedView File

File mode or name changed only.

+0−0app/[owner]/[repo]/upload/[...segments]/page.tsx → apps/web/app/[owner]/[repo]/upload/[...segments]/page.tsxrenamedView File

File mode or name changed only.

+0−0app/[owner]/[repo]/wiki/%5Fraw/[...path]/route.ts → apps/web/app/[owner]/[repo]/wiki/%5Fraw/[...path]/route.tsrenamedView File

File mode or name changed only.

+0−0app/[owner]/[repo]/wiki/[[...segments]]/page.tsx → apps/web/app/[owner]/[repo]/wiki/[[...segments]]/page.tsxrenamedView File

File mode or name changed only.

+0−0app/[owner]/page.tsx → apps/web/app/[owner]/page.tsxrenamedView File

File mode or name changed only.

+0−0app/actions/activity.ts → apps/web/app/actions/activity.tsrenamedView File

File mode or name changed only.

+0−0app/actions/auth.ts → apps/web/app/actions/auth.tsrenamedView File

File mode or name changed only.

+0−0app/actions/branches.ts → apps/web/app/actions/branches.tsrenamedView File

File mode or name changed only.

+0−0app/actions/ci.ts → apps/web/app/actions/ci.tsrenamedView File

File mode or name changed only.

+0−0app/actions/files.ts → apps/web/app/actions/files.tsrenamedView File

File mode or name changed only.

+0−0app/actions/forks.ts → apps/web/app/actions/forks.tsrenamedView File

File mode or name changed only.

+0−0app/actions/guard.ts → apps/web/app/actions/guard.tsrenamedView File

File mode or name changed only.

+0−0app/actions/issues.ts → apps/web/app/actions/issues.tsrenamedView File

File mode or name changed only.

+0−0app/actions/oauth.ts → apps/web/app/actions/oauth.tsrenamedView File

File mode or name changed only.

+0−0app/actions/packages.ts → apps/web/app/actions/packages.tsrenamedView File

File mode or name changed only.

+0−0app/actions/protection.ts → apps/web/app/actions/protection.tsrenamedView File

File mode or name changed only.

+0−0app/actions/pulls.ts → apps/web/app/actions/pulls.tsrenamedView File

File mode or name changed only.

+0−0app/actions/releases.ts → apps/web/app/actions/releases.tsrenamedView File

File mode or name changed only.

+0−0app/actions/repo.ts → apps/web/app/actions/repo.tsrenamedView File

File mode or name changed only.

+0−0app/actions/settings.ts → apps/web/app/actions/settings.tsrenamedView File

File mode or name changed only.

+0−0app/actions/types.ts → apps/web/app/actions/types.tsrenamedView File

File mode or name changed only.

+0−0app/actions/webhooks.ts → apps/web/app/actions/webhooks.tsrenamedView File

File mode or name changed only.

+0−0app/actions/wiki.ts → apps/web/app/actions/wiki.tsrenamedView File

File mode or name changed only.

+0−0app/api/health/route.ts → apps/web/app/api/health/route.tsrenamedView File

File mode or name changed only.

+0−0app/api/markdown/[[...path]]/route.ts → apps/web/app/api/markdown/[[...path]]/route.tsrenamedView File

File mode or name changed only.

+0−0app/api/runner/claim/route.ts → apps/web/app/api/runner/claim/route.tsrenamedView File

File mode or name changed only.

+0−0app/api/runner/jobs/[id]/route.ts → apps/web/app/api/runner/jobs/[id]/route.tsrenamedView File

File mode or name changed only.

+0−0app/api/v1/[...path]/route.ts → apps/web/app/api/v1/[...path]/route.tsrenamedView File

File mode or name changed only.

+0−0app/apple-icon.png → apps/web/app/apple-icon.pngrenamedView File

File mode or name changed only.

+0−0app/explore/page.tsx → apps/web/app/explore/page.tsxrenamedView File

File mode or name changed only.

+0−0app/favicon.ico → apps/web/app/favicon.icorenamedView File

File mode or name changed only.

+0−0app/forbidden.tsx → apps/web/app/forbidden.tsxrenamedView File

File mode or name changed only.

+0−0app/globals.css → apps/web/app/globals.cssrenamedView File

File mode or name changed only.

+0−0app/icon.svg → apps/web/app/icon.svgrenamedView File

File mode or name changed only.

+0−0app/layout.tsx → apps/web/app/layout.tsxrenamedView File

File mode or name changed only.

+0−0app/llms.txt/route.ts → apps/web/app/llms.txt/route.tsrenamedView File

File mode or name changed only.

+0−0app/login/page.tsx → apps/web/app/login/page.tsxrenamedView File

File mode or name changed only.

+0−0app/mcp/route.ts → apps/web/app/mcp/route.tsrenamedView File

File mode or name changed only.

+0−0app/new/form.tsx → apps/web/app/new/form.tsxrenamedView File

File mode or name changed only.

+0−0app/new/page.tsx → apps/web/app/new/page.tsxrenamedView File

File mode or name changed only.

+0−0app/not-found.tsx → apps/web/app/not-found.tsxrenamedView File

File mode or name changed only.

+0−0app/oauth/authorize/form.tsx → apps/web/app/oauth/authorize/form.tsxrenamedView File

File mode or name changed only.

+0−0app/oauth/authorize/page.tsx → apps/web/app/oauth/authorize/page.tsxrenamedView File

File mode or name changed only.

+0−0app/oauth/register/route.ts → apps/web/app/oauth/register/route.tsrenamedView File

File mode or name changed only.

+0−0app/oauth/revoke/route.ts → apps/web/app/oauth/revoke/route.tsrenamedView File

File mode or name changed only.

+0−0app/oauth/token/route.ts → apps/web/app/oauth/token/route.tsrenamedView File

File mode or name changed only.

+0−0app/page.tsx → apps/web/app/page.tsxrenamedView File

File mode or name changed only.

+0−0app/settings/activity/page.tsx → apps/web/app/settings/activity/page.tsxrenamedView File

File mode or name changed only.

+0−0app/settings/applications/page.tsx → apps/web/app/settings/applications/page.tsxrenamedView File

File mode or name changed only.

+0−0app/settings/keys/form.tsx → apps/web/app/settings/keys/form.tsxrenamedView File

File mode or name changed only.

+0−0app/settings/keys/page.tsx → apps/web/app/settings/keys/page.tsxrenamedView File

File mode or name changed only.

+0−0app/settings/layout.tsx → apps/web/app/settings/layout.tsxrenamedView File

File mode or name changed only.

+0−0app/settings/page.tsx → apps/web/app/settings/page.tsxrenamedView File

File mode or name changed only.

+0−0app/settings/profile/forms.tsx → apps/web/app/settings/profile/forms.tsxrenamedView File

File mode or name changed only.

+0−0app/settings/profile/page.tsx → apps/web/app/settings/profile/page.tsxrenamedView File

File mode or name changed only.

+0−0app/settings/runners/page.tsx → apps/web/app/settings/runners/page.tsxrenamedView File

File mode or name changed only.

+0−0app/settings/tokens/form.tsx → apps/web/app/settings/tokens/form.tsxrenamedView File

File mode or name changed only.

+0−0app/settings/tokens/page.tsx → apps/web/app/settings/tokens/page.tsxrenamedView File

File mode or name changed only.

+0−0app/signup/page.tsx → apps/web/app/signup/page.tsxrenamedView File

File mode or name changed only.

+0−0app/v2/[[...path]]/route.ts → apps/web/app/v2/[[...path]]/route.tsrenamedView File

File mode or name changed only.

+0−0components/action-button.tsx → apps/web/components/action-button.tsxrenamedView File

File mode or name changed only.

+0−0components/agent.tsx → apps/web/components/agent.tsxrenamedView File

File mode or name changed only.

+0−0components/auth-forms.tsx → apps/web/components/auth-forms.tsxrenamedView File

File mode or name changed only.

+0−0components/branch-select.tsx → apps/web/components/branch-select.tsxrenamedView File

File mode or name changed only.

+0−0components/branches/new-branch-form.tsx → apps/web/components/branches/new-branch-form.tsxrenamedView File

File mode or name changed only.

+0−0components/brand.tsx → apps/web/components/brand.tsxrenamedView File

File mode or name changed only.

+0−0components/breadcrumbs.tsx → apps/web/components/breadcrumbs.tsxrenamedView File

File mode or name changed only.

+0−0components/ci/dispatch-form.tsx → apps/web/components/ci/dispatch-form.tsxrenamedView File

File mode or name changed only.

+0−0components/ci/job-steps.tsx → apps/web/components/ci/job-steps.tsxrenamedView File

File mode or name changed only.

+0−0components/ci/live-refresh.tsx → apps/web/components/ci/live-refresh.tsxrenamedView File

File mode or name changed only.

+0−0components/ci/new-runner-form.tsx → apps/web/components/ci/new-runner-form.tsxrenamedView File

File mode or name changed only.

+0−0components/ci/run-status.tsx → apps/web/components/ci/run-status.tsxrenamedView File

File mode or name changed only.

+0−0components/ci/run-text.ts → apps/web/components/ci/run-text.tsrenamedView File

File mode or name changed only.

+0−0components/ci/runner-list.tsx → apps/web/components/ci/runner-list.tsxrenamedView File

File mode or name changed only.

+0−0components/ci/workflow-nav.tsx → apps/web/components/ci/workflow-nav.tsxrenamedView File

File mode or name changed only.

+0−0components/clone-button.tsx → apps/web/components/clone-button.tsxrenamedView File

File mode or name changed only.

+0−0components/code-view.tsx → apps/web/components/code-view.tsxrenamedView File

File mode or name changed only.

+0−0components/commit-dialog.tsx → apps/web/components/commit-dialog.tsxrenamedView File

File mode or name changed only.

+0−0components/confirm-button.tsx → apps/web/components/confirm-button.tsxrenamedView File

File mode or name changed only.

+0−0components/conversation.tsx → apps/web/components/conversation.tsxrenamedView File

File mode or name changed only.

+0−0components/delete-file-form.tsx → apps/web/components/delete-file-form.tsxrenamedView File

File mode or name changed only.

+0−0components/doc-tabs.tsx → apps/web/components/doc-tabs.tsxrenamedView File

File mode or name changed only.

+0−0components/dropdown.tsx → apps/web/components/dropdown.tsxrenamedView File

File mode or name changed only.

+0−0components/editor-file-actions.tsx → apps/web/components/editor-file-actions.tsxrenamedView File

File mode or name changed only.

+0−0components/editor-theme.ts → apps/web/components/editor-theme.tsrenamedView File

File mode or name changed only.

+0−0components/expiry.tsx → apps/web/components/expiry.tsxrenamedView File

File mode or name changed only.

+0−0components/file-diff.tsx → apps/web/components/file-diff.tsxrenamedView File

File mode or name changed only.

+0−0components/file-editor.tsx → apps/web/components/file-editor.tsxrenamedView File

File mode or name changed only.

+0−0components/file-table.tsx → apps/web/components/file-table.tsxrenamedView File

File mode or name changed only.

+0−0components/fork-status.tsx → apps/web/components/fork-status.tsxrenamedView File

File mode or name changed only.

+0−0components/forks.tsx → apps/web/components/forks.tsxrenamedView File

File mode or name changed only.

+0−0components/header.tsx → apps/web/components/header.tsxrenamedView File

File mode or name changed only.

+0−0components/home-status.tsx → apps/web/components/home-status.tsxrenamedView File

File mode or name changed only.

+0−0components/home-terminal.tsx → apps/web/components/home-terminal.tsxrenamedView File

File mode or name changed only.

+0−0components/icons.tsx → apps/web/components/icons.tsxrenamedView File

File mode or name changed only.

+0−0components/issues/issue-composer.tsx → apps/web/components/issues/issue-composer.tsxrenamedView File

File mode or name changed only.

+0−0components/issues/issue-detail.tsx → apps/web/components/issues/issue-detail.tsxrenamedView File

File mode or name changed only.

+0−0components/issues/issue-icons.tsx → apps/web/components/issues/issue-icons.tsxrenamedView File

File mode or name changed only.

+0−0components/issues/issue-tracker.tsx → apps/web/components/issues/issue-tracker.tsxrenamedView File

File mode or name changed only.

+0−0components/issues/picker.tsx → apps/web/components/issues/picker.tsxrenamedView File

File mode or name changed only.

+0−0components/issues/properties.tsx → apps/web/components/issues/properties.tsxrenamedView File

File mode or name changed only.

+0−0components/issues/tracker-context.tsx → apps/web/components/issues/tracker-context.tsxrenamedView File

File mode or name changed only.

+0−0components/issues/view.ts → apps/web/components/issues/view.tsrenamedView File

File mode or name changed only.

+0−0components/markdown-preview.tsx → apps/web/components/markdown-preview.tsxrenamedView File

File mode or name changed only.

+0−0components/markdown.tsx → apps/web/components/markdown.tsxrenamedView File

File mode or name changed only.

+0−0components/metal.tsx → apps/web/components/metal.tsxrenamedView File

File mode or name changed only.

+0−0components/nav-links.tsx → apps/web/components/nav-links.tsxrenamedView File

File mode or name changed only.

+0−0components/providers.tsx → apps/web/components/providers.tsxrenamedView File

File mode or name changed only.

+0−0components/pulls/compare-select.tsx → apps/web/components/pulls/compare-select.tsxrenamedView File

File mode or name changed only.

+0−0components/pulls/create-pull-form.tsx → apps/web/components/pulls/create-pull-form.tsxrenamedView File

File mode or name changed only.

+0−0components/pulls/edit-pull-form.tsx → apps/web/components/pulls/edit-pull-form.tsxrenamedView File

File mode or name changed only.

+0−0components/pulls/line-key.ts → apps/web/components/pulls/line-key.tsrenamedView File

File mode or name changed only.

+0−0components/pulls/merge-form.tsx → apps/web/components/pulls/merge-form.tsxrenamedView File

File mode or name changed only.

+0−0components/pulls/pull-diff.tsx → apps/web/components/pulls/pull-diff.tsxrenamedView File

File mode or name changed only.

+0−0components/pulls/pull-icons.tsx → apps/web/components/pulls/pull-icons.tsxrenamedView File

File mode or name changed only.

+0−0components/pulls/pull-tabs.tsx → apps/web/components/pulls/pull-tabs.tsxrenamedView File

File mode or name changed only.

+0−0components/pulls/recent-pushes.tsx → apps/web/components/pulls/recent-pushes.tsxrenamedView File

File mode or name changed only.

+0−0components/pulls/respond-form.tsx → apps/web/components/pulls/respond-form.tsxrenamedView File

File mode or name changed only.

+0−0components/pulls/snippet.tsx → apps/web/components/pulls/snippet.tsxrenamedView File

File mode or name changed only.

+0−0components/pulls/thread.tsx → apps/web/components/pulls/thread.tsxrenamedView File

File mode or name changed only.

+0−0components/releases/release-card.tsx → apps/web/components/releases/release-card.tsxrenamedView File

File mode or name changed only.

+0−0components/releases/release-form.tsx → apps/web/components/releases/release-form.tsxrenamedView File

File mode or name changed only.

+0−0components/repo-add-file-menu.tsx → apps/web/components/repo-add-file-menu.tsxrenamedView File

File mode or name changed only.

+0−0components/repo-checklist.tsx → apps/web/components/repo-checklist.tsxrenamedView File

File mode or name changed only.

+0−0components/repo-filter-list.tsx → apps/web/components/repo-filter-list.tsxrenamedView File

File mode or name changed only.

+0−0components/repo-list.tsx → apps/web/components/repo-list.tsxrenamedView File

File mode or name changed only.

+0−0components/repo-rows.ts → apps/web/components/repo-rows.tsrenamedView File

File mode or name changed only.

+0−0components/repo-tabs.tsx → apps/web/components/repo-tabs.tsxrenamedView File

File mode or name changed only.

+0−0components/search-box.tsx → apps/web/components/search-box.tsxrenamedView File

File mode or name changed only.

+0−0components/settings-fields.tsx → apps/web/components/settings-fields.tsxrenamedView File

File mode or name changed only.

+0−0components/settings-nav.tsx → apps/web/components/settings-nav.tsxrenamedView File

File mode or name changed only.

+0−0components/settings-plate.tsx → apps/web/components/settings-plate.tsxrenamedView File

File mode or name changed only.

+0−0components/sidebar-nav.tsx → apps/web/components/sidebar-nav.tsxrenamedView File

File mode or name changed only.

+0−0components/sliding-indicator.ts → apps/web/components/sliding-indicator.tsrenamedView File

File mode or name changed only.

+0−0components/theme-toggle.tsx → apps/web/components/theme-toggle.tsxrenamedView File

File mode or name changed only.

+0−0components/tree-view.tsx → apps/web/components/tree-view.tsxrenamedView File

File mode or name changed only.

+0−0components/ui.tsx → apps/web/components/ui.tsxrenamedView File

File mode or name changed only.

+0−0components/upload-form.tsx → apps/web/components/upload-form.tsxrenamedView File

File mode or name changed only.

+0−0components/wiki/wiki-editor.tsx → apps/web/components/wiki/wiki-editor.tsxrenamedView File

File mode or name changed only.

+0−0components/wiki/wiki-shell.tsx → apps/web/components/wiki/wiki-shell.tsxrenamedView File

File mode or name changed only.

+0−0eslint.config.mjs → apps/web/eslint.config.mjsrenamedView File

File mode or name changed only.

+0−0instrumentation.ts → apps/web/instrumentation.tsrenamedView File

File mode or name changed only.

+0−0lib/actor.ts → apps/web/lib/actor.tsrenamedView File

File mode or name changed only.

+0−0lib/agents.ts → apps/web/lib/agents.tsrenamedView File

File mode or name changed only.

+1−1lib/app-api.ts → apps/web/lib/app-api.tsrenamedView File
@@ -54,7 +54,7 @@ import { SIGNUPS_ENABLED } from "./signups";
5454 import { authenticateUser, createUser, getUserByUsername, UserError, type User } from "./users";
5555
5656 /*
57- * The JSON API of the Vectrum mobile app (mobile/), under /api/v1. The app signs in with a username
57+ * The JSON API of the Vectrum mobile app (apps/mobile), under /api/v1. The app signs in with a username
5858 * and password and gets the same session token the web UI keeps in its cookie; it sends it as a
5959 * bearer token. Everything here acts as that person, with the web UI's permission checks (see
6060 * app/actions/*), so the app can do nothing the website wouldn't let them do.
+0−0lib/auth.ts → apps/web/lib/auth.tsrenamedView File

File mode or name changed only.

+0−0lib/branch-rules.test.ts → apps/web/lib/branch-rules.test.tsrenamedView File

File mode or name changed only.

+0−0lib/branch-rules.ts → apps/web/lib/branch-rules.tsrenamedView File

File mode or name changed only.

+0−0lib/branches.ts → apps/web/lib/branches.tsrenamedView File

File mode or name changed only.

+0−0lib/ci.ts → apps/web/lib/ci.tsrenamedView File

File mode or name changed only.

+0−0lib/cors.ts → apps/web/lib/cors.tsrenamedView File

File mode or name changed only.

+0−0lib/db.ts → apps/web/lib/db.tsrenamedView File

File mode or name changed only.

+0−0lib/event-text.ts → apps/web/lib/event-text.tsrenamedView File

File mode or name changed only.

+0−0lib/events.ts → apps/web/lib/events.tsrenamedView File

File mode or name changed only.

+0−0lib/forks.ts → apps/web/lib/forks.tsrenamedView File

File mode or name changed only.

+0−0lib/format.ts → apps/web/lib/format.tsrenamedView File

File mode or name changed only.

+0−0lib/git-agent.test.ts → apps/web/lib/git-agent.test.tsrenamedView File

File mode or name changed only.

+0−0lib/git-fork.test.ts → apps/web/lib/git-fork.test.tsrenamedView File

File mode or name changed only.

+0−0lib/git-http.ts → apps/web/lib/git-http.tsrenamedView File

File mode or name changed only.

+0−0lib/git-write.ts → apps/web/lib/git-write.tsrenamedView File

File mode or name changed only.

+0−0lib/git.test.ts → apps/web/lib/git.test.tsrenamedView File

File mode or name changed only.

+0−0lib/git.ts → apps/web/lib/git.tsrenamedView File

File mode or name changed only.

+0−0lib/hook-script.ts → apps/web/lib/hook-script.tsrenamedView File

File mode or name changed only.

+0−0lib/issue-meta.ts → apps/web/lib/issue-meta.tsrenamedView File

File mode or name changed only.

+0−0lib/issues.ts → apps/web/lib/issues.tsrenamedView File

File mode or name changed only.

+0−0lib/keys.ts → apps/web/lib/keys.tsrenamedView File

File mode or name changed only.

+0−0lib/languages.ts → apps/web/lib/languages.tsrenamedView File

File mode or name changed only.

+0−0lib/listing.ts → apps/web/lib/listing.tsrenamedView File

File mode or name changed only.

+0−0lib/logs.ts → apps/web/lib/logs.tsrenamedView File

File mode or name changed only.

+0−0lib/markdown-views.ts → apps/web/lib/markdown-views.tsrenamedView File

File mode or name changed only.

+0−0lib/mcp/agent-tools.ts → apps/web/lib/mcp/agent-tools.tsrenamedView File

File mode or name changed only.

+0−0lib/mcp/code-tools.ts → apps/web/lib/mcp/code-tools.tsrenamedView File

File mode or name changed only.

+0−0lib/mcp/kit.ts → apps/web/lib/mcp/kit.tsrenamedView File

File mode or name changed only.

+0−0lib/mcp/params.test.ts → apps/web/lib/mcp/params.test.tsrenamedView File

File mode or name changed only.

+0−0lib/mcp/params.ts → apps/web/lib/mcp/params.tsrenamedView File

File mode or name changed only.

+0−0lib/mcp/pull-tools.ts → apps/web/lib/mcp/pull-tools.tsrenamedView File

File mode or name changed only.

+0−0lib/mcp/server.ts → apps/web/lib/mcp/server.tsrenamedView File

File mode or name changed only.

+0−0lib/mcp/tools.ts → apps/web/lib/mcp/tools.tsrenamedView File

File mode or name changed only.

+0−0lib/mime.ts → apps/web/lib/mime.tsrenamedView File

File mode or name changed only.

+0−0lib/oauth-rules.test.ts → apps/web/lib/oauth-rules.test.tsrenamedView File

File mode or name changed only.

+0−0lib/oauth-rules.ts → apps/web/lib/oauth-rules.tsrenamedView File

File mode or name changed only.

+0−0lib/oauth.ts → apps/web/lib/oauth.tsrenamedView File

File mode or name changed only.

+0−0lib/paths.ts → apps/web/lib/paths.tsrenamedView File

File mode or name changed only.

+0−0lib/protection.ts → apps/web/lib/protection.tsrenamedView File

File mode or name changed only.

+0−0lib/pull-page.ts → apps/web/lib/pull-page.tsrenamedView File

File mode or name changed only.

+0−0lib/pulls.ts → apps/web/lib/pulls.tsrenamedView File

File mode or name changed only.

+0−0lib/push-hooks.ts → apps/web/lib/push-hooks.tsrenamedView File

File mode or name changed only.

+0−0lib/push.ts → apps/web/lib/push.tsrenamedView File

File mode or name changed only.

+0−0lib/recent-pushes.ts → apps/web/lib/recent-pushes.tsrenamedView File

File mode or name changed only.

+0−0lib/registry-http.ts → apps/web/lib/registry-http.tsrenamedView File

File mode or name changed only.

+0−0lib/registry.ts → apps/web/lib/registry.tsrenamedView File

File mode or name changed only.

+0−0lib/release-http.ts → apps/web/lib/release-http.tsrenamedView File

File mode or name changed only.

+0−0lib/release-upload.ts → apps/web/lib/release-upload.tsrenamedView File

File mode or name changed only.

+0−0lib/releases.ts → apps/web/lib/releases.tsrenamedView File

File mode or name changed only.

+0−0lib/repo.ts → apps/web/lib/repo.tsrenamedView File

File mode or name changed only.

+0−0lib/repos.ts → apps/web/lib/repos.tsrenamedView File

File mode or name changed only.

+0−0lib/request-origin.ts → apps/web/lib/request-origin.tsrenamedView File

File mode or name changed only.

+0−0lib/revert.ts → apps/web/lib/revert.tsrenamedView File

File mode or name changed only.

+0−0lib/runner-api.ts → apps/web/lib/runner-api.tsrenamedView File

File mode or name changed only.

+0−0lib/runners.ts → apps/web/lib/runners.tsrenamedView File

File mode or name changed only.

+0−0lib/runs.ts → apps/web/lib/runs.tsrenamedView File

File mode or name changed only.

+0−0lib/signups.ts → apps/web/lib/signups.tsrenamedView File

File mode or name changed only.

+0−0lib/ssh-config.ts → apps/web/lib/ssh-config.tsrenamedView File

File mode or name changed only.

+0−0lib/ssh-server.ts → apps/web/lib/ssh-server.tsrenamedView File

File mode or name changed only.

+0−0lib/theme.ts → apps/web/lib/theme.tsrenamedView File

File mode or name changed only.

+0−0lib/tokens.ts → apps/web/lib/tokens.tsrenamedView File

File mode or name changed only.

+0−0lib/tracker.ts → apps/web/lib/tracker.tsrenamedView File

File mode or name changed only.

+0−0lib/users.ts → apps/web/lib/users.tsrenamedView File

File mode or name changed only.

+0−0lib/webhook-rules.ts → apps/web/lib/webhook-rules.tsrenamedView File

File mode or name changed only.

+0−0lib/webhooks.ts → apps/web/lib/webhooks.tsrenamedView File

File mode or name changed only.

+0−0lib/wiki-links.test.ts → apps/web/lib/wiki-links.test.tsrenamedView File

File mode or name changed only.

+0−0lib/wiki-links.ts → apps/web/lib/wiki-links.tsrenamedView File

File mode or name changed only.

+0−0lib/wiki.ts → apps/web/lib/wiki.tsrenamedView File

File mode or name changed only.

+0−0lib/workflows-events.test.ts → apps/web/lib/workflows-events.test.tsrenamedView File

File mode or name changed only.

+0−0lib/workflows.ts → apps/web/lib/workflows.tsrenamedView File

File mode or name changed only.

+0−0next.config.ts → apps/web/next.config.tsrenamedView File

File mode or name changed only.

+47−0apps/web/package.jsonaddedView File
@@ -0,0 +1,47 @@
1+ {
2+ "name": "@vectrum/web",
3+ "version": "0.1.0",
4+ "private": true,
5+ "scripts": {
6+ "dev": "next dev",
7+ "build": "next build",
8+ "start": "next start",
9+ "lint": "eslint",
10+ "postinstall": "node scripts/install-pocketbase.mjs",
11+ "pocketbase:install": "node scripts/install-pocketbase.mjs",
12+ "test": "bun test"
13+ },
14+ "dependencies": {
15+ "@codemirror/language": "^6.12.4",
16+ "@codemirror/language-data": "^6.5.2",
17+ "@codemirror/view": "^6.43.13",
18+ "@lezer/highlight": "^1.2.5",
19+ "@uiw/codemirror-themes": "^4.25.12",
20+ "@uiw/react-codemirror": "^4.25.12",
21+ "@unlocalhosted/metalui": "^0.3.3",
22+ "next": "16.3.7",
23+ "pocketbase": "^0.28.1",
24+ "react": "19.2.8",
25+ "react-dom": "19.2.8",
26+ "react-markdown": "^10.1.0",
27+ "rehype-raw": "^7.0.0",
28+ "rehype-sanitize": "^6.0.0",
29+ "remark-gfm": "^4.0.1",
30+ "server-only": "^0.0.1",
31+ "shiki": "^4.4.3",
32+ "ssh2": "^1.17.0",
33+ "yaml": "^2.9.1"
34+ },
35+ "devDependencies": {
36+ "@tailwindcss/postcss": "^4",
37+ "@types/mdast": "^4.0.4",
38+ "@types/node": "^26.6.3",
39+ "@types/react": "^19",
40+ "@types/react-dom": "^19",
41+ "@types/ssh2": "^1.15.6",
42+ "eslint": "^9",
43+ "eslint-config-next": "16.3.7",
44+ "tailwindcss": "^4",
45+ "typescript": "^5"
46+ }
47+ }
+0−0pb_migrations/1759320000_init.js → apps/web/pb_migrations/1759320000_init.jsrenamedView File

File mode or name changed only.

+0−0pb_migrations/1790954144_runner_expiry.js → apps/web/pb_migrations/1790954144_runner_expiry.jsrenamedView File

File mode or name changed only.

+0−0pb_migrations/1790964309_releases.js → apps/web/pb_migrations/1790964309_releases.jsrenamedView File

File mode or name changed only.

+0−0pb_migrations/1790964401_oauth.js → apps/web/pb_migrations/1790964401_oauth.jsrenamedView File

File mode or name changed only.

+0−0pb_migrations/1790971005_wiki.js → apps/web/pb_migrations/1790971005_wiki.jsrenamedView File

File mode or name changed only.

+0−0pb_migrations/1791100000_agent_first.js → apps/web/pb_migrations/1791100000_agent_first.jsrenamedView File

File mode or name changed only.

+0−0pb_migrations/1791200000_forks.js → apps/web/pb_migrations/1791200000_forks.jsrenamedView File

File mode or name changed only.

+0−0postcss.config.mjs → apps/web/postcss.config.mjsrenamedView File

File mode or name changed only.

+0−0public/file.svg → apps/web/public/file.svgrenamedView File

File mode or name changed only.

+0−0public/globe.svg → apps/web/public/globe.svgrenamedView File

File mode or name changed only.

+0−0public/next.svg → apps/web/public/next.svgrenamedView File

File mode or name changed only.

+0−0public/vectrum-runner.mjs → apps/web/public/vectrum-runner.mjsrenamedView File

File mode or name changed only.

+0−0public/vectrum.mjs → apps/web/public/vectrum.mjsrenamedView File

File mode or name changed only.

+0−0public/vercel.svg → apps/web/public/vercel.svgrenamedView File

File mode or name changed only.

+0−0public/window.svg → apps/web/public/window.svgrenamedView File

File mode or name changed only.

+0−0scripts/create-user.mjs → apps/web/scripts/create-user.mjsrenamedView File

File mode or name changed only.

+0−0scripts/install-pocketbase.mjs → apps/web/scripts/install-pocketbase.mjsrenamedView File

File mode or name changed only.

+0−0tsconfig.json → apps/web/tsconfig.jsonrenamedView File

File mode or name changed only.

+13−0bun.lockView File
@@ -4,6 +4,14 @@
44 "workspaces": {
55 "": {
66 "name": "vectrum",
7+ },
8+ "apps/mobile": {
9+ "name": "@vectrum/mobile",
10+ "version": "0.1.0",
11+ },
12+ "apps/web": {
13+ "name": "@vectrum/web",
14+ "version": "0.1.0",
715 "dependencies": {
816 "@codemirror/language": "^6.12.4",
917 "@codemirror/language-data": "^6.5.2",
@@ -27,6 +35,7 @@
2735 },
2836 "devDependencies": {
2937 "@tailwindcss/postcss": "^4",
38+ "@types/mdast": "^4.0.4",
3039 "@types/node": "^26.6.3",
3140 "@types/react": "^19",
3241 "@types/react-dom": "^19",
@@ -472,6 +481,10 @@
472481
473482 "@unrs/resolver-binding-win32-x64-msvc": ["@unrs/resolver-binding-win32-x64-msvc@1.12.2", "", { "os": "win32", "cpu": "x64" }, "sha512-nAB74NfSNKknqQ1RrYj6uz8FcXEomu/MATJZxh/x+BArzN2U3JbOYC0APYzUIGhVY3m5hRxA8VPNdPBoG8txlA=="],
474483
484+ "@vectrum/mobile": ["@vectrum/mobile@workspace:apps/mobile"],
485+
486+ "@vectrum/web": ["@vectrum/web@workspace:apps/web"],
487+
475488 "acorn": ["acorn@8.18.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ=="],
476489
477490 "acorn-jsx": ["acorn-jsx@5.3.2", "", { "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ=="],
+3−1docker-compose.ymlView File
@@ -1,6 +1,8 @@
11 services:
22 vectrum:
3- build: .
3+ build:
4+ context: .
5+ dockerfile: apps/web/Dockerfile
46 image: vectrum
57 restart: unless-stopped
68 ports:
+6−2docs/installation.mdView File
@@ -3,12 +3,14 @@
33 Requires Node.js 22+ (24.7+ for post-quantum SSH key exchange) and `git` on the `PATH`.
44
55 ```bash
6- bun install # also downloads the PocketBase server into bin/
6+ bun install # also downloads the PocketBase server into apps/web/bin/
77 bun dev
88 ```
99
1010 Open http://localhost:3000, sign up, and create a repository.
1111
12+ The web app is `apps/web`; paths below are relative to it. Commands run from the repository root or from `apps/web`.
13+
1214 The data lives in [PocketBase](https://pocketbase.io). Vectrum starts `bin/pocketbase` itself on `127.0.0.1:8090`, with its data in `data/pb_data` and the schema from `pb_migrations/`; its superuser login is generated into `data/pocketbase-superuser.json` (also good for the PocketBase dashboard at http://127.0.0.1:8090/_/). Run `bun run pocketbase:install` if the binary is missing. To use a PocketBase server of your own instead, set `PB_URL` and the superuser credentials; it needs the migrations in `pb_migrations/` (`pocketbase serve --migrationsDir pb_migrations`).
1315
1416 ## Running with Docker
@@ -23,7 +25,9 @@ The image runs the web UI on port 3000 and the SSH server on port 2222, with all
2325 docker compose exec -it vectrum node scripts/create-user.mjs <username> <email> [name]
2426 ```
2527
26- It asks for the password (or reads `VECTRUM_PASSWORD`). Outside Docker, run `node scripts/create-user.mjs` the same way while Vectrum runs. Clone URLs show `SSH_PORT`, so publish SSH on the same port on the host, and set `SSH_HOST` to your domain. Put a TLS reverse proxy in front of port 3000 if the server is reachable from the internet, and set `PUBLIC_URL` to its address.
28+ It asks for the password (or reads `VECTRUM_PASSWORD`). Outside Docker, run `node scripts/create-user.mjs` the same way from `apps/web` while Vectrum runs. Clone URLs show `SSH_PORT`, so publish SSH on the same port on the host, and set `SSH_HOST` to your domain. Put a TLS reverse proxy in front of port 3000 if the server is reachable from the internet, and set `PUBLIC_URL` to its address.
29+
30+ To build the image without Compose, run `docker build -f apps/web/Dockerfile -t vectrum .` from the repository root.
2731
2832 ## Configuration
2933
+15−1docs/layout.mdView File
@@ -1,5 +1,19 @@
11 # Code layout
22
3+ The repository is a Bun workspace with one app per folder in `apps/`:
4+
5+ - `apps/web`: the forge, a Next.js app. Its `Dockerfile` builds the server image and `Dockerfile.runner` the runner's
6+ - `apps/mobile`: the Android app, a Gradle project (see [mobile.md](mobile.md)). Its `package.json` only wraps
7+ `./gradlew` so the root's `bun run mobile:*` scripts can reach it
8+ - `docs/`: this documentation; `patches/`: patches to dependencies, applied by `bun install`
9+
10+ The root `package.json` runs either app's scripts (`bun dev`, `bun run build`, `bun run lint`, `bun run test`,
11+ `bun run mobile:build`, `bun run mobile:deploy`).
12+
13+ ## The web app
14+
15+ Paths are relative to `apps/web`.
16+
317 - `lib/db.ts`: starting and connecting to PocketBase; `pb_migrations/`: the schema
418 - `lib/users.ts`, `lib/auth.ts`: accounts and sessions (PocketBase auth records and tokens)
519 - `lib/repos.ts`: repository records, permissions (`repoAccess`), collaborators
@@ -18,4 +32,4 @@
1832 - `lib/releases.ts`, `lib/release-http.ts`: releases and their files, and the download, upload and source archive routes
1933 - `lib/workflows.ts`, `lib/ci.ts`, `lib/runs.ts`, `lib/runners.ts`: workflow parsing, starting runs on push, the job queue and runner registration; `app/api/runner/*` is the runner API and `public/vectrum-runner.mjs` the runner
2034 - `app/actions/*`: server actions, each re-checking the session and permissions
21- - `lib/app-api.ts`: the JSON API of the Android app (`app/api/v1`); `mobile/`: the app itself (see [mobile.md](mobile.md))
35+ - `lib/app-api.ts`: the JSON API of the Android app (`app/api/v1`), which lives in `apps/mobile`
+8−4docs/mobile.mdView File
@@ -1,6 +1,6 @@
11 # Android app
22
3- `mobile/` is Vectrum for Android, in Kotlin with Jetpack Compose. It looks like the website: MetalUI's
3+ `apps/mobile/` is Vectrum for Android, in Kotlin with Jetpack Compose. It looks like the website: MetalUI's
44 bone and graphite colorways, raised plates and sunk wells, Geist and Geist Mono, engraved mono labels.
55
66 What it does:
@@ -22,15 +22,17 @@ What it does:
2222 ## Building
2323
2424 Needs JDK 17+ and the Android SDK (platform 37, build tools 36). With `ANDROID_HOME` set (or `sdk.dir` in
25- `mobile/local.properties`):
25+ `apps/mobile/local.properties`):
2626
2727 ```bash
28- cd mobile
28+ cd apps/mobile
2929 ./gradlew assembleDebug # app/build/outputs/apk/debug/app-debug.apk
3030 ./gradlew installDebug # onto a connected device or emulator
3131 ./gradlew assembleRelease # minified, signed with the debug key; sign with your own key to publish
3232 ```
3333
34+ From the repository root, `bun run mobile:build` and `bun run mobile:deploy` do the first two.
35+
3436 The app runs on Android 8.0 (API 26) and newer.
3537
3638 ## Setting up
@@ -54,7 +56,7 @@ non-local server without HTTPS.
5456
5557 ## The API
5658
57- The app talks to `/api/v1` (`app/api/v1/[...path]/route.ts`, `lib/app-api.ts`): JSON, with the session token
59+ The app talks to `/api/v1` (`apps/web/app/api/v1/[...path]/route.ts`, `apps/web/lib/app-api.ts`): JSON, with the session token
5860 as `Authorization: Bearer <token>`. It acts as the signed-in person and applies the website's permission
5961 checks, so the app can't do anything the website wouldn't let that person do: private repositories are "not
6062 found" to others, anyone who can read a repository may open issues and comment, and changing issues,
@@ -78,6 +80,8 @@ Errors are `{ "error": "…" }` with a 4xx status; 401 means the session ended.
7880
7981 ## Code layout
8082
83+ In `apps/mobile/app/src/main/java/cc/vectrum/app/`:
84+
8185 - `data/`: the API's models (`Models.kt`), the HTTP client (`Api.kt`) and the stored session (`Session.kt`)
8286 - `ui/theme/`: MetalUI's colorways (`Palette.kt`), type roles (`Type.kt`) and materials (`Materials.kt`:
8387 plates, wells and caps as stacks of shadows, from MetalUI's tokens)
+12−40package.jsonView File
@@ -1,47 +1,19 @@
11 {
22 "name": "vectrum",
3- "version": "0.1.0",
43 "private": true,
4+ "workspaces": [
5+ "apps/*"
6+ ],
57 "scripts": {
6- "dev": "next dev",
7- "build": "next build",
8- "start": "next start",
9- "lint": "eslint",
10- "postinstall": "node scripts/install-pocketbase.mjs",
11- "pocketbase:install": "node scripts/install-pocketbase.mjs",
12- "test": "bun test"
13- },
14- "dependencies": {
15- "@codemirror/language": "^6.12.4",
16- "@codemirror/language-data": "^6.5.2",
17- "@codemirror/view": "^6.43.13",
18- "@lezer/highlight": "^1.2.5",
19- "@uiw/codemirror-themes": "^4.25.12",
20- "@uiw/react-codemirror": "^4.25.12",
21- "@unlocalhosted/metalui": "^0.3.3",
22- "next": "16.3.7",
23- "pocketbase": "^0.28.1",
24- "react": "19.2.8",
25- "react-dom": "19.2.8",
26- "react-markdown": "^10.1.0",
27- "rehype-raw": "^7.0.0",
28- "rehype-sanitize": "^6.0.0",
29- "remark-gfm": "^4.0.1",
30- "server-only": "^0.0.1",
31- "shiki": "^4.4.3",
32- "ssh2": "^1.17.0",
33- "yaml": "^2.9.1"
34- },
35- "devDependencies": {
36- "@tailwindcss/postcss": "^4",
37- "@types/node": "^26.6.3",
38- "@types/react": "^19",
39- "@types/react-dom": "^19",
40- "@types/ssh2": "^1.15.6",
41- "eslint": "^9",
42- "eslint-config-next": "16.3.7",
43- "tailwindcss": "^4",
44- "typescript": "^5"
8+ "dev": "bun run --cwd apps/web dev",
9+ "build": "bun run --cwd apps/web build",
10+ "start": "bun run --cwd apps/web start",
11+ "lint": "bun run --cwd apps/web lint",
12+ "test": "bun run --cwd apps/web test",
13+ "pocketbase:install": "bun run --cwd apps/web pocketbase:install",
14+ "mobile:build": "bun run --cwd apps/mobile build",
15+ "mobile:deploy": "bun run --cwd apps/mobile deploy",
16+ "mobile:lint": "bun run --cwd apps/mobile lint"
4517 },
4618 "packageManager": "bun@1.4.2",
4719 "ignoreScripts": [