A little support. A world of possibility.
An open-source home for the projects, practices, and people you want to make more room for. Think creator support with AT Protocol identity, Habitat private data, and a small circle of recommendations that helps generosity travel.
TypeScript · pnpm · Astro · Tailwind CSS · Node · MIT licensed
Work in progress · early public preview. Feedme is not production-validated yet. Automated tests and the fictional demo cover the implemented flows; real Stripe onboarding/payments and Habitat/AT Protocol account interoperability still need the live acceptance checklist. Please use test accounts before accepting real money.
Explore Feedme at feedme.fund · Find creators · Try the demo · Use this template
Your community gives you resources and a signal about what they want more of. Supporters allocate a tip across your projects, from open source to everyday life. You receive their support regardless of progress and decide how to spend your time and resources. Public posts, follows, recommendations, and opt-in support cards help people discover the work around you.
Want an agent to help? Copy the setup prompt into Codex, Claude, or another assistant. The repository runbook walks through hosting, Bluesky login, Habitat private storage, Stripe, backups, and verification, with browser handoffs when you need to sign in. Start in an isolated sandbox, then create a separate production instance. Keys go directly into your host's secret settings, never into chat.
For a self-hosted installation that is easy to update, use the small deployment bundle attached to a numbered release once its publishing workflow has completed. It runs a prebuilt container with a pinned version and digest; your configuration and data survive image upgrades. See releases and upgrades. The source template below remains useful for development and code customization.
Use Node 24 LTS and pnpm 10.11.1.
pnpm install
cp .env.example .env
pnpm devOpen 127.0.0.1:4321. The default demo includes an example creator, editable projects, field notes, a private studio, and simulated tips. Choose Sign in → Explore the demo studio or Explore as a supporter. No accounts, credentials, or money required. Demo state persists in .data/demo.sqlite; live state uses a separate database.
pnpm check
pnpm test
pnpm build
pnpm startSuggested tips default to $11, $22, $44, and $88, with $22 prefilled. To customize them, set four comma-separated USD amounts in .env or your hosting environment, then restart the app:
TIP_AMOUNTS=11,22,44,88The second amount is the starting amount on both the homepage and project pages. Use four distinct values between $1 and $1,000, with up to two decimal places. Supporters can always enter a custom amount. The suggestions apply to one-time, monthly, and yearly tips; existing recurring payments keep their saved amounts.
Set LIBCARD_REPO=your-name/your-libcard (and optionally LIBCARD_REF=main) to use a public LibCard config as your profile. All links and socials accept picks by default—no per-link YAML needed, up to 99 plus the creator. Hide exceptions in Dashboard → Projects → From LibCard. Set LIBCARD_DEFAULT_SUPPORT=explicit to require per-item feedme.id values instead. Supporters use integer picks, review the exact split, and check out once. Public pick totals are available at /api/public/libcard for the separate LibCard integration.
Try the offline fixture with FEEDME_MODE=demo LIBCARD_REPO=example/libcard pnpm dev. Unset the repository to retain the existing percentage UI. Live mode still needs the normal Stripe, Habitat, and HTTPS setup. The GitHub Pages demo uses bundled LibCard picks with simulated payments.
To preview the real crs.land LibCard while keeping payments simulated: FEEDME_MODE=demo LIBCARD_REPO=crs48/LIBCard LIBCARD_DEMO_SOURCE=github BLUESKY_HANDLE=crs.land pnpm dev. This imports the public profile and full link rows with icons and real GitHub star counts, checks the source every 15 minutes while in use, and stores simulated activity in a separate demo-libcard.sqlite. All links and socials can be tried with picks in this preview, alongside labeled sample goals and support. Live mode uses separate IDs and real payment records. Goals can come from LibCard or a local override under Dashboard → Projects → From LibCard.
See LibCard setup, ingestion, public contract, and recovery and the contract verification and activation checklist. The matching LibCard schema/UI is merged into its main branch; install compatible versions of both apps before enabling it. Older LibCard versions reject nested opt-in fields.
Copy the template, then change this one identity setting in .env or your host’s environment:
BLUESKY_HANDLE=crs.land
# Optional: grant full admin access to more people.
ADMIN_ACCOUNTS=friend.bsky.social,another.exampleThe default creator/admin is @crs.land. For your own instance, replace it with your handle before the first live launch. In live mode, click Sign in, authenticate with that Bluesky/AT Protocol account, and open Dashboard at /studio. No separate admin password. A handle is verified through Habitat and pinned to its permanent DID in the persistent database; display names never grant permissions. Additional admins have the same access to private payment records and project publishing as the creator. Restart after changing configuration.
The demo uses a fictional account and an Explore the demo studio button, so no real Bluesky login is needed to preview the dashboard. For real login, complete live hosting setup; a handle does not replace HTTPS, encryption, or Stripe credentials. Existing installations can keep OWNER_DID, which overrides BLUESKY_HANDLE.
See the administration guide for project workflows, report definitions, admin removal, and identity recovery.
Backups and recovery: connect private storage, then configure a separate BACKUP_ENCRYPTION_KEY and an S3-compatible backup bucket. Live instances create encrypted backups every 15 minutes and verify them with a temporary restore. The dashboard can discover your saved Feedme in Habitat and prepare a clean-server recovery, including Stripe reconciliation. See the setup and restore guide. One active writer per private recovery space; an isolated Stripe sandbox can use a separate space for the same creator. Restoration requires stopping the server and reviewing the recovered data before resuming.
Releases and updates: reviewed release PRs produce numbered preview releases, tested amd64/arm64 container images and a small deployment bundle. Optional Renovate PRs update your pinned image; automatic upgrades are off. Studio → Settings shows the installed version. Follow the upgrade procedure to take a verified backup and preserve your data volume before replacing the container. A GitHub template copy does not automatically receive source updates.
- Server-rendered, responsive HTML pages with ordinary HTML forms. Core interactions work with JavaScript disabled; the allocation preview is a small progressive enhancement, and the optional video player loads on demand.
- A mobile-first interface combining Bluesky-inspired profiles and feeds with Stripe-style forms and matching hosted Checkout colors. See the appearance guide for theme customization.
- Choose one-time, monthly, or yearly support, with Stripe-hosted renewal management and a separate receipt for every successful payment. See recurring support.
- Split a single tip across projects from the homepage with linked percentage sliders and a live dollar breakdown. One Stripe Checkout handles the whole amount; project pages remain available for details.
- Confirmed public tips get a share link and a PNG preview of their top six project allocations, with percentages and rainbow progress beyond each aspiration. See public support cards.
- One creator per instance, with projects and ongoing support categories, optional aspirations, images, external links, and project status.
- AT Protocol OAuth through Habitat’s TypeScript identity resolver; any provider Habitat supports can supply the identity.
- Configurable Bluesky administrators (default
crs.land) and a private dashboard: draft/publish/archive projects, Markdown previews, weekly/monthly earnings, project performance, recurring support, searchable payments, CSV exports, supporter profiles, connection health, and admin activity. - A real public creator directory refreshed nightly from opt-in PDS profiles and matching websites. Join from Dashboard → Settings → Save & publish profile; no registry account required. Discover creators you follow, mutuals, followers, and friends of friends through Bluesky; browse the public network or search a handle. Public recommendations travel with your own PDS. See discovery.
- Native creator/friend follows, portable project subscriptions, a Following feed, and explicit public messages after tipping.
- Markdown project stories with safe images and video embeds. Project logs use native Bluesky posts, including imported photo/video posts.
- Author avatars on posts, with bundled demo portraits and responsive project photography. Missing portraits use initials; anonymous supporters use a generic icon.
- Profile and project supporter timelines with public amounts and separately permitted anonymous entries. Private tips stay hidden.
- One-time USD support with anonymous, creator-private, or public identity choices.
- Stripe hosted Checkout with optional own-account mode for personal sites, Connect onboarding, signed webhooks, and refund/dispute reconciliation.
- Habitat private receipt storage and public PDS records, backed by an encrypted operational database and a durable retry queue.
- Docker/Compose, a Render Blueprint, Fly.io and Railway configuration, and GitHub Actions checks.
Integration status: the real provider adapters are implemented and tested with fixtures. Live Habitat OAuth/space writes and Stripe test-account onboarding/payment have not been exercised with an operator account. Complete the live acceptance checklist before taking real payments. Habitat is actively changing; the SDK and the source revision reviewed here are documented in the data model.
flowchart LR
Browser[Fast HTML and ordinary forms] --> App[Feedme / Node]
App --> OAuth[Habitat identity resolver + AT Protocol OAuth]
App --> DB[(Encrypted SQLite operational store)]
DB --> Queue[Durable sync queue]
Queue --> Public[Public PDS: projects, profile, updates, circle]
Queue --> Private[Habitat private space: support receipts]
Queue --> Ack[Public PDS: opt-in acknowledgments]
App --> Stripe[Stripe hosted Checkout]
Stripe --> Events[Signed payment events]
Events --> DB
Tips go to the creator regardless of progress. An aspiration is not an escrow threshold. Direct charges live on the creator’s connected Stripe account. Feedme adds no application fee; Stripe and hosting fees still apply.
Private and anonymous tips do not affect public counters. Anonymous means Feedme stores no supporter DID, not that the payment is anonymous to Stripe or the recipient. Tip notes are always private. Anonymous timeline entries require a separate opt-in and expose only the project and date. Public acknowledgment requires sign-in and explicit consent, and public records can be copied by the network.
Start with Render for the shortest setup, or Railway if you already use it. Feedme runs as one Node server with a persistent disk. You do not need to host your own PDS or Habitat server.
The Render button provisions a service and persistent disk from render.yaml; review the paid resources before deploying. The other buttons open guided setup. All routes start with a demo unless you configure live mode. A hosted demo has a shared, editable studio: use sample data only.
This is a public, MIT-licensed template repository. Use this GitHub template to make your own copy; update crs48/feedme in the Render and Koyeb button URLs to deploy your copy. The Render Blueprint itself uses whichever repository contains it.
| Option | Included setup | What you provide |
|---|---|---|
| Render | Deploy button; Docker server, 1 GB disk, health check, one instance | Render account, GitHub access; paid service and disk |
| Railway | Docker build, health check, one replica via railway.json | Select repo, attach /data volume, generate domain; usage billing |
| Fly.io | fly.toml, volume mount, HTTPS, health check | Fly CLI/account, unique app name, one Machine and volume |
| Coolify | Existing Dockerfile | Coolify server, GitHub connection, /data volume, domain |
| Dokploy | Existing Dockerfile | Dokploy server, GitHub connection, /data volume, domain |
| Docker Compose | compose.yaml, named volume and health check | VPS, Docker, HTTPS reverse proxy |
| Node on a VPS | pnpm build + pnpm start |
Node 24, process supervisor, persistent directory, HTTPS |
Render: click the button, connect GitHub, review the Blueprint, and deploy. The app uses Render's generated HTTPS URL automatically. Open it to try the demo. Automatic source redeploys are off; enable them for your own fork if desired. Render instructions.
Railway: click Setup → GitHub repository → select Feedme. Attach a volume at /data, generate a domain targeting port 4321, and deploy with one replica. The app picks up the generated domain automatically. A saved Railway one-click template has not been created yet; the guide includes the exact template recipe.
Your own server: clone your copy, then:
cp .env.example .env
# Set PUBLIC_URL to your HTTPS origin in .env before hosting publicly.
docker compose up --build -dCompose builds the app itself; Node and pnpm do not need to be installed on the host. Point an HTTPS reverse proxy at 127.0.0.1:4321. Keep the named volume when upgrading.
After deploying, set these in your host's secret/environment settings:
FEEDME_MODE=live,BLUESKY_HANDLE=your.handle, and aDATA_ENCRYPTION_KEYgenerated withnode -e "console.log(require('crypto').randomBytes(32).toString('hex'))". Back up the key separately from the disk.PUBLIC_URL=https://your-custom-domainif using a custom domain or VPS. Render, Railway, Fly.io, and Koyeb generated domains are detected automatically when this variable is absent. Don't copy the local.envURL to a hosted instance.- Stripe credentials:
STRIPE_SECRET_KEYandSTRIPE_WEBHOOK_SECRET. Sign in as the owner, create Habitat private storage, and open Dashboard → Settings → Set up Stripe. Follow the Stripe setup guide, testing first in an isolated sandbox deployment with its own data directory before configuring production.
Keep one running instance and persist the entire DATA_DIR (/data in the deployment configurations). Your handle is the only identity setting required; Feedme verifies and pins its permanent DID. Live hosting and payments still require HTTPS, encryption, and provider credentials. Follow identity/payment setup and the live acceptance checklist before taking real payments.
Self-hosted sites display your creator name beside the Feedme mark. Set an optional SITE_NAME environment variable, such as SITE_NAME="Tip Chris", for a custom header, browser title, and installed-app name. This leaves your Bluesky identity and profile name intact. A small Powered by Feedme badge links to feedme.fund; on mobile it sits in the footer, clear of donation controls. The official website and demo keep Feedme branding.
This launches a disposable demo. Its filesystem is ephemeral, and Koyeb currently describes its volumes as testing-only public preview, so this is not a live-payment hosting recommendation. Details and storage limitations.
feedme.fund is a static introduction to Feedme with a guided setup page and a tour of the public pages and administration dashboard. It does not accept payments or connect to real accounts. Try allocations, simulated tips, follows, project editing, and report filters without an account.
pnpm build:site
pnpm preview:site
# Open http://127.0.0.1:4322build:site builds the Node app, builds the marketing pages, and renders an explicit list of demo screens from a new, temporary, fictional database. It ignores .env, existing databases, provider credentials, and live mode. Only static files go into site-dist/. Demo edits stay in the current browser tab and can be reset; no payments or social posts are created. The example share link has a fixed sample image. With JavaScript disabled, screens remain browsable and simulation forms stay disabled.
The Pages workflow checks and rebuilds on pushes to main, manual runs, and nightly at 08:17 UTC, then publishes site-dist/ to feedme.fund. The nightly build refreshes fictional examples and collects the real public creator directory from opt-in PDS profiles. Collection is separate from the isolated demo export; it does not ingest live post feeds or private data. Creators publish once from Settings and appear after a successful verification scan. Clearing the discovery checkbox withdraws the profile from subsequent exports. Live instances read social feeds through their server and run synchronization independently. Forks do not automatically deploy the official domain. See the Pages deployment guide.
Your own live Feedme still needs the Node server and persistent storage. Pages cannot run OAuth sessions, Stripe webhooks, or private Habitat synchronization. Never upload .data/ or the server's dist/ directory as a public artifact.
| Location | Purpose |
|---|---|
site/, scripts/export-demo.mjs |
Static landing pages and isolated demo export |
src/pages/, src/components/ |
Astro HTML, forms, and page composition |
src/lib/model.ts |
Validation, money, privacy projections |
src/lib/auth.ts, habitat.ts |
Identity and protocol adapters |
src/lib/payments.ts |
Stripe integration and event reconciliation |
src/lib/db.ts, repository.ts |
Local persistence and durable outbox |
lexicons/ |
Draft public and private wire contracts |
docs/plans/foundation/ |
Checked implementation plan and later work |
Read the architecture, data model, social protocol, project content, and contributor guide. The fund.feedme.* namespace belongs to feedme.fund. See discovery and schema publication for the creator directory, social recommendations, prototype migration, and the required DNS/PDS publication steps.
The verification report records the passing local checks and the remaining real-account acceptance work.
Organization workspaces and Habitat roles; cross-instance discovery; incremental PDS ingestion and multi-writer replication; media uploads/native Bluesky video embeds; a separate Bitcoin provider. Stripe’s current crypto checkout supports stablecoins, not a Bitcoin option in this application.
This repository is a work in progress. The roadmap does not imply these later features already exist.
MIT · Copyright © 2026 Christopher Smothers. Bundled demo media attribution is listed in the media credits.