Files
t5de-hub/CLAUDE.md
dhkatz f8ab3f965e
Release / release (push) Successful in 2s
CI / test (push) Successful in 57s
CI / image (apps/web/Dockerfile, t5de-hub-web) (push) Successful in 5s
CI / image (apps/api/Dockerfile, t5de-hub-api) (push) Successful in 5s
ci: release pull requests, and conventional-commit PR titles (#1)
Releases as pull requests, the same in all five app repos (hub, catalog, live, riftbound, karaoke). The Gitea side (PRs only into main, squash merges, required checks, `v*` tags only by release-bot, its `RELEASE_TOKEN` org secret) is dhkatz/infra `modules/app-repo`.

- **`.gitea/workflows/pull-request.yml`**: the PR title must be a conventional commit (`feat(api): …`, `fix: …`, `feat!: …`); it becomes the commit on main. `chore(release)` only from release-bot's `release` branch. Required to merge (`Pull request / title`).
- **`.gitea/default_merge_message/SQUASH_TEMPLATE.md`**: the squash commit is `<PR title> (#<n>)` plus the description.
- **`.gitea/workflows/release.yml`**, on every push to main, as release-bot (`RELEASE_TOKEN`):
  - if the commit is a merged `chore(release): vX.Y.Z`: tag it vX.Y.Z (lightweight), push the tag (CI builds the image, Komodo deploys prod), publish the release with git-cliff's notes;
  - otherwise, if anything releasable landed since the last tag: rewrite the `release` branch (CHANGELOG.md) and open or update `chore(release): vX.Y.Z`.
- **`cliff.toml`** (git-cliff 2.14.2, pinned by sha512): feat → minor, fix/perf/revert → patch, breaking → minor while 0.x; chore/ci/docs/test/style/build/refactor alone don't release. Only conventional commits count, so the history before this is left out.
- **`CHANGELOG.md`**: header only; release PRs fill it.
- Agent notes (CLAUDE.md / AGENTS.md): the PR flow and title format; never tag by hand.

After merging, `Release` runs on main and should report nothing to release (this PR is `ci:`); the first `feat:`/`fix:` PR merged after it opens the first release PR.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Reviewed-on: #1
Co-authored-by: dhkatz <[email protected]>
2026-11-03 08:40:29 +00:00

2.5 KiB

t5de-hub

T5DE's hub (see README.md and docs/design.md). Related repositories, usually checked out beside this one: t5de (patches), t5de-proxy (local proxy, Go; it signs in to the hub), t5de-api (shared definitions), later t5de-catalog.

Rules

  • Never commit IMVU's code or captured traffic with account data. Our own declarations of IMVU's protocols and notes in our own words are fine.
  • Test with a throwaway IMVU account, never a real one.
  • Commits: author "dhkatz [email protected]"; never the user's real name or email.
  • Changes reach main only through pull requests, squash-merged: the PR's title becomes the commit on main, so it must be a conventional commit (feat(api): …, fix(web): …, docs: …; ! before the colon for a breaking change), checked by .gitea/workflows/pull-request.yml. Commits on the branch can be anything. Push a branch and open the pull request on git.t5de.dev (web UI or API); the user merges.
  • Releases: release-bot keeps a chore(release): vX.Y.Z pull request open (release.yml, git-cliff from those titles); merging it tags vX.Y.Z, which builds the image and deploys prod. Never tag by hand (v* tags are release-bot's).
  • IMVU session keys never leave the user's machine; the hub never asks for them.

Notes

  • Stack (the user's choice, 2026-10-29): Bun, Elysia, Better Auth, Drizzle (Postgres; PGlite in development and tests), Next.js 16 with Tailwind 4 and shadcn/ui, Turborepo. Must stay self-hostable (docker compose) and deployable to Vercel/Heroku-style hosts. Go was used first and replaced.
  • The website's look: modern and neutral, light/dark following the system, color only for status. Not IMVU Classic's style (T5DE's setup keeps that).
  • Better Auth's tables must match its plugins: when changing plugins, compare with getAuthTables (Better Auth logs "Drizzle schema mismatch" otherwise), then bun x drizzle-kit generate in packages/db.
  • Device sign-in: the person's viewing a code (deviceVerify) claims it, then deviceApprove; the hub's /api/v1/device/approve does both and logs it. Proxies' sessions are told apart by their User-Agent (t5de-proxy...).
  • On this VM, Bun and Node are portable installs in %LOCALAPPDATA%\Programs\bun and ...\nodejs (not on PATH; no bunx: use bun x).
  • Calls to IMVU (apps/api/src/imvu.ts, its public API) are rare and rate-limited: linking, age re-checks, rooms, and the IMVU products T5 products derive from (parent_info, looked up once per revision).