Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
90 commits
Select commit Hold shift + click to select a range
8c43be0
fix(insights): preserve canonical replies before public pages (#771)
izadoesdev Sep 9, 2026
7a74a25
fix(insights): preserve business priorities through investigation sel…
izadoesdev Sep 9, 2026
c43361f
feat(ai): measure identified profile activation retention (#774)
izadoesdev Sep 9, 2026
7624d83
feat(insights): investigate saved activation and return outcomes (#775)
izadoesdev Sep 9, 2026
710656a
test(ai): simplify required query selector fixtures (#777)
izadoesdev Sep 9, 2026
a981ac5
fix(insights): validate saved definitions and retire obsolete investi…
izadoesdev Sep 9, 2026
c8c3698
fix(insights): ground publication decisions in cited evidence (#778)
izadoesdev Sep 9, 2026
868ec16
fix(insights): preserve native retention evidence through publication…
izadoesdev Sep 9, 2026
f080a3d
fix(insights): validate tool-supplied retention comparisons (#780)
izadoesdev Sep 10, 2026
a080d7a
feat(insights): add grounded activation-date comparisons (#781)
izadoesdev Sep 10, 2026
997fa51
feat(insights): charge $1 per completed investigation (#786)
izadoesdev Sep 12, 2026
00704a0
fix(docs): align pricing disclosures, estimates, and Autumn config (#…
izadoesdev Sep 12, 2026
250c391
fix(ai): recover query matches outside the selected category (#783)
izadoesdev Sep 14, 2026
619da74
feat(billing): include monthly investigations with Autumn-only billin…
izadoesdev Sep 14, 2026
1add298
fix(ai): align conversation execution and query tool contracts (#782)
izadoesdev Sep 14, 2026
d7b9a4e
feat(ai): use Luna as the default conversation model (#784)
izadoesdev Sep 14, 2026
213f94a
refactor(ai): remove redundant execution helpers and type scaffolding…
izadoesdev Sep 14, 2026
a933d36
refactor(docs): remove redundant pricing helpers and unused icons (#791)
izadoesdev Sep 14, 2026
82705a3
refactor(dashboard): inline investigation checkout payload (#792)
izadoesdev Sep 14, 2026
6fb5380
refactor(ai): remove obsolete context and model adapters (#794)
izadoesdev Sep 14, 2026
5b5f42d
refactor(dashboard): remove unused billing surfaces and types (#795)
izadoesdev Sep 14, 2026
6f4dd47
fix(ai): preserve full RPC paths with the native client (#796)
izadoesdev Sep 14, 2026
dcd0c7e
refactor(docs): remove unused pricing catalog fields (#797)
izadoesdev Sep 14, 2026
f1b2ec9
fix(docs): correct crawlability and publication metadata (#798)
izadoesdev Sep 15, 2026
3cd0c0f
fix(docs): correct public claims and consolidate comparison content (…
izadoesdev Sep 15, 2026
adc7df0
fix(docs): reuse one GTM loader across configurations (#800)
izadoesdev Sep 15, 2026
cf7b206
refactor(docs): reuse native Markdown sources (#801)
izadoesdev Sep 15, 2026
3086c86
feat(docs): refresh customer logo wall (#802)
izadoesdev Sep 15, 2026
cc056b8
fix(services): stop business context reads crashing on non-object met…
izadoesdev Sep 16, 2026
f439b26
refactor(rpc): require a session for business context mutations
izadoesdev Sep 16, 2026
8cbf4c4
refactor(ai): model an absent agent actor as null, not a magic string
izadoesdev Sep 16, 2026
cd7a74d
feat(billing): restore agent credits on every plan
izadoesdev Sep 16, 2026
498c639
fix(docs): publish AI credit allowances instead of included chat
izadoesdev Sep 16, 2026
f2b4c36
feat(dashboard): improve business context reading and generation (#809)
izadoesdev Sep 16, 2026
813271a
refactor(db): move organization business context out of Better-Auth m…
izadoesdev Sep 16, 2026
4ae9023
fix(dashboard): dismiss persisted business context generation errors …
izadoesdev Sep 16, 2026
dac8b3f
fix(dashboard): simplify business context editing and retries (#811)
izadoesdev Sep 16, 2026
5451a8c
feat(billing): gate investigations on the Autumn allowance and includ…
izadoesdev Sep 16, 2026
060c89e
refactor(billing): delete the legacy investigation billing fallbacks
izadoesdev Sep 16, 2026
e313741
refactor(rpc): drop the double cast on export metadata
izadoesdev Sep 16, 2026
a6e0c25
refactor(insights): remove legacy billing mode and dead compatibility…
izadoesdev Sep 16, 2026
8a3ecda
test(insights): supply scheduler investigation allowance fixture (#813)
izadoesdev Sep 16, 2026
d4809f5
feat(dashboard): stream business context research through oRPC (#812)
izadoesdev Sep 16, 2026
48434d9
refactor(sdk): drop deprecated trackPerformance alias
izadoesdev Sep 16, 2026
247e984
refactor(shared): remove legacy insight definition execution schema
izadoesdev Sep 16, 2026
432c090
refactor(billing): derive investigation access from Autumn items only
izadoesdev Sep 16, 2026
bc225bb
refactor(dashboard): keep six dotmatrix loader variants and prune unu…
izadoesdev Sep 16, 2026
7371eb4
feat(auth): track Dub sign-up leads server-side
izadoesdev Sep 16, 2026
5c86e40
feat(api): stamp Dub customer id on Autumn attach metadata
izadoesdev Sep 16, 2026
0740f94
feat(dashboard): load Dub conversion tracking script
izadoesdev Sep 16, 2026
07ce35b
feat(docs): load Dub conversion tracking script on databuddy.cc
izadoesdev Sep 16, 2026
3c94d75
chore(deps): remove unused keypal and diff dependencies
izadoesdev Sep 16, 2026
68bf632
refactor(docs): share getGithubStars and drop redundant 405 handlers
izadoesdev Sep 16, 2026
c72e54b
refactor(uptime): drop UPTIME_DELIVERY_JOB_NAME alias
izadoesdev Sep 16, 2026
e524513
refactor(rpc): drop deleteLinkSchema alias
izadoesdev Sep 16, 2026
8515b64
chore(repo): drop unused exports flagged by knip
izadoesdev Sep 16, 2026
41a11b4
chore(dashboard): commit Next.js generated agent rule files
izadoesdev Sep 16, 2026
29c1da0
refactor(dashboard): drop dead FID metrics and legacy compat branches
izadoesdev Sep 16, 2026
612db8d
refactor(sdk): drop deprecated fid web vital field
izadoesdev Sep 16, 2026
e722f17
refactor(validation): remove unused legacy customEventSchema
izadoesdev Sep 16, 2026
fae0ed9
refactor(api): stamp Dub customer metadata on every Autumn proxy call
izadoesdev Sep 16, 2026
aca58e9
test(dashboard): drop unused requests array in business context spec
izadoesdev Sep 16, 2026
f02f3a4
fix(dashboard): restore legacy business context draft recovery
izadoesdev Sep 16, 2026
7e656f0
fix(ai): make HTML tag stripping regex linear
izadoesdev Sep 16, 2026
a4ed5fd
fix(ai): strip HTML tags with a linear scanner instead of a regex
izadoesdev Sep 16, 2026
1a28f78
refactor(auth): simplify Dub lead tracking
izadoesdev Sep 16, 2026
a3797a7
refactor(api): resolve the Autumn customer once per proxy request
izadoesdev Sep 16, 2026
c88bc6d
refactor(ai): fold the tag start check into one anchored test
izadoesdev Sep 16, 2026
9f058cb
fix(basket): skip hosted billing for self-hosted ingestion (#805)
izadoesdev Sep 17, 2026
e2ce7b4
fix(dashboard): support custom-domain self-host onboarding (#806)
izadoesdev Sep 17, 2026
924d55b
fix(api): honor self-hosted email sender settings (#803)
izadoesdev Sep 17, 2026
b9fbc4c
fix(insights): read business context table when retiring retention cases
izadoesdev Sep 17, 2026
9e14b9f
test(repo): remove snapshot, mock-echo, and duplicate tests and merge…
izadoesdev Sep 17, 2026
ac1a761
test(repo): port scratch-port integration suites to shared test infra
izadoesdev Sep 17, 2026
d1f404b
refactor(sdk): drop unused buildQueryParams export
izadoesdev Sep 17, 2026
44e3760
chore(lint): enforce test wiring, runner imports, and shared test infra
izadoesdev Sep 17, 2026
1806629
docs(repo): add tests section to CLAUDE.md
izadoesdev Sep 17, 2026
f9fc2c4
fix(insights): skip clarification delivery when the reply left running
izadoesdev Sep 17, 2026
7ada982
fix(insights): surface investigation charges that settle after the lo…
izadoesdev Sep 17, 2026
30547ae
fix(basket): use direct delivery when self-hosting (#815)
izadoesdev Sep 17, 2026
6b1b8f0
chore(repo): remove unused public assets
izadoesdev Sep 17, 2026
06cd514
refactor(repo): drop dead map view state and unused exports
izadoesdev Sep 17, 2026
d0070b5
fix(rpc): remove hosted billing requirements from self-hosting (#816)
izadoesdev Sep 17, 2026
1c42c5c
fix(env): simplify self-host runtime defaults (#814)
izadoesdev Sep 17, 2026
41ecea9
fix(ci): simplify self-host setup and database initialization (#804)
izadoesdev Sep 17, 2026
4b3aa8d
docs: make self-hosting and contribution guides clearer (#808)
izadoesdev Sep 17, 2026
9efedb8
docs(docs): show status app build and start commands (#823)
izadoesdev Sep 17, 2026
7b1465b
fix(ci): isolate self-host init image publishing (#824)
izadoesdev Sep 17, 2026
f241189
chore(lint): lint and format test files with Biome
izadoesdev Sep 17, 2026
57c9e9b
docs(repo): state that typed fixtures are a review aid, not a build gate
izadoesdev Sep 17, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
26 changes: 21 additions & 5 deletions .agents/skills/databuddy-internal/SKILL.md

Large diffs are not rendered by default.

5 changes: 4 additions & 1 deletion .agents/skills/databuddy-internal/references/codebase-map.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@ Use this file when the task spans multiple packages or when the right edit locat
- Theme tokens and WCAG-oriented contrast: `apps/dashboard/app/globals.css` (`:root`, `.dark`)
- Next.js dashboard application
- Default dev port: `3000`
- For local app review, use `bun run dev:dashboard` with the same existing root `.env` across services; do not blank billing or AI credentials and present the resulting environment as a working app.
- Include interaction feedback in billing/pricing work: short transform/opacity reveals, native pending buttons with accessible labels, and reduced-motion support. Keep disabled billing details unmounted and verify motion in the local browser.
- Talks to the backend through oRPC using [`apps/dashboard/lib/orpc.ts`](/Users/iza/Dev/Databuddy/apps/dashboard/lib/orpc.ts)
- **Status pages:** Public page lives under `app/status/[slug]`; **dashboard** edit surface is `app/(main)/monitors/status-pages/[id]/page.tsx`. For stable chrome (no tab strip pop-in), keep `Tabs` always mounted and gate **content** with `useFeatureAccess` + `FeatureLockedPanel`—do not wrap the whole `Tabs` in `FeatureAccessGate` with a list-only `loadingFallback`. Reserve `PageHeader` `right` with skeletons until `statusPage` loads; use a static `description` and breadcrumb fallback `"Status page"` so the header does not reflow on fetch.
- Typical work:
Expand Down Expand Up @@ -54,6 +56,7 @@ Use this file when the task spans multiple packages or when the right edit locat
- Next.js docs site using Fumadocs
- Default dev port: `3005`
- Good place for product docs, guides, and marketing-adjacent content with app integrations
- `SciFiButton` styles its inner control separately from the corner-frame wrapper. In stretched pricing-card layouts, use `className="w-full"` and verify their bounds match at desktop and mobile widths.
- Pricing for agents: `public/pricing.md`; `GET /api/pricing` (JSON or markdown via `Accept`); middleware rewrites `/pricing` → `/api/pricing` when markdown wins.
- Cookie cost calculator: [`apps/docs/app/(home)/calculator/`](/Users/iza/Dev/Databuddy/apps/docs/app/(home)/calculator/) — uses **visitor data loss rate** (consent / analytics visibility), not “banner bounce”; literature band 40–70% in `calculator-engine.ts`.

Expand All @@ -73,7 +76,7 @@ Use this file when the task spans multiple packages or when the right edit locat
- Postgres schema and relations
- ClickHouse client and schema
- Key files:
- [`packages/db/src/drizzle/schema.ts`](/Users/iza/Dev/Databuddy/packages/db/src/drizzle/schema.ts)
- [`packages/db/src/drizzle/schema/index.ts`](/Users/iza/Dev/Databuddy/packages/db/src/drizzle/schema/index.ts)
- [`packages/db/src/drizzle/relations.ts`](/Users/iza/Dev/Databuddy/packages/db/src/drizzle/relations.ts)
- [`packages/db/src/client.ts`](/Users/iza/Dev/Databuddy/packages/db/src/client.ts) — strips `sslrootcert=system` from `DATABASE_URL` before `pg` Pool: libpq uses it for the OS trust store, but node-postgres treats `sslrootcert` as a file path and throws `ENOENT` on path `"system"`.
- [`packages/db/src/clickhouse/client.ts`](/Users/iza/Dev/Databuddy/packages/db/src/clickhouse/client.ts)
Expand Down
17 changes: 8 additions & 9 deletions .env.example
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
# Local development. For Docker self-hosting, use selfhost.env.example.

CLICKHOUSE_URL="http://default:@localhost:8123/databuddy_analytics"
# Required by DQL. This must use the separately provisioned dql_user account;
# never point it at the application/admin ClickHouse credentials.
Expand All @@ -6,13 +8,6 @@ DATABASE_URL="postgres://databuddy:databuddy_dev_password@localhost:5432/databud
REDIS_URL="redis://localhost:6379"
BULLMQ_REDIS_URL="redis://localhost:6379"

# Required only by docker-compose.selfhost.yml. Use URL-safe passwords and make
# the local database URLs above use the same credentials before initialization.
IMAGE_TAG=""
POSTGRES_PASSWORD=""
CLICKHOUSE_PASSWORD=""
REDIS_PASSWORD=""

# Public URLs. Local development uses built-in localhost defaults when blank.
DASHBOARD_URL=""
API_URL=""
Expand All @@ -31,12 +26,15 @@ FIRECRAWL_API_KEY=""
SUPERMEMORY_API_KEY=""

BETTER_AUTH_URL="http://localhost:3000"
# Required by docker-compose.selfhost.yml. Generate independent random values.
# Generate independent random values for sessions and encryption.
BETTER_AUTH_SECRET="generate-a-random-32-byte-base64-secret"
DATABUDDY_ENCRYPTION_KEY=""

AUTUMN_SECRET_KEY=""

# Dub conversion tracking (server-side lead events on sign-up)
DUB_API_KEY=""

# Local dev default. Root build/start scripts force NODE_ENV=production.
NODE_ENV=development

Expand All @@ -57,7 +55,8 @@ GOOGLE_CLIENT_SECRET=""
RESEND_API_KEY=""
# Required when RESEND_API_KEY is set; use a domain verified in Resend.
EMAIL_FROM="Databuddy <no-reply@example.com>"
ALERTS_EMAIL_FROM="Databuddy <alerts@example.com>"
# Optional alert-specific sender; defaults to EMAIL_FROM.
ALERTS_EMAIL_FROM=""
NEXT_PUBLIC_OPENAI_ADS_PIXEL_ID=""

# Slack bot / AI agent adapter
Expand Down
13 changes: 12 additions & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,7 @@ jobs:
restore-keys: ${{ runner.os }}-bun-
- run: bun install --frozen-lockfile --ignore-scripts
- run: bun run --cwd apps/docs postinstall
- run: bun run --cwd apps/docs lint:links
- run: bun run check-types
- name: ClickHouse types match DDL
run: bun run --cwd packages/db ch:check
Expand Down Expand Up @@ -181,12 +182,22 @@ jobs:
CLICKHOUSE_URL: http://default:@localhost:8123
NODE_ENV: test
run: bun run test
- name: Self-hosted dashboard settings
run: >-
bun test --no-env-file apps/dashboard/next-config.test.ts
apps/dashboard/app/layout.test.ts
apps/dashboard/lib/app-url.test.ts
'apps/dashboard/app/(main)/websites/[id]/_components/utils/code-generators.test.ts'
'apps/dashboard/app/(main)/onboarding/_components/step-install-tracking.test.ts'
packages/auth/src/selfhost-config.test.ts
- name: Self-hosted billing UI
run: bun test --no-env-file --isolate apps/dashboard/components/providers/selfhost-billing.test.tsx
- name: Business context integration
env:
NODE_ENV: test
BUSINESS_CONTEXT_INTEGRATION_TESTS: "true"
run: |
bun test packages/services/src/organization-business-context.integration.test.ts packages/services/src/organization-business-context-hardening.integration.test.ts
bun test packages/services/src/organization-business-context.integration.test.ts packages/services/src/business-memory.integration.test.ts packages/services/src/measurement-plan.integration.test.ts
bun test packages/auth/src/organization-metadata.integration.test.ts
- name: Insights integration
env:
Expand Down
30 changes: 30 additions & 0 deletions .github/workflows/docker-publish-init.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
name: Publish Self-host Init Image

on:
release:
types: [published]
push:
branches: [main]
paths:
- "init.Dockerfile"
- ".dockerignore"
- "apps/**"
- "packages/**"
- "tsconfig/**"
- "bun.lock"
- "package.json"
- "turbo.json"
- ".github/workflows/docker-publish.yml"
- ".github/workflows/docker-publish-init.yml"
workflow_dispatch:

jobs:
publish:
permissions:
contents: read
packages: write
id-token: write
security-events: write
uses: ./.github/workflows/docker-publish.yml
with:
init-only: true
14 changes: 13 additions & 1 deletion .github/workflows/docker-publish.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,15 @@ on:
- "turbo.json"
- ".github/workflows/docker-publish.yml"
workflow_dispatch:
workflow_call:
inputs:
init-only:
description: Publish only the self-host database initialization image
type: boolean
default: false

concurrency:
group: docker-${{ github.ref }}
group: docker-${{ github.ref }}${{ inputs.init-only && '-init' || '' }}
cancel-in-progress: ${{ github.event_name != 'release' }}

env:
Expand Down Expand Up @@ -46,9 +52,14 @@ jobs:
- run: bun install --frozen-lockfile --ignore-scripts
- id: detect
env:
INIT_ONLY: ${{ inputs.init-only }}
EVENT_NAME: ${{ github.event_name }}
BEFORE_SHA: ${{ github.event.before }}
run: |
if [[ "$INIT_ONLY" == "true" ]]; then
echo 'services=["init"]' >> "$GITHUB_OUTPUT"
exit 0
fi
ALL='["api","basket","dashboard","insights","links","uptime"]'
if [[ "$EVENT_NAME" != "push" ]]; then
echo "services=$ALL" >> "$GITHUB_OUTPUT"
Expand Down Expand Up @@ -136,6 +147,7 @@ jobs:
api) text="Databuddy API service - analytics backend" ;;
basket) text="Databuddy Basket service - event ingestion" ;;
dashboard) text="Databuddy Dashboard service - web analytics UI" ;;
init) text="Databuddy database initialization and schema tools" ;;
insights) text="Databuddy Insights service - queued insight generation" ;;
links) text="Databuddy Links service - URL shortening and tracking" ;;
uptime) text="Databuddy Uptime service - availability monitoring" ;;
Expand Down
16 changes: 16 additions & 0 deletions .github/workflows/health-check.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,9 @@ on:
branches: [main]
paths:
- "*.Dockerfile"
- "docker-compose.selfhost.yml"
- "selfhost.env.example"
- "scripts/test-selfhost-init.sh"
- ".dockerignore"
- "apps/api/**"
- "apps/basket/**"
Expand All @@ -15,11 +18,15 @@ on:
- "bun.lock"
- "package.json"
- "turbo.json"
- "tsconfig/**"
- ".github/workflows/health-check.yml"
pull_request:
branches: [main, staging]
paths:
- "*.Dockerfile"
- "docker-compose.selfhost.yml"
- "selfhost.env.example"
- "scripts/test-selfhost-init.sh"
- ".dockerignore"
- "apps/api/**"
- "apps/basket/**"
Expand All @@ -30,6 +37,7 @@ on:
- "bun.lock"
- "package.json"
- "turbo.json"
- "tsconfig/**"
- ".github/workflows/health-check.yml"

permissions:
Expand All @@ -40,6 +48,14 @@ concurrency:
cancel-in-progress: true

jobs:
selfhost-init:
name: Self-host Database Initialization
runs-on: blacksmith-4vcpu-ubuntu-2404
timeout-minutes: 15
steps:
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7
- run: bash scripts/test-selfhost-init.sh

vector-config-check:
name: Vector Delivery Canary
runs-on: blacksmith-2vcpu-ubuntu-2404
Expand Down
1 change: 1 addition & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -160,6 +160,7 @@ For picker controls, use the component that matches the interaction:
- **Start fresh**: Check for an existing PR that owns the same surface, public contract, schema, or deployment configuration, then create the branch from an up-to-date `origin/staging`. Do not use an unmerged feature branch as a base unless the dependency is explicit, approved, and named as `Depends on #…` in both PRs.
- **Make ownership visible**: Push and open a draft PR against `staging` once the slice has a first commit. State its scope, dependencies, and known overlaps.
- **Keep integration linear**: Rebase a slice onto current `origin/staging` before it is ready for review; do not merge `staging` into the slice merely to refresh it. Request fresh review when a rebase changes reviewed code.
- **Resolve all review feedback before merging**: Mark the PR ready and wait for configured reviewers to finish on the final head; green CI alone is insufficient. Read every page of general comments, reviews, and inline threads, including outdated threads. Fix actionable findings or document a supported reason for declining them, then resolve each thread. Immediately before merging, re-fetch feedback and verify zero unresolved threads and no unaddressed comments or pending reviews. Never merge immediately after marking a draft ready or pushing review fixes while reviewers are still running.
- **Isolate parallel work**: Use one worktree per active branch. Never let two agents or contributors mutate the same branch or reuse a task branch for a different concern.
- **Retire completed work**: Merged PR source branches are automatically deleted. Delete closed PR branches manually, remove clean finished worktrees, and create a new branch from current `staging` for any follow-up—never revive or repurpose an old PR branch.

Expand Down
82 changes: 19 additions & 63 deletions AI_POLICY.md
Original file line number Diff line number Diff line change
@@ -1,73 +1,29 @@
# AI Usage Policy
# AI usage policy

The Databuddy project has strict rules for AI usage:
AI tools are welcome here. You're responsible for the work you submit: understand
it, check it, and make it useful to the people reviewing it.

- **All AI usage in any form must be disclosed.** You must state
the tool you used (e.g. Claude Code, Cursor, GitHub Copilot, ChatGPT) along with
the extent that the work was AI-assisted.
These requirements apply to outside contributions. Maintainers may use AI tools
at their discretion.

- **Pull requests created in any way by AI can only be for accepted issues.**
Drive-by pull requests that do not reference an accepted issue will be
closed. If AI isn't disclosed but a maintainer suspects its use, the
PR will be closed. If you want to share code for a non-accepted issue,
open a discussion or attach it to an existing discussion.
## Before you submit

- **Pull requests created by AI must have been fully verified with
human use.** AI must not create hypothetically correct code that
hasn't been tested. Importantly, you must not allow AI to write
code for platforms or environments you don't have access to manually
test on.
- **Disclose all AI use.** Name the tool and explain which parts of the work it helped with.
- **Start with an accepted issue.** Every AI-assisted PR must reference one. For other ideas, open a discussion or share code in an existing discussion first.
- **Review and test the complete change yourself.** AI-assisted PRs must be verified through human use. Don't submit code for a platform or environment you can't test manually.
- **Edit issues and discussions yourself.** Review and edit AI-assisted text before posting. Check the facts and remove noise.
- **Keep AI assistance to text and code.** AI-generated images, video, audio, and other media aren't accepted.

- **Issues and discussions can use AI assistance but must have a full
human-in-the-loop.** This means that any content generated with AI
must have been reviewed _and edited_ by a human before submission.
AI is very good at being overly verbose and including noise that
distracts from the main point. Humans must do their research and
trim this down.
PRs that don't meet these requirements, including undisclosed AI use, will be
closed. A maintainer will also close a PR if they suspect undisclosed AI use.
Contributors who misuse AI will be banned.

- **No AI-generated media is allowed (art, images, videos, audio, etc.).**
Text and code are the only acceptable AI-generated content, per the
other rules in this policy.
## Make review easier

- **Bad AI drivers will be banned and ridiculed in public.** You've
been warned. We love to help junior developers learn and grow, but
if you're interested in that then don't use AI, and we'll help you.
I'm sorry that bad AI drivers have ruined this for you.

These rules apply only to outside contributions to Databuddy. Maintainers
are exempt from these rules and may use AI tools at their discretion;
they've proven themselves trustworthy to apply good judgment.

## There are Humans Here

Please remember that Databuddy is maintained by humans.

Every discussion, issue, and pull request is read and reviewed by
humans (and sometimes machines, too). It is a boundary point at which
people interact with each other and the work done. It is rude and
disrespectful to approach this boundary with low-effort, unqualified
work, since it puts the burden of validation on the maintainer.

In a perfect world, AI would produce high-quality, accurate work
every time. But today, that reality depends on the driver of the AI.
And today, most drivers of AI are just not good enough. So, until either
the people get better, the AI gets better, or both, we have to have
strict rules to protect maintainers.

## AI is Welcome Here

Databuddy is written with plenty of AI assistance, and many maintainers embrace
AI tools as a productive tool in their workflow. As a project, we welcome
AI as a tool!

**Our reason for the strict AI policy is not due to an anti-AI stance**, but
instead due to the number of highly unqualified people using AI. It's the
people, not the tools, that are the problem.

I include this section to be transparent about the project's usage about
AI for people who may disagree with it, and to address the misconception
that this policy is anti-AI in nature.
Share what you tried, what you checked, and what still needs help. If you're
learning, ask questions and we'll help you find a starting point.

---

_This policy is adapted from the [Ghostty project's AI Usage Policy](https://github.com/ghostty-org/ghostty/blob/main/AI_POLICY.md), originally created by [mitchellh](https://github.com/mitchellh) and the Ghostty team. Thanks for setting the standard._
Adapted from the [Ghostty AI Usage Policy](https://github.com/ghostty-org/ghostty/blob/main/AI_POLICY.md)
by [mitchellh](https://github.com/mitchellh) and the Ghostty team.
Loading
Loading