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 + +![OpenCodeHub](https://raw.githubusercontent.com/swadhinbiswas/OpencodeHub/main/public/logo-light.png) + +**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 -

- OpenCodeHub + OpenCodeHub

+

The self-hosted Git platform that doesn't compromise.

+

- CLI version - License - CI + CI + License + CLI version + Docs + Docker

-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. + +[![OpenCodeHub Demo](https://img.youtube.com/vi/VIDEO_ID/maxresdefault.jpg)](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 { - - diff --git a/src/pages/[owner]/[repo]/blame/[branch]/[...path].astro b/src/pages/[owner]/[repo]/blame/[branch]/[...path].astro index 8c515221..e0e6473a 100644 --- a/src/pages/[owner]/[repo]/blame/[branch]/[...path].astro +++ b/src/pages/[owner]/[repo]/blame/[branch]/[...path].astro @@ -250,32 +250,3 @@ const repo = { - - diff --git a/src/pages/[owner]/[repo]/blob/[branch]/[...path].astro b/src/pages/[owner]/[repo]/blob/[branch]/[...path].astro index 63d0d6a5..b6087f49 100644 --- a/src/pages/[owner]/[repo]/blob/[branch]/[...path].astro +++ b/src/pages/[owner]/[repo]/blob/[branch]/[...path].astro @@ -381,40 +381,6 @@ function formatSize(bytes: number) { - - - - - + +
+
+ + diff --git a/src/pages/settings/notification-preferences.astro b/src/pages/settings/notification-preferences.astro index cd84fc71..891410d7 100644 --- a/src/pages/settings/notification-preferences.astro +++ b/src/pages/settings/notification-preferences.astro @@ -742,10 +742,3 @@ for (const event of eventTypes) { } }); - - diff --git a/src/styles/globals.css b/src/styles/globals.css index f6404c49..891942ab 100644 --- a/src/styles/globals.css +++ b/src/styles/globals.css @@ -664,4 +664,72 @@ img { /* Better overflow handling */ .overflow-x-auto { -webkit-overflow-scrolling: touch; +} + +/* Code block scrollbar */ +.blob-scrollbar::-webkit-scrollbar { + height: 10px; + width: 10px; +} +.blob-scrollbar::-webkit-scrollbar-track { + background: transparent; +} +.blob-scrollbar::-webkit-scrollbar-thumb { + background: #30363d; + border-radius: 5px; + border: 2px solid #0d1117; +} +.blob-scrollbar::-webkit-scrollbar-thumb:hover { + background: #424a53; +} + +/* Shiki code highlighting overrides */ +.shiki { + background-color: transparent !important; + margin: 0 !important; + padding: 0 !important; +} +.shiki code { + display: flex; + flex-direction: column; +} +.shiki .line { + height: 1.5rem; + display: block; +} + +/* Admin HUD styles */ +.glass-panel { + background: rgba(13, 17, 23, 0.3); + backdrop-filter: blur(10px); + border: 1px solid rgba(255, 255, 255, 0.05); + box-shadow: 0 4px 30px rgba(0, 0, 0, 0.1); +} + +.custom-scrollbar::-webkit-scrollbar { + width: 4px; +} + +.custom-scrollbar::-webkit-scrollbar-thumb { + background: rgba(255, 255, 255, 0.1); + border-radius: 2px; +} + +/* Base layout styles */ +body { + font-family: "Inter", system-ui, sans-serif; +} + +code, +pre, +.font-mono { + font-family: "JetBrains Mono", monospace; +} + +.text-balance { + text-wrap: balance; +} + +html { + scroll-behavior: smooth; } \ No newline at end of file