create-tangled-repo#
A small Bun + Playwright helper that creates Tangled repositories through Tangled's real appview flow.
It logs in through the Bluesky OAuth page when needed, saves a reusable Tangled web session locally, and then creates repositories by posting to the same /repo/new route the web UI uses.
Why this exists#
Tangled exposes lower-level repo creation plumbing, but creating a repo directly through the knot XRPC path can leave you with a repo that the appview does not ingest. This tool uses the appview-backed path so the created repo shows up properly in Tangled.
Requirements#
- Bun
- A Tangled / Bluesky account
- Your normal account password for the Bluesky auth flow
- A Tangled knot where you can create repos
The script downloads Playwright Chromium automatically on first run.
Usage#
bun install
./create-tangled-repo.js --identifier alice.mosphere.at --password 'your-normal-password' my-repo
You can create more than one repo at once:
./create-tangled-repo.js repo-one repo-two
The script remembers the last knot you used. If no knot is configured yet, it defaults to knot1.tangled.sh.
Options#
--identifier <handle> Bluesky/Tangled handle for login, if a new session is needed
--password <password> Account password for OAuth login, not an app password
--knot <domain> Knot domain to host the repo on
--branch <name> Default branch. Default: main
--description <text> Optional repo description
--host <url> Tangled appview base URL. Default: https://tangled.org
--session-file <path> Stored session state file
--config-file <path> Stored config file
--login-only Refresh/login and save session, create nothing
--show-browser Show the browser window during login
Cache files#
By default the script stores:
- session state in
/workspace/.cache/tangled/session.json - config in
/workspace/.cache/tangled/config.json - Playwright browsers in
/workspace/.cache/ms-playwright
You can override those with environment variables.
Notes#
- The password is your normal account password, not an app password.
- App passwords are fine for the lower-level protocol path, but that path can create ghost repos.
- This script intentionally takes the dirty path because it is the one that works today.