diff --git a/.github/workflows/docker-publish.yml b/.github/workflows/docker-publish.yml
index a181b27f..978e1684 100644
--- a/.github/workflows/docker-publish.yml
+++ b/.github/workflows/docker-publish.yml
@@ -9,6 +9,7 @@ on:
env:
REGISTRY: docker.io
IMAGE_NAME: opencodehub/opencodehub
+ ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION: "true"
jobs:
build-and-push:
@@ -84,5 +85,5 @@ jobs:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_TOKEN }}
repository: ${{ env.IMAGE_NAME }}
- readme-filepath: ./README.md
- short-description: "A modern, self-hosted Git platform with stacked PRs, merge queue, CI/CD, and AI review."
+ readme-filepath: ./DOCKERHUB.md
+ short-description: "Self-hosted Git platform with stacked PRs, merge queue, CI/CD, and AI code review"
diff --git a/.mimocode/.cron-lock b/.mimocode/.cron-lock
index be112a6c..7f0718eb 100644
--- a/.mimocode/.cron-lock
+++ b/.mimocode/.cron-lock
@@ -1 +1 @@
-{"pid":4029,"startedAt":1784090173838}
\ No newline at end of file
+{"pid":5727,"startedAt":1784185065125}
\ No newline at end of file
diff --git a/DOCKERHUB.md b/DOCKERHUB.md
new file mode 100644
index 00000000..2a1dccfb
--- /dev/null
+++ b/DOCKERHUB.md
@@ -0,0 +1,81 @@
+# OpenCodeHub
+
+
+
+**The self-hosted Git platform that doesn't compromise.**
+
+OpenCodeHub is a self-hosted Git platform with stacked PRs, merge queue, CI/CD pipelines, and AI code review. One platform for everything your team needs — no vendor lock-in, no per-seat pricing.
+
+---
+
+## Features
+
+- **Stacked PRs** — Graphite-style stacked branches for incremental review
+- **Merge Queue** — Stack-aware merge ordering with speculative CI builds
+- **CI/CD Pipelines** — GitHub Actions-compatible workflows with Docker runners
+- **AI Code Review** — 10+ providers: GPT-4, Claude, Gemini, Groq, Ollama
+- **Git Hosting** — HTTP smart protocol + SSH push/pull, forks, mirroring, LFS
+- **Issues & Projects** — Labels, milestones, custom fields, kanban boards
+- **175+ API Endpoints** — REST + GraphQL for full programmatic access
+- **CLI** — `och` command line tool for stack workflows and repository management
+
+---
+
+## Quick Start
+
+```bash
+# Pull and run
+docker run -d \
+ --name opencodehub \
+ -p 4321:4321 \
+ -v opencodehub-data:/data \
+ -e JWT_SECRET=$(openssl rand -hex 32) \
+ -e SESSION_SECRET=$(openssl rand -hex 32) \
+ -e DATABASE_URL=postgresql://user:pass@db:5432/opencodehub \
+ opencodehub/opencodehub:latest
+```
+
+Or with Docker Compose:
+
+```bash
+git clone https://github.com/swadhinbiswas/OpencodeHub.git
+cd OpenCodeHub
+cp .env.example .env
+docker compose up -d
+docker compose exec app bun run scripts/seed-admin.ts
+```
+
+Open **http://localhost:4321** and create your admin account.
+
+---
+
+## Environment Variables
+
+| Variable | Required | Description |
+|----------|----------|-------------|
+| `DATABASE_URL` | Yes | PostgreSQL connection string |
+| `JWT_SECRET` | Yes | Random 32+ char string for JWT signing |
+| `SESSION_SECRET` | Yes | Random 32+ char string for session encryption |
+| `REDIS_URL` | Yes | Redis connection string |
+| `SITE_URL` | Yes | Your public URL (e.g., `https://git.example.com`) |
+| `STORAGE_TYPE` | No | `local` (default) or `s3` |
+
+---
+
+## Documentation
+
+Full documentation: **[docs.opencodehub.space](https://docs.opencodehub.space)**
+
+- [Installation Guide](https://docs.opencodehub.space/getting-started/installation/)
+- [Configuration Reference](https://docs.opencodehub.space/administration/configuration/)
+- [Deployment Options](https://docs.opencodehub.space/administration/deployment/)
+- [CLI Reference](https://docs.opencodehub.space/reference/cli-commands/)
+- [API Reference](https://docs.opencodehub.space/api/rest-api/)
+
+---
+
+## Links
+
+- **GitHub**: [github.com/swadhinbiswas/OpencodeHub](https://github.com/swadhinbiswas/OpencodeHub)
+- **Documentation**: [docs.opencodehub.space](https://docs.opencodehub.space)
+- **License**: MIT
diff --git a/Dockerfile b/Dockerfile
index dae0d485..7ae6c541 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -12,7 +12,7 @@ RUN apt-get update && apt-get install -y python3 make g++ gcc libc6-dev && rm -r
COPY package.json bun.lock ./
COPY cli/package.json ./cli/package.json
RUN for i in 1 2 3; do \
- bun install --frozen-lockfile && break || \
+ bun install --frozen-lockfile --production && break || \
(echo "bun install attempt $i failed, retrying in 10s..." && sleep 10); \
done
@@ -24,19 +24,20 @@ ENV SKIP_REDIS_CHECK=1
RUN bun run build
# Production image
-FROM oven/bun:1 AS runner
+FROM oven/bun:1-slim AS runner
WORKDIR /app
# Install git, ssh, and bash (needed for git operations and entrypoint)
-RUN apt-get update && apt-get install -y git openssh-client bash && rm -rf /var/lib/apt/lists/*
+RUN apt-get update && apt-get install -y --no-install-recommends git openssh-client bash && \
+ rm -rf /var/lib/apt/lists/*
# Create data directories
-RUN mkdir -p /data/repos /data/storage /data/cache /data/ssh && \
+RUN mkdir -p /data/repositories /data/storage /data/cache /data/ssh && \
chown -R bun:bun /data
-# Copy built application
+# Copy only what's needed for runtime
COPY --from=builder --chown=bun:bun /app/dist ./dist
-COPY --from=builder --chown=bun:bun /app/node_modules ./node_modules
+COPY --from=deps --chown=bun:bun /app/node_modules ./node_modules
COPY --from=builder --chown=bun:bun /app/package.json ./
# Copy drizzle config and schema for migrations
@@ -51,7 +52,7 @@ COPY --chown=bun:bun docker-entrypoint.sh ./
ENV HOST=0.0.0.0
ENV PORT=4321
ENV DATA_DIR=/data
-ENV REPOS_PATH=/data/repos
+ENV GIT_REPOS_PATH=/data/repositories
ENV STORAGE_PATH=/data/storage
ENV CACHE_PATH=/data/cache
ENV SSH_PATH=/data/ssh
diff --git a/README.md b/README.md
index 8e208155..578ad0d0 100644
--- a/README.md
+++ b/README.md
@@ -1,56 +1,83 @@
-# OpenCodeHub
-
-
+
+The self-hosted Git platform that doesn't compromise.
+
-
-
-
+
+
+
+
+
-Self-hosted Git platform with stacked PRs, merge queue, CI/CD, and AI code review. Built for teams that want speed and control.
-
---
-## Quick Start
+OpenCodeHub is a self-hosted Git platform with **stacked PRs**, **merge queue**, **CI/CD pipelines**, and **AI code review**. One platform for everything your team needs — no vendor lock-in, no per-seat pricing.
-```bash
-git clone https://github.com/swadhinbiswas/OpencodeHub.git
-cd OpenCodeHub
-cp .env.example .env
-docker compose up -d
-docker compose exec app bun run scripts/seed-admin.ts
-```
-
-Open `http://localhost:4321` and create your admin account.
-
-**Requirements**: Docker, or Node.js 20+ with PostgreSQL.
+**[Documentation](https://docs.opencodehub.space)** · **[Deploy in 5 minutes](#deploy)** · **[CLI Reference](https://docs.opencodehub.space/reference/cli-commands/)**
---
-## What It Does
-
-**Git Hosting** — HTTP smart protocol + SSH push/pull. Forks, mirroring, LFS, wiki.
+## Demo
-**Stacked PRs** — Break large changes into dependent branches. Each PR builds on the previous. Review in order, merge in order.
+
+[](https://youtu.be/VIDEO_ID)
-**Merge Queue** — Stack-aware merge ordering with speculative CI builds. `main` never breaks.
+*Watch the full walkthrough — deployment, stacked PRs, AI review, and merge queue in action.*
-**CI/CD** — GitHub Actions-compatible workflows. Docker-based runners. Artifacts, secrets, matrix builds.
+---
-**AI Code Review** — GPT-4, Claude, Gemini, Groq, Ollama, and 5+ more providers. Catches bugs, security issues, and style problems automatically.
+## Why OpenCodeHub?
-**Issues & Projects** — Labels, milestones, custom fields, kanban boards.
+| Problem | Solution |
+|---------|----------|
+| PRs too large to review | **Stacked PRs** — break changes into small, dependent branches |
+| Merge conflicts on main | **Merge Queue** — stack-aware ordering with speculative CI builds |
+| Slow review cycles | **AI Code Review** — catches bugs before humans even look |
+| Split across 5+ services | **All-in-one** — Git, PRs, CI/CD, issues, wiki in one place |
+| Data leaves your servers | **Self-hosted** — your code stays on your hardware |
-**175+ API Endpoints** — REST + GraphQL. Full programmatic access to everything.
+---
-**CLI** — `och` command line tool for stack workflows, reviews, and repository management.
+## Features
+
+### Core Platform
+- **Git Hosting** — HTTP smart protocol + SSH push/pull, forks, mirroring, LFS
+- **Pull Requests** — Inline comments, approvals, suggested changes, draft PRs
+- **Issues & Projects** — Labels, milestones, custom fields, kanban boards
+- **Wiki** — Repository wiki with revision history
+- **Organizations** — Teams, collaborators, role-based access control
+
+### Delivery Workflows
+- **Stacked PRs** — Graphite-style stacked branches with web + CLI support
+- **Merge Queue** — Stack-aware queue with speculative builds and priority lanes
+- **CI/CD Pipelines** — GitHub Actions-compatible engine with Docker-based runners
+- **Webhooks** — Outbound webhooks with event filtering and HMAC signing
+- **Automations** — Rule-based workflow automation for PRs and deployments
+
+### AI & Quality
+- **AI Code Review** — 10+ providers: GPT-4, Claude, Gemini, Groq, Ollama, OpenRouter
+- **Secret Scanning** — Detect secrets in commits before they reach production
+- **Branch Protection** — Required reviews, status checks, push restrictions
+- **Developer Metrics** — PR velocity, review efficiency, time-to-merge tracking
+
+### Security
+- **Authentication** — JWT sessions, OAuth (GitHub, Google, GitLab), 2FA/TOTP, SSO/SAML
+- **Authorization** — RBAC with roles, team permissions, collaborator levels
+- **Rate Limiting** — Redis-backed per-endpoint rate limiting
+- **Audit Logging** — Track all administrative actions
+
+### Extensibility
+- **REST API** — 175+ endpoints covering all platform features
+- **GraphQL** — Full GraphQL endpoint for flexible queries
+- **CLI** — `och` command line tool with 20+ command groups
+- **Storage** — Local, S3, MinIO, R2, or any S3-compatible backend
---
@@ -66,73 +93,170 @@ docker compose up -d
docker compose exec app bun run scripts/seed-admin.ts
```
+Open **http://localhost:4321** and create your admin account.
+
### Render (Free)
-See [Render Deployment Guide](docs/RENDER-DEPLOYMENT.md). Uses free PostgreSQL + Upstash Redis.
+Deploy to Render with free PostgreSQL + Upstash Redis:
-### Other Options
+```bash
+# 1. Create free Redis at upstash.com (Singapore region)
+# 2. Push to GitHub
+# 3. Render → New → Blueprint → Select your repo
+# 4. Set REDIS_URL and SITE_URL
+# 5. Deploy
+```
+
+See the [Render Deployment Guide](docs/RENDER-DEPLOYMENT.md) for step-by-step instructions.
-| Platform | Guide |
-|----------|-------|
-| Docker Compose | [Deployment Guide](docs/administration/deployment.md) |
-| NAS (Synology/TrueNAS) | [NAS Guide](docs/administration/deploy-nas.md) |
-| Kubernetes | [K8s Guide](docs/administration/kubernetes.md) |
-| Cloudflare Tunnel | [Cloudflare Guide](docs/administration/deploy-cloudflare.md) |
-| Free Tier Options | [Free Deployment](docs/FREE-DEPLOYMENT.md) |
+### More Deployment Options
+
+| Platform | Guide | Cost |
+|----------|-------|------|
+| Docker Compose | [Deployment Guide](docs/administration/deployment.md) | Free |
+| Render (Asia) | [Render Guide](docs/RENDER-DEPLOYMENT.md) | Free |
+| Oracle Cloud | [Free Deployment](docs/FREE-DEPLOYMENT.md) | Free forever |
+| NAS (Synology/TrueNAS) | [NAS Guide](docs/administration/deploy-nas.md) | Free |
+| Kubernetes | [K8s Guide](docs/administration/kubernetes.md) | Free |
+| Cloudflare Tunnel | [Cloudflare Guide](docs/administration/deploy-cloudflare.md) | Free |
+
+---
+
+## CLI
+
+```bash
+# Install
+npm install -g opencodehub-cli
+
+# Login
+och auth login --url http://localhost:4321
+
+# Stacked PR workflow
+och stack create feature/auth-step-1
+och stack submit
+och stack sync
+
+# Merge queue
+och queue list
+och queue add
+
+# Interactive cockpit
+och focus
+```
+
+[Full CLI Reference](https://docs.opencodehub.space/reference/cli-commands/)
+
+---
+
+## API
+
+```bash
+# Create a repository
+curl -X POST http://localhost:4321/api/repos \
+ -H "Authorization: Bearer YOUR_TOKEN" \
+ -H "Content-Type: application/json" \
+ -d '{"name":"my-project","visibility":"public"}'
+
+# List pull requests
+curl http://localhost:4321/api/repos/owner/repo/pulls \
+ -H "Authorization: Bearer YOUR_TOKEN"
+
+# GraphQL
+curl -X POST http://localhost:4321/api/graphql \
+ -H "Authorization: Bearer YOUR_TOKEN" \
+ -H "Content-Type: application/json" \
+ -d '{"query": "{ repositories { name owner { username } } }"}'
+```
+
+[Full API Reference](https://docs.opencodehub.space/api/rest-api/)
---
## Tech Stack
-| Layer | Tech |
-|-------|------|
-| Framework | Astro 4.x SSR + React 18 |
-| Database | PostgreSQL, SQLite, Turso (Drizzle ORM) |
-| Auth | JWT, OAuth, 2FA/TOTP, SSO/SAML |
+| Layer | Technology |
+|-------|-----------|
+| Framework | Astro 4.x (SSR) + React 18 |
+| UI | Tailwind CSS + Radix UI |
+| Database | PostgreSQL / SQLite / Turso (Drizzle ORM) |
+| Auth | JWT + OAuth + 2FA/TOTP + SSO/SAML |
+| Git | Native git CLI + simple-git + isomorphic-git |
+| SSH | ssh2 library |
| CI/CD | Docker-based runners, GitHub Actions syntax |
-| Storage | Local, S3, MinIO, R2, or any S3-compatible |
-| CLI | Commander.js (`npm i -g opencodehub-cli`) |
+| Storage | Local filesystem or S3-compatible (AWS, MinIO, R2) |
+| AI | OpenAI, Anthropic, Google, Groq, Ollama, OpenRouter |
+| Queue | BullMQ + Redis |
+| CLI | Commander.js + Inquirer |
---
-## Documentation
+## Architecture
+
+```
+┌─────────────────────────────────────────────────────────────┐
+│ CLIENTS │
+│ Browser │ Git CLI (HTTP/SSH) │ OpenCodeHub CLI (och) │
+└─────────────────────────────────────────────────────────────┘
+ │
+┌─────────────────────────────────────────────────────────────┐
+│ OPENCODEHUB PLATFORM │
+│ Web UI (Astro+React) │ REST API (175+ routes) │ GraphQL │
+│ Git Server (HTTP) │ SSH Server (ssh2) │ │
+│ Pipeline Runner (Docker) │ │
+└─────────────────────────────────────────────────────────────┘
+ │
+┌─────────────────────────────────────────────────────────────┐
+│ PostgreSQL/SQLite/Turso │ Redis │ Pluggable Storage │
+└─────────────────────────────────────────────────────────────┘
+```
+
+---
-Full docs at [docs.opencodehub.space](https://docs.opencodehub.space/):
+## Documentation
-- [Installation](https://docs.opencodehub.space/getting-started/installation/)
-- [Configuration](https://docs.opencodehub.space/administration/configuration/)
-- [Stacked PRs](https://docs.opencodehub.space/features/stacked-prs/)
-- [AI Code Review](https://docs.opencodehub.space/features/ai-review/)
-- [CLI Reference](https://docs.opencodehub.space/reference/cli-commands/)
-- [API Reference](https://docs.opencodehub.space/api/rest-api/)
+| Topic | Link |
+|-------|------|
+| Installation | [docs.opencodehub.space/getting-started/installation](https://docs.opencodehub.space/getting-started/installation/) |
+| Configuration | [docs.opencodehub.space/administration/configuration](https://docs.opencodehub.space/administration/configuration/) |
+| Stacked PRs | [docs.opencodehub.space/features/stacked-prs](https://docs.opencodehub.space/features/stacked-prs/) |
+| AI Code Review | [docs.opencodehub.space/features/ai-review](https://docs.opencodehub.space/features/ai-review/) |
+| CLI Reference | [docs.opencodehub.space/reference/cli-commands](https://docs.opencodehub.space/reference/cli-commands/) |
+| API Reference | [docs.opencodehub.space/api/rest-api](https://docs.opencodehub.space/api/rest-api/) |
+| Deployment | [docs.opencodehub.space/administration/deployment](https://docs.opencodehub.space/administration/deployment/) |
---
-## CLI
+## Contributing
```bash
-npm install -g opencodehub-cli
+# Clone and setup
+git clone https://github.com/swadhinbiswas/OpencodeHub.git
+cd OpenCodeHub
+cp .env.example .env
+npm install
+npm run db:push
+bun run scripts/seed-admin.ts
-och auth login --url http://localhost:4321
-och stack create feature/auth
-och stack submit
-och focus
+# Start development
+npm run dev
+
+# Run tests
+npm run test
```
----
+See [CONTRIBUTING.md](CONTRIBUTING.md) for development workflow and standards.
-## Contributing
+---
-1. Fork the repo
-2. Create a branch
-3. `npm install && npm run db:push && npm run dev`
-4. Run tests: `npm run test`
-5. Open a PR
+## Community
-See [CONTRIBUTING.md](CONTRIBUTING.md) for details.
+- **GitHub**: [github.com/swadhinbiswas/OpencodeHub](https://github.com/swadhinbiswas/OpencodeHub)
+- **Documentation**: [docs.opencodehub.space](https://docs.opencodehub.space)
+- **Issues**: [GitHub Issues](https://github.com/swadhinbiswas/OpencodeHub/issues)
+- **Discussions**: [GitHub Discussions](https://github.com/swadhinbiswas/OpencodeHub/discussions)
---
## License
-MIT
+[MIT](LICENSE) — Use it however you want.
diff --git a/astro.config.mjs b/astro.config.mjs
index a97c5c51..3d50adcb 100644
--- a/astro.config.mjs
+++ b/astro.config.mjs
@@ -21,6 +21,9 @@ export default defineConfig({
host: true,
},
vite: {
+ css: {
+ transformer: 'postcss',
+ },
server: {
watch: {
ignored: ['**/data/**', '**/repos/**', '**/storage/**', '**/.tmp/**', '**/postgres/**', '**/redis/**'],
diff --git a/bun.lock b/bun.lock
index d3c9f446..415f9ca4 100644
--- a/bun.lock
+++ b/bun.lock
@@ -140,7 +140,7 @@
"autoprefixer": "^10.4.19",
"drizzle-kit": "^0.31.8",
"pino-pretty": "^13.1.3",
- "postcss": "^8.5.10",
+ "postcss": "~8.4.49",
"tailwindcss": "^3.4.4",
"typescript": "^5.9.3",
"vitest": "^4.1.5",
@@ -189,6 +189,7 @@
"lodash-es": "^4.17.23",
"picomatch": "^4.0.4",
"picomatch@2": "^2.3.2",
+ "postcss": "~8.4.49",
"preact": "^10.29.0",
"protobufjs": "^7.6.0",
"qs": "^6.15.0",
@@ -2442,7 +2443,7 @@
"possible-typed-array-names": ["possible-typed-array-names@1.1.0", "https://registry.npmmirror.com/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", {}, "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg=="],
- "postcss": ["postcss@8.5.15", "https://registry.npmmirror.com/postcss/-/postcss-8.5.15.tgz", { "dependencies": { "nanoid": "^3.3.12", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A=="],
+ "postcss": ["postcss@8.4.49", "https://registry.npmmirror.com/postcss/-/postcss-8.4.49.tgz", { "dependencies": { "nanoid": "^3.3.7", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA=="],
"postcss-import": ["postcss-import@15.1.0", "https://registry.npmmirror.com/postcss-import/-/postcss-import-15.1.0.tgz", { "dependencies": { "postcss-value-parser": "^4.0.0", "read-cache": "^1.0.0", "resolve": "^1.1.7" }, "peerDependencies": { "postcss": "^8.0.0" } }, "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew=="],
diff --git a/package.json b/package.json
index e97ba046..61a3ad1d 100644
--- a/package.json
+++ b/package.json
@@ -179,7 +179,7 @@
"autoprefixer": "^10.4.19",
"drizzle-kit": "^0.31.8",
"pino-pretty": "^13.1.3",
- "postcss": "^8.5.10",
+ "postcss": "~8.4.49",
"tailwindcss": "^3.4.4",
"typescript": "^5.9.3",
"vitest": "^4.1.5"
@@ -205,6 +205,7 @@
"preact": "^10.29.0",
"brace-expansion": "^2.1.1",
"diff": "^5.2.0",
- "cross-spawn": "^7.0.6"
+ "cross-spawn": "^7.0.6",
+ "postcss": "~8.4.49"
}
}
diff --git a/src/layouts/AdminLayout.astro b/src/layouts/AdminLayout.astro
index 30ca6b99..8448c347 100644
--- a/src/layouts/AdminLayout.astro
+++ b/src/layouts/AdminLayout.astro
@@ -16,26 +16,6 @@ const { title } = Astro.props;
{title}
-
diff --git a/src/layouts/BaseLayout.astro b/src/layouts/BaseLayout.astro
index 1affbd4d..4f1d8018 100644
--- a/src/layouts/BaseLayout.astro
+++ b/src/layouts/BaseLayout.astro
@@ -126,36 +126,3 @@ const {