
# FeedLog
**Open-source feedback & roadmap tool. Self-host on Cloudflare Workers, Vercel, or Docker.**
[](./LICENSE)
[](https://github.com/linkcraftstudio/feedlog/discussions)
[](https://github.com/linkcraftstudio/feedlog)
[Live Demo](https://feedback.feedlog.ai) Β· [Documentation](./docs) Β· [Discussions](https://github.com/linkcraftstudio/feedlog/discussions)
---
> Collect product feedback, run a public roadmap, and publish changelogs β from a tool you own and control.
FeedLog is a feedback-collection and product-communication hub for software teams. Users post ideas, vote, and discuss; teams triage into a roadmap and publish changelog entries when features ship. Built on Nuxt 4, it deploys to three platforms with zero vendor lock-in.

## Why FeedLog?
- π **Deploy anywhere.** Cloudflare Workers, Vercel, or Docker β pick your stack, keep your data.
- π€ **AI-native, not AI-washed.** Similar-idea detection and AI-assisted changelog drafting β first-class features, not bolted-on chatbots.
- π¨ **Modern Vue stack.** Nuxt 4, TypeScript, Drizzle ORM, Tailwind CSS v4, shadcn-vue.
- π **MIT licensed, open core.** This repository is the complete current product. Future enterprise add-ons live separately; the open-source version stays fully functional.
- π¦ **Own your data.** Postgres + blob storage (Cloudflare R2, Vercel Blob, or any S3-compatible: AWS, MinIO, Alibaba OSS).
## Live Demo
Try FeedLog running in production: **[feedback.feedlog.ai](https://feedback.feedlog.ai)**
The roadmap, changelog, and feedback boards you see at that URL are all FeedLog itself running in production β every feature listed below was first requested, voted on, and shipped through it.
## Self Hosting
FeedLog is built to be self-hosted. Three deploy targets cover the common
cases: serverless platforms (Cloudflare Workers, Vercel) for zero-ops
managed hosting, and Docker for full control on a VPS / NAS / Docker PaaS.
Whichever path you pick, you'll need a **PostgreSQL 17+** with the
[`vector`](https://github.com/pgvector/pgvector) extension reachable from
the runtime. [Neon](https://neon.tech) and [Supabase](https://supabase.com)
both enable it via their UI; on self-hosted Postgres run
`CREATE EXTENSION IF NOT EXISTS vector;` once.
### `A` Deploy with Cloudflare Workers or Vercel
Both platforms offer a one-click deploy that forks the repo into your
account and prompts for the [required environment variables](#environment-variables)
in the same form. Build and deploy run automatically; no local toolchain
needed.
| Deploy to Cloudflare Workers | Deploy with Vercel |
| :---------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: |
| [![][cf-deploy-img]][cf-deploy-link] | [![][vercel-deploy-img]][vercel-deploy-link] |
- **Cloudflare Workers** uses Hyperdrive (Postgres acceleration) and R2
(blob storage). On first request, the deployed Worker serves a `/setup`
page that runs migrations against your Hyperdrive-bound database. Full
guide: [`docs/deploy/cloudflare-workers.md`](./docs/deploy/cloudflare-workers.md).
- **Vercel** runs `pnpm migrate && pnpm build` in the build step; failed
migrations abort the deploy and leave the previous version serving
traffic. Pair with Neon or Supabase from the Vercel Marketplace for the
fastest setup. Full guide: [`docs/deploy/vercel.md`](./docs/deploy/vercel.md).
#### Keep your fork up to date
Both platforms deploy from a fork of this repo, so to pick up upstream
fixes you'll want either a manual `git pull` from `linkcraftstudio/feedlog`,
or a scheduled GitHub Action (e.g. [`tgymnich/fork-sync`](https://github.com/tgymnich/fork-sync))
that opens a PR against your fork's `main` whenever upstream changes.
### `B` Deploy with Docker
Multi-arch image (`linux/amd64` + `linux/arm64`) on
`ghcr.io/linkcraftstudio/feedlog`. Works on any Linux host β VPS, NAS,
Coolify, Dokploy, Portainer, Kubernetes.
#### Quick start with the bundled `compose.yml`
The repo ships a [`compose.yml`](./compose.yml) that brings up the app
and a `pgvector`-enabled Postgres in one command. Three lines:
```bash
git clone https://github.com/linkcraftstudio/feedlog.git && cd feedlog
echo "BETTER_AUTH_SECRET=$(openssl rand -hex 32)" > .env
echo "SYSTEM_ADMIN_EMAILS=you@example.com" >> .env
docker compose up -d
```
The app is at `http://localhost:3000`. Sign up with an email listed in
`SYSTEM_ADMIN_EMAILS` to land as admin. Optional variables (OAuth, AI,
transactional email) can be added to the same `.env` β `compose.yml`
passes them through to the app container.
#### Single-container run
If you bring your own Postgres (with `pgvector`):
```bash
docker run -d --name feedlog -p 3000:3000 \
-e DATABASE_URL="postgresql://user:pass@host:5432/feedlog" \
-e BETTER_AUTH_SECRET="$(openssl rand -hex 32)" \
-e SYSTEM_ADMIN_EMAILS="you@example.com" \
ghcr.io/linkcraftstudio/feedlog:v0.1.0
```
The default image falls back to NuxtHub's local-filesystem driver for
uploads β fine for a trial; mount a volume on `/app/.data` to make
those uploads survive container restarts. For S3-compatible storage
(AWS S3 / R2 / MinIO / Alibaba OSS / etc.), set the `S3_*` env vars at
runtime β no rebuild needed. See [`docs/deploy/docker.md`](./docs/deploy/docker.md).
> [!TIP]
> Both quick starts pin to `:v0.1.0`. In production prefer an immutable
> tag (`:vX.Y.Z` or `:sha-abc1234`) over `:latest` to avoid surprise
> upgrades on `docker pull`.
### Environment variables
The three variables in the **Required** table are the minimum to boot a
working install. The most useful optional variables are listed below; the
[**full configuration reference**](./docs/configuration.md) (and
[`.env.example`](./.env.example) as the annotated source) covers
everything else β S3 storage, transactional email, platform-specific
overrides, and authentication toggles.
#### Required
| Variable | Required | Description | Example |
| --------------------- | :------: | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------ |
| `DATABASE_URL` | Yes | PostgreSQL 17+ connection string. The database must have the `vector` extension installed. On Cloudflare Workers, this is **replaced** by the Hyperdrive binding. | `postgresql://user:pass@host:5432/feedlog?sslmode=require` |
| `BETTER_AUTH_SECRET` | Yes | Session and cookie encryption secret, 32+ random characters. Generate with `openssl rand -hex 32`. Rotating it invalidates every existing session. | `0a1b2c3d4e5f...` (64 hex chars) |
| `SYSTEM_ADMIN_EMAILS` | Yes | Comma-separated emails granted admin role on **first sign-up**. Set this before any user signs up β otherwise the install has no admin and the dashboard is locked. | `you@example.com,ops@example.com` |
#### Common optional
| Variable | Required | Description | Example |
| --------------------------------------------- | :------: | -------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------- |
| `BETTER_AUTH_URL` | No | Public URL of the app (no trailing slash). Inferred from the request `Host` header by default. Set explicitly behind Host-rewriting proxies or to anchor OAuth callback URLs. | `https://feedback.yourdomain.com` |
| `GOOGLE_CLIENT_ID` / `GOOGLE_CLIENT_SECRET` | No | Enable Google OAuth. Authorized redirect URI: `/api/auth/callback/google`. | `β¦apps.googleusercontent.com` |
| `GITHUB_CLIENT_ID` / `GITHUB_CLIENT_SECRET` | No | Enable GitHub OAuth. Callback URL: `/api/auth/callback/github`. | `Iv1.abc123β¦` |
| `OPENAI_API_KEY` | No | Enable AI features (similar-idea detection, AI-drafted changelog entries). Without it, those features are silently disabled. | `sk-β¦` |
| `OPENAI_BASE_URL` | No | Override the OpenAI endpoint β works with Azure OpenAI, LiteLLM, self-hosted gateways. Defaults to `https://api.openai.com/v1`. | `https://your-litellm-host/v1` |
| `RESEND_API_KEY` | No | Enable transactional email via [Resend](https://resend.com) (password resets, optional sign-up verification). Without it, emails are logged to stdout. | `re_β¦` |
| `S3_ACCESS_KEY_ID` / `S3_SECRET_ACCESS_KEY` / `S3_BUCKET` (+ `S3_ENDPOINT` / `S3_REGION`) | No | Enable S3-compatible blob storage at runtime β works with AWS S3, Cloudflare R2, MinIO, Alibaba OSS, Tencent COS, etc. Without these, uploads use NuxtHub's local-filesystem driver. See the [service cheat sheet](./docs/configuration.md#s3-compatible-storage). | `LTAI5tβ¦` / `β¦` / `feedlog-prod` (+ endpoint/region) |
[cf-deploy-img]: https://deploy.workers.cloudflare.com/button
[cf-deploy-link]: https://deploy.workers.cloudflare.com/?url=https://github.com/linkcraftstudio/feedlog
[vercel-deploy-img]: https://vercel.com/button
[vercel-deploy-link]: https://vercel.com/new/clone?repository-url=https%3A%2F%2Fgithub.com%2Flinkcraftstudio%2Ffeedlog&project-name=feedlog&repository-name=feedlog&env=DATABASE_URL,BETTER_AUTH_SECRET,SYSTEM_ADMIN_EMAILS&envDescription=DATABASE_URL%3A%20Postgres%20connection%20string%20with%20pgvector%20enabled%20(Neon%20or%20Supabase%20from%20the%20Vercel%20Marketplace%20works%20out%20of%20the%20box).%20BETTER_AUTH_SECRET%3A%2032%2B%20char%20random%20string%20(run%20%60openssl%20rand%20-hex%2032%60).%20SYSTEM_ADMIN_EMAILS%3A%20your%20email%2C%20granted%20admin%20role%20on%20first%20sign-up.&envLink=https%3A%2F%2Fgithub.com%2Flinkcraftstudio%2Ffeedlog%2Fblob%2Fmain%2Fdocs%2Fdeploy%2Fvercel.md
## Features
- **Feedback boards** β Organize ideas into public or private boards with voting, categories, and status workflows.
- **Roadmap** β Drag-and-drop view of planned, in-progress, and shipped work.
- **Changelog** β Publish release notes with AI-drafted style presets (concise, structured, benefit-led, witty).
- **Similar-idea merge** β Vector embeddings (OpenAI `text-embedding-3-large`, 768-dim) surface duplicate feedback before it fragments the board.
- **Authentication** β Email / password, Google OAuth, GitHub OAuth, admin role handling β powered by [better-auth](https://www.better-auth.com).
- **Comments & discussions** β Markdown-powered threads on every post.
- **Notifications** β Authors and upvoters are subscribed automatically and emailed when a post's status changes or the team replies officially; unsubscribe per post at any time. Admins aren't notified. Requires an email provider.
- **Inbox** β Manage Widget conversations, human handoffs and reply email notifications.
## Tech Stack
| Layer | Choice |
|-------|--------|
| Framework | Nuxt 4 (Vue 3, Nitro, TypeScript) |
| Database | PostgreSQL 17+ with `pgvector` for embeddings |
| ORM / driver | Drizzle ORM + `postgres-js` |
| Authentication | better-auth (email/password + Google OAuth + GitHub OAuth + admin plugin) |
| AI | OpenAI-compatible API (OpenAI, Azure, LiteLLM, Ollamaβ¦) |
| Blob storage | Cloudflare R2 binding, Vercel Blob, or S3-compatible via `aws4fetch` (AWS, MinIO, OSS) |
| State | Pinia |
| UI | Tailwind CSS v4, shadcn-vue (new-york), Lucide icons |
| Editor | md-editor-v3 |
| Deploy targets | Cloudflare Workers, Vercel, Node.js Docker |
| Package manager | pnpm |
## Local Development
```bash
git clone https://github.com/linkcraftstudio/feedlog.git
cd feedlog
pnpm install
cp .env.example .env # fill in DATABASE_URL, BETTER_AUTH_SECRET, SYSTEM_ADMIN_EMAILS
pnpm migrate # initialize database schema
pnpm dev # http://localhost:3000
```
See [`CONTRIBUTING.md`](./CONTRIBUTING.md) for the full development setup
and PR process.
## Roadmap
Live, user-voted roadmap: **[feedback.feedlog.ai/roadmap](https://feedback.feedlog.ai/roadmap)**.
Release history: see [`CHANGELOG.md`](./CHANGELOG.md).
## Contributing
Pull requests, bug reports, and feature discussions are welcome.
- Read [`CONTRIBUTING.md`](./CONTRIBUTING.md) for development setup and the PR process.
- All commits are signed off under the [DCO](https://developercertificate.org/) (`git commit -s`).
- See [`CODE_OF_CONDUCT.md`](./CODE_OF_CONDUCT.md).
## Security
Found a vulnerability? Please email **feedlog.oss@outlook.com** rather than filing a public issue. See [`SECURITY.md`](./SECURITY.md) for details and response timelines.
## Community
- **[GitHub Discussions](https://github.com/linkcraftstudio/feedlog/discussions)** β questions, ideas, show-and-tell
- **[Issue tracker](https://github.com/linkcraftstudio/feedlog/issues)** β bugs and feature requests
## License
[MIT](./LICENSE) Β© 2026 LinkCraft Studio