A surveillance-free space: create groups, share messages, and read what matters — no tracking, no algorithms.
Human stories & ideas · Built for people · Made for privacy
⭐ Star this repo if you believe people deserve the right to share without exposing their identity.
Openbin is a privacy-first groups platform. Create public or private communities where people write, reply, and inspire one another — without feeds engineered to keep you hooked, without accounts tied to your email, and without telemetry collection.
A service for humans: AI/LLM scraping, crawling, and automated collection of content or metadata are prohibited.
I carried out this project largely — over 90% — with Claude's help, so you'll probably find some "vibe coding". In that regard, I don't have much to say; I was just looking for something quick that would meet my needs so I could move on to another project.
Feel free to contribute, open issues, and submit PRs. I really appreciate it. Thanks again, and I hope you find Openbin useful.
- Groups for humans. Public or private spaces, open or moderated, made by people for people.
- Threaded messaging. Reply, react with emoji, edit within a 5-minute window, and keep conversations organized.
- Hooks (integrations). Connect your services: a Hook publishes (or updates) a post in a group via an incoming URL. A Hook is an integration, never a user — it can't read the group, can't reply, and doesn't act like a human.
- Lightweight moderation. The creator approves members in moderated groups, hides messages, and resolves reports.
- Notifications. Get alerts via ntfy when there's activity in your groups.
- Self-destruct. Set message expiry (1 day, 1 week, 1 month, 3 months) and per-group slow mode.
- Ephemeral identity. You sign up with a 16-digit code stored in a cookie; your default name is
anon-XXXX-XXXXand you can change it once. No email, no passwords.
- No tracking or telemetry.
- No permanent accounts or email.
- External URLs show a warning before leaving the platform.
- Expiring messages are deleted automatically (cleanup cron).
- Legacy IPFS content stays reachable via a gateway redirect.
| Layer | Technology |
|---|---|
| Framework | Astro 5 (server output) |
| UI | React + Tailwind CSS |
| Deployment | Vercel (@astrojs/vercel) |
| Database | Vercel Postgres / Neon (@vercel/postgres) |
| Rate limiting | Vercel KV (@vercel/kv) |
| Notifications | ntfy |
| IDs | nanoid |
Requires Node.js 18+ and a Postgres database (e.g. Vercel Postgres or Neon).
# 1. Install dependencies
npm install
# 2. Configure environment variables
cp .env.example .env
# fill in POSTGRES_URL (and optionally KV_*, ntfy, PUBLIC_APP_URL)
# 3. Create the database schema
npm run db:setup
# 4. Start the dev server
npm run devThe app will be available at http://localhost:4321.
| Command | Description |
|---|---|
npm run dev |
Dev server |
npm run build |
Production build |
npm run preview |
Preview the build |
npm run db:setup |
Create/update tables in Postgres |
Copy .env.example to .env and set:
| Variable | Description |
|---|---|
POSTGRES_URL |
Postgres connection string (required) |
KV_URL, KV_REST_API_TOKEN, KV_REST_API_READ_ONLY_TOKEN |
Vercel KV for rate limiting (optional) |
UPLOAD_MAX_SIZE |
Max logo size in bytes (default 5 MB) |
UPLOAD_RATE_LIMIT, UPLOAD_RATE_WINDOW |
Upload limits |
PUBLIC_APP_URL |
Public app URL (for links in notifications) |
NTFY_SERVER, NTFY_TOPIC_PREFIX |
ntfy server and topic prefix |
src/
layouts/ Base and form layouts
components/ Nav, status, icons
lib/ db, auth, groups, hooks, ntfy, ratelimit, language
pages/
index.astro Landing
group/ Group list, creation and view
create-account.astro "Curator" signup
login.astro Login
api/ Endpoints (groups, hooks, curators, cron)
ipfs/[cid].ts IPFS gateway redirect (legacy)
A Hook exposes an incoming URL (POST). Your service sends:
curl -X POST "https://YOUR_APP/api/hooks/obhk_xxx" \
-H "Content-Type: application/json" \
-d '{"content": "New release published 🚀"}'content(ortitle): the post text.update_last: true: updates the Hook's most recent post instead of creating a new one.- Limit: 1 post every 2 seconds per Hook.
- Connect the repo to Vercel.
- Add the environment variables (Postgres, KV, ntfy).
- Run
npm run db:setuponce (or letensureSchema()create the tables on first use). - Schedule
/api/cron/cleanupto delete expired messages.
Pull requests and issues are welcome. When contributing, remember that Openbin is a service for humans: keep privacy on by default and don't introduce telemetry or tracking.
Share freely. Keep your privacy.
✨ Thanks for visiting Openbin!