3 Commits

Author SHA1 Message Date
Vectry
9a51856896 feat: add GlitchTip error monitoring integration
All checks were successful
Deploy CodeBoard / deploy (push) Successful in 3m13s
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-Claude)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-02-11 01:35:05 +00:00
Vectry
77a45f1479 feat: auto-create Gitea releases on tag push
All checks were successful
Deploy CodeBoard / deploy (push) Successful in 1m36s
2026-02-11 00:43:37 +00:00
Vectry
993bb08dff docs: add subscription features, pricing tiers, API keys, and getting started sections to README
All checks were successful
Deploy CodeBoard / deploy (push) Successful in 32s
2026-02-11 00:34:45 +00:00
9 changed files with 106 additions and 1 deletions

View File

@@ -62,6 +62,19 @@ jobs:
docker compose logs web --tail 50 docker compose logs web --tail 50
exit 1 exit 1
- name: Create Gitea Release
if: startsWith(gitea.ref, 'refs/tags/')
env:
RELEASE_TOKEN: ${{ secrets.RELEASE_TOKEN }}
run: |
TAG="${{ gitea.ref_name }}"
curl -s -X POST \
"https://gitea.vectry.tech/api/v1/repos/Vectry/codeboard/releases" \
-H "Authorization: token ${RELEASE_TOKEN}" \
-H "Content-Type: application/json" \
-d "{\"tag_name\": \"${TAG}\", \"name\": \"${TAG}\", \"body\": \"Automated release for ${TAG}\", \"draft\": false, \"prerelease\": false}" \
|| echo "Release may already exist — skipping"
- name: Cleanup - name: Cleanup
if: always() if: always()
run: docker image prune -f run: docker image prune -f

View File

@@ -2,6 +2,55 @@
Codebase → Onboarding Docs Generator. Paste a GitHub repo URL, get interactive developer onboarding documentation in minutes. Codebase → Onboarding Docs Generator. Paste a GitHub repo URL, get interactive developer onboarding documentation in minutes.
**Live at [codeboard.vectry.tech](https://codeboard.vectry.tech)**
## Getting Started
1. **Register** at [codeboard.vectry.tech/register](https://codeboard.vectry.tech/register) with your email and password.
2. **Log in** to access the dashboard, generation history, and settings.
3. **Paste a GitHub URL** and generate interactive onboarding documentation.
Registration is required for full access. Unauthenticated visitors can view the landing page, but generating documentation, viewing your dashboard, and browsing generation history all require a logged-in account.
## Plans and Pricing
CodeBoard offers three billing tiers. One generation equals one documentation build from a repository URL.
| Plan | Price | Generations | Highlights |
|------|-------|-------------|------------|
| **Free** | $0 | 15 per day | Public repos, architecture diagrams, interactive docs |
| **Starter** | $5 / month | 1,000 per month | Generation history, API key access, priority support |
| **Pro** | $20 / month | 100,000 per month | Full history, multiple API keys, dedicated support, custom integrations |
Manage your subscription in **Settings > Billing** from the dashboard.
## API Keys (Programmatic Access)
Paid plans (Starter and Pro) include API key access for programmatic diagram and documentation generation.
1. Navigate to **Settings > API Keys** in the dashboard.
2. Create a new key and copy it immediately -- it is shown only once.
3. Include the key in your requests:
```bash
curl -X POST https://codeboard.vectry.tech/api/generate \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"repoUrl": "https://github.com/owner/repo"}'
```
Each successful API call counts as one generation against your plan's quota.
## Generation History
All generated documentation is saved to your account. From the dashboard you can:
- Browse past generations per repository.
- Compare documentation versions side-by-side to track codebase changes over time.
- Re-open any previous generation by its unique link.
History is per-user -- each account maintains its own generation records.
## Architecture ## Architecture
``` ```

View File

@@ -1,7 +1,13 @@
import { withSentryConfig } from "@sentry/nextjs";
/** @type {import('next').NextConfig} */ /** @type {import('next').NextConfig} */
const config = { const config = {
transpilePackages: ["@codeboard/shared", "@codeboard/database"], transpilePackages: ["@codeboard/shared", "@codeboard/database"],
output: "standalone", output: "standalone",
}; };
export default config; export default withSentryConfig(config, {
silent: !process.env.CI,
disableServerWebpackPlugin: true,
disableClientWebpackPlugin: true,
});

View File

@@ -29,6 +29,7 @@
"react-markdown": "^9.0.0", "react-markdown": "^9.0.0",
"stripe": "^20.3.1", "stripe": "^20.3.1",
"tailwind-merge": "^2.6.0", "tailwind-merge": "^2.6.0",
"@sentry/nextjs": "^8.28.0",
"zod": "^3.24.0" "zod": "^3.24.0"
}, },
"devDependencies": { "devDependencies": {

View File

@@ -0,0 +1,7 @@
import * as Sentry from "@sentry/nextjs";
Sentry.init({
dsn: process.env.NEXT_PUBLIC_SENTRY_DSN,
tracesSampleRate: process.env.NODE_ENV === "development" ? 1.0 : 0.1,
debug: false,
});

View File

@@ -0,0 +1,7 @@
import * as Sentry from "@sentry/nextjs";
Sentry.init({
dsn: process.env.NEXT_PUBLIC_SENTRY_DSN,
tracesSampleRate: process.env.NODE_ENV === "development" ? 1.0 : 0.1,
debug: false,
});

View File

@@ -0,0 +1,7 @@
import * as Sentry from "@sentry/nextjs";
Sentry.init({
dsn: process.env.SENTRY_DSN || process.env.NEXT_PUBLIC_SENTRY_DSN,
tracesSampleRate: process.env.NODE_ENV === "development" ? 1.0 : 0.1,
debug: false,
});

View File

@@ -0,0 +1,13 @@
import * as Sentry from "@sentry/nextjs";
export async function register() {
if (process.env.NEXT_RUNTIME === "nodejs") {
await import("../sentry.server.config");
}
if (process.env.NEXT_RUNTIME === "edge") {
await import("../sentry.edge.config");
}
}
export const onRequestError = Sentry.captureRequestError;

View File

@@ -21,6 +21,8 @@ services:
- EMAIL_USER=hunter@repi.fun - EMAIL_USER=hunter@repi.fun
- EMAIL_PASSWORD=${EMAIL_PASSWORD:-} - EMAIL_PASSWORD=${EMAIL_PASSWORD:-}
- NEXT_PUBLIC_APP_URL=https://codeboard.vectry.tech - NEXT_PUBLIC_APP_URL=https://codeboard.vectry.tech
- NEXT_PUBLIC_SENTRY_DSN=https://637c487708794aaf8f2399496cd2e6c6@glitchtip.vectry.tech/2
- SENTRY_DSN=https://637c487708794aaf8f2399496cd2e6c6@glitchtip.vectry.tech/2
depends_on: depends_on:
redis: redis:
condition: service_started condition: service_started