Skip to content
Open
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .github/workflows/docker-publish.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ on:
env:
REGISTRY: docker.io
IMAGE_NAME: opencodehub/opencodehub
ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION: "true"

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Suppressing deprecated Node.js version warning rather than fixing it

ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION: "true" silences the GitHub Actions error that fires when a referenced action ships with a deprecated (EOL) Node.js runtime. The correct fix is to upgrade whichever action(s) still use Node 16 or earlier to a version that targets Node 20. Suppressing the warning with this flag means the workflow continues relying on runtimes that no longer receive security patches.

Prompt To Fix With AI
This is a comment left during a code review.
Path: .github/workflows/docker-publish.yml
Line: 12

Comment:
**Suppressing deprecated Node.js version warning rather than fixing it**

`ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION: "true"` silences the GitHub Actions error that fires when a referenced action ships with a deprecated (EOL) Node.js runtime. The correct fix is to upgrade whichever action(s) still use Node 16 or earlier to a version that targets Node 20. Suppressing the warning with this flag means the workflow continues relying on runtimes that no longer receive security patches.

How can I resolve this? If you propose a fix, please make it concise.


jobs:
build-and-push:
Expand Down
15 changes: 8 additions & 7 deletions Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -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
Comment on lines 14 to 17

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Production-only install breaks the build stage

bun install --production in the deps stage excludes all devDependencies. The builder stage copies node_modules directly from deps and then runs bun run build. For an Astro project the build toolchain (Astro itself, TypeScript compiler, Vite, etc.) lives in devDependencies, so the bun run build step will fail with missing module errors at compile time. The --production flag is appropriate for the final runner image, but the deps stage that feeds the builder needs the full dependency tree.

Prompt To Fix With AI
This is a comment left during a code review.
Path: Dockerfile
Line: 14-17

Comment:
**Production-only install breaks the build stage**

`bun install --production` in the `deps` stage excludes all `devDependencies`. The `builder` stage copies `node_modules` directly from `deps` and then runs `bun run build`. For an Astro project the build toolchain (Astro itself, TypeScript compiler, Vite, etc.) lives in `devDependencies`, so the `bun run build` step will fail with missing module errors at compile time. The `--production` flag is appropriate for the final `runner` image, but the `deps` stage that feeds the builder needs the full dependency tree.

How can I resolve this? If you propose a fix, please make it concise.


Expand All @@ -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
Expand All @@ -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

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 REPOS_PATH dropped from container environment breaks three runtime modules

The old Dockerfile set ENV REPOS_PATH=/data/repos; this PR replaces it with ENV GIT_REPOS_PATH=/data/repositories. However, three source files still read process.env.REPOS_PATH: src/lib/suggested-changes.ts, src/lib/mirror-sync.ts, and src/lib/cron/cleanup-branches.ts. With REPOS_PATH no longer set in the container environment, each falls back to its local default of path.join(process.cwd(), "data", "repos") (i.e., /app/data/repos), a path that does not exist and is not mounted — so mirror-sync writes, suggested-change diffing, and scheduled branch cleanup will silently operate on the wrong (absent) directory.

Additionally, docker-entrypoint.sh line 41 still uses ${REPOS_PATH:-/data/repos}, which means the entrypoint creates /data/repos at startup rather than /data/repositories, leaving the newly configured GIT_REPOS_PATH directory unguarded by the entrypoint.

Prompt To Fix With AI
This is a comment left during a code review.
Path: Dockerfile
Line: 55

Comment:
**`REPOS_PATH` dropped from container environment breaks three runtime modules**

The old Dockerfile set `ENV REPOS_PATH=/data/repos`; this PR replaces it with `ENV GIT_REPOS_PATH=/data/repositories`. However, three source files still read `process.env.REPOS_PATH`: `src/lib/suggested-changes.ts`, `src/lib/mirror-sync.ts`, and `src/lib/cron/cleanup-branches.ts`. With `REPOS_PATH` no longer set in the container environment, each falls back to its local default of `path.join(process.cwd(), "data", "repos")` (i.e., `/app/data/repos`), a path that does not exist and is not mounted — so mirror-sync writes, suggested-change diffing, and scheduled branch cleanup will silently operate on the wrong (absent) directory.

Additionally, `docker-entrypoint.sh` line 41 still uses `${REPOS_PATH:-/data/repos}`, which means the entrypoint creates `/data/repos` at startup rather than `/data/repositories`, leaving the newly configured `GIT_REPOS_PATH` directory unguarded by the entrypoint.

How can I resolve this? If you propose a fix, please make it concise.

ENV STORAGE_PATH=/data/storage
ENV CACHE_PATH=/data/cache
ENV SSH_PATH=/data/ssh
Expand Down
262 changes: 193 additions & 69 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,56 +1,83 @@
# OpenCodeHub

<p align="center">
<picture>
<source media="(prefers-color-scheme: dark)" srcset="public/logo-dark.png">
<source media="(prefers-color-scheme: light)" srcset="public/logo-light.png">
<img src="public/logo-light.png" alt="OpenCodeHub" width="380" />
<img src="public/logo-light.png" alt="OpenCodeHub" width="420" />
</picture>
</p>

<h3 align="center">The self-hosted Git platform that doesn't compromise.</h3>

<p align="center">
<a href="https://www.npmjs.com/package/opencodehub-cli"><img src="https://img.shields.io/npm/v/opencodehub-cli?style=flat-square&label=CLI" alt="CLI version"></a>
<a href="LICENSE"><img src="https://img.shields.io/badge/license-MIT-blue?style=flat-square" alt="License"></a>
<a href="https://github.com/swadhinbiswas/OpencodeHub/actions"><img src="https://img.shields.io/badge/CI-passing-success?style=flat-square" alt="CI"></a>
<a href="https://github.com/swadhinbiswas/OpencodeHub/actions"><img src="https://img.shields.io/badge/CI-passing-brightgreen?style=for-the-badge" alt="CI"></a>

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

printf '\n== README excerpt ==\n'
nl -ba README.md | sed -n '1,25p'

printf '\n== workflow files ==\n'
find .github/workflows -maxdepth 1 -type f 2>/dev/null | sort

printf '\n== workflow names/paths ==\n'
for f in .github/workflows/*; do
  [ -f "$f" ] || continue
  echo "--- $f ---"
  sed -n '1,120p' "$f" | sed -n '1,40p'
done

Repository: swadhinbiswas/OpencodeHub

Length of output: 225


🏁 Script executed:

#!/bin/bash
set -euo pipefail

nl -ba README.md | sed -n '1,25p'
echo
find .github/workflows -maxdepth 1 -type f 2>/dev/null | sort

Repository: swadhinbiswas/OpencodeHub

Length of output: 203


🏁 Script executed:

#!/bin/bash
set -euo pipefail

printf '== README excerpt ==\n'
sed -n '1,25p' README.md | awk '{printf "%4d  %s\n", NR, $0}'

printf '\n== workflow files ==\n'
find .github/workflows -maxdepth 1 -type f 2>/dev/null | sort || true

printf '\n== workflow headers ==\n'
for f in .github/workflows/*; do
  [ -f "$f" ] || continue
  echo "--- $f ---"
  sed -n '1,30p' "$f"
done

Repository: swadhinbiswas/OpencodeHub

Length of output: 5499


Use the CI workflow badge instead of a static status image.
This passing badge is hardcoded, so it can drift from the actual CI state. Point it at the repository’s workflow badge or remove it.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@README.md` at line 12, Replace the hardcoded CI status image in the README
with the repository’s workflow badge URL and matching link, or remove the badge
if no workflow badge is available. Update the existing CI badge anchor and image
while preserving the surrounding README content.

<a href="LICENSE"><img src="https://img.shields.io/badge/license-MIT-blue?style=for-the-badge" alt="License"></a>
<a href="https://www.npmjs.com/package/opencodehub-cli"><img src="https://img.shields.io/npm/v/opencodehub-cli?style=for-the-badge&label=CLI" alt="CLI version"></a>
<a href="https://docs.opencodehub.space"><img src="https://img.shields.io/badge/docs-opencodehub.space-brightgreen?style=for-the-badge" alt="Docs"></a>
<a href="https://hub.docker.com/r/opencodehub/opencodehub"><img src="https://img.shields.io/badge/docker-opencodehub%2Fopencodehub-blue?style=for-the-badge&logo=docker" alt="Docker"></a>
</p>

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.
<!-- Replace VIDEO_ID with your YouTube video ID -->
[![OpenCodeHub Demo](https://img.youtube.com/vi/VIDEO_ID/maxresdefault.jpg)](https://youtu.be/VIDEO_ID)
Comment on lines +29 to +30

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Replace the demo placeholder before merging.

VIDEO_ID produces a broken image and link in the published README. Replace it with the real video ID or remove the demo section.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@README.md` around lines 29 - 30, Replace the VIDEO_ID placeholders in the
OpenCodeHub Demo Markdown image and link with the actual YouTube video ID, or
remove the demo section entirely if no video is available.


**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

---

Expand All @@ -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 <pr-number>

# 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

```

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Add a language identifier to the architecture code fence.

Use ```text (or another appropriate language) so the README passes markdownlint MD040.

🧰 Tools
🪛 markdownlint-cli2 (0.23.0)

[warning] 195-195: Fenced code blocks should have a language specified

(MD040, fenced-code-language)

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@README.md` at line 195, Update the architecture code fence in README.md to
include a language identifier, preferably text, while preserving its existing
content.

Source: Linters/SAST tools

┌─────────────────────────────────────────────────────────────┐
│ 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
Comment on lines +233 to +234

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Fix the case-sensitive clone directory.

The clone URL creates OpencodeHub/, but the next command enters OpenCodeHub/. This fails on case-sensitive systems; use one spelling consistently.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@README.md` around lines 233 - 234, Update the README clone instructions so
the directory used by the cd command matches the case-sensitive directory name
created by git clone. Keep the repository URL unchanged and use one consistent
spelling across both commands.

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.
Loading