A simple tool which lets you scrape twitter accounts and crosspost them to bluesky accounts! Comes with a CLI and a webapp for managing profiles! Works with images/videos/link embeds/threads.
···47./install.sh --stop
48./install.sh --status
49./install.sh --port 3100
0050```
5152If you prefer full manual setup, skip to [Manual Setup](#manual-setup-technical).
0000000000000000000000000000000000000000005354## What This Project Does
55···235236`update.sh`:
237238-- pulls latest code
0239- installs dependencies
240-- rebuilds native modules
241- builds server + web dashboard
242-- restarts PM2 process when PM2 is available
243-- preserves local `config.json` with backup/restore
00000000244245## Data, Config, and Security
246···253Security notes:
254255- first registered dashboard user is admin
000000256- if `JWT_SECRET` is missing, server falls back to an insecure default; set your own secret in `.env`
257- prefer Bluesky app passwords (not your full account password)
0000000000000000258259## Development
260
···47./install.sh --stop
48./install.sh --status
49./install.sh --port 3100
50+./install.sh --host 127.0.0.1
51+./install.sh --skip-native-rebuild
52```
5354If you prefer full manual setup, skip to [Manual Setup](#manual-setup-technical).
55+56+## Linux VPS Without Domain (Secure HTTPS via Tailscale)
57+58+If you host on a public VPS (Linux) and do not own a domain, use the server installer:
59+60+```bash
61+chmod +x install-server.sh
62+./install-server.sh
63+```
64+65+What this does:
66+67+- runs the normal app install/build/start flow
68+- auto-selects a free local app port if your chosen/default port is already in use
69+- forces the app to bind locally only (`HOST=127.0.0.1`)
70+- installs and starts Tailscale if needed
71+- configures `tailscale serve` on a free HTTPS port so your dashboard is reachable over Tailnet HTTPS
72+- prints the final Tailnet URL to open from any device authenticated on your Tailscale account
73+74+Optional non-interactive login:
75+76+```bash
77+./install-server.sh --auth-key <TS_AUTHKEY>
78+```
79+80+Optional fixed Tailscale HTTPS port:
81+82+```bash
83+./install-server.sh --https-port 443
84+```
85+86+Optional public exposure (internet) with Funnel:
87+88+```bash
89+./install-server.sh --funnel
90+```
91+92+Notes:
93+94+- this does **not** replace or delete `install.sh`; it wraps server-hardening around it
95+- normal updates still use `./update.sh` and keep your local `.env` values
96+- if you already installed manually, this is still safe to run later
9798## What This Project Does
99···279280`update.sh`:
281282+- stashes local uncommitted changes before pull and restores them after update
283+- pulls latest code (supports non-`origin` remotes and detached-head recovery)
284- installs dependencies
285+- rebuilds native modules when Node ABI changed
286- builds server + web dashboard
287+- restarts existing runtime for PM2 **or** nohup mode
288+- preserves local `config.json` and `.env` with backup/restore
289+290+Useful update flags:
291+292+```bash
293+./update.sh --no-restart
294+./update.sh --skip-install --skip-build
295+./update.sh --remote origin --branch main
296+```
297298## Data, Config, and Security
299···306Security notes:
307308- first registered dashboard user is admin
309+- after bootstrap, only admins can create additional dashboard users
310+- users can sign in with username or email
311+- non-admin users only see mappings they created by default
312+- admins can grant fine-grained permissions (view all mappings, manage groups, queue backfills, run-now, etc.)
313+- only admins can view or edit Twitter/AI provider credentials
314+- admin user management never exposes other users' password hashes in the UI
315- if `JWT_SECRET` is missing, server falls back to an insecure default; set your own secret in `.env`
316- prefer Bluesky app passwords (not your full account password)
317+318+### Multi-User Access Control
319+320+- bootstrap account:
321+ - the first account created through the web UI becomes admin
322+ - open registration is automatically disabled after this
323+- admin capabilities:
324+ - create, edit, reset password, and delete dashboard users
325+ - assign role (`admin` or `user`) and per-user permissions
326+ - filter the Accounts page by creator to review each user's mappings
327+- deleting a user:
328+ - disables that user's mappings so crossposting stops
329+ - leaves already-published Bluesky posts untouched
330+- self-service security:
331+ - every user can change their own password
332+ - users can change their own email after password verification
333334## Development
335