Skip to content

Repository files navigation

Openbin

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

Ask DeepWiki Docs Say Thanks! Privacy First GitHub repo size Coffee Drunk

⭐ 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.


What is Openbin

  • 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-XXXX and you can change it once. No email, no passwords.

Privacy principles

  • 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.

Tech stack

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

Getting started

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 dev

The app will be available at http://localhost:4321.

Scripts

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

Configuration

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

Structure

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)

Hooks (integrations)

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 (or title): 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.

Deploying on Vercel

  1. Connect the repo to Vercel.
  2. Add the environment variables (Postgres, KV, ntfy).
  3. Run npm run db:setup once (or let ensureSchema() create the tables on first use).
  4. Schedule /api/cron/cleanup to delete expired messages.

Contributing

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 Share Share Share Share

Share freely. Keep your privacy.

✨ Thanks for visiting Openbin!

Views

About

A privacy-first home for anonymous groups, communities, and conversations for humans — no tracking, no algorithms, no bots.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Contributors

Languages