Thanks for wanting to contribute! This guide covers the practical steps: running the project locally, the kind of changes we're looking for, and how to send a pull request.
- Bug reports — the more reproducible, the better. Open an issue.
- Feature proposals — discuss first in Discussions before writing code. Large changes without prior discussion may be redirected.
- Documentation — fixes to
README.md, deploy guides indocs/deploy/, and inline code comments are always welcome. - Code — bug fixes, new features (after discussion), tests, refactors.
-
Node.js 22+
-
pnpm 10+ (managed via
packageManagerfield inpackage.json— enable withcorepack enable) -
PostgreSQL 17+ with the
vectorextension. For local dev, the easiest path is thepgvector/pgvectorDocker image:docker run -d --name feedlog-pg \ -e POSTGRES_PASSWORD=postgres \ -e POSTGRES_DB=feedlog \ -p 5432:5432 \ pgvector/pgvector:pg17
# Clone
git clone https://github.com/linkcraftstudio/feedlog.git
cd feedlog
# Install deps (postinstall runs `nuxt prepare`)
pnpm install
# Copy the env template and fill in at least DATABASE_URL and BETTER_AUTH_SECRET
cp .env.example .env
# Run migrations
pnpm migrate
# Start the dev server
pnpm dev # http://localhost:3000| Command | Purpose |
|---|---|
pnpm dev |
Start Nuxt dev server with HMR |
pnpm build |
Production build for Node server preset |
pnpm preview |
Preview the production build locally |
pnpm generate:migration |
Generate a Drizzle migration after schema changes |
pnpm migrate |
Apply pending migrations |
pnpm build:cf |
Production build for Cloudflare Workers preset |
pnpm deploy:cf |
Deploy the CF build via wrangler |
app/— frontend: pages, components, composables, Pinia storesserver/— backend: API routes, database, server utils, pluginsserver/db/schemas/— Drizzle schema (entry point:index.ts)server/db/migrations/— SQL migrations (generated, do not edit by hand)shared/— code importable from both frontend and backend (types, Zod schemas)docs/deploy/— self-hosting guides for the three supported platforms
For anything non-trivial, please open a Discussion or a draft issue first. This avoids the awkward case where a PR gets closed because the approach doesn't fit the project's direction.
- Language in code: all identifiers, comments, commit messages, and user-facing strings are in English.
- TypeScript: strict typing. Prefer inferred types at usage sites and explicit types at module boundaries.
- UI components: shadcn-vue is installed via CLI, not manually:
pnpm dlx shadcn-vue@latest add <component>. - Database changes: run
pnpm generate:migrationafter schema edits; commit both the schema change and the generated SQL. - No unexplained internal references: never commit URLs, email addresses, or organization names that belong to an internal deployment.
If you change server/db/schemas/ or server/api/ in a way that affects the
public shape of the app, please update the relevant docs/ entry in the
same PR.
- Fork the repo and create a topic branch:
git checkout -b fix/short-description - Make your changes. Keep the scope focused — one PR per concern.
- Sign off your commits with DCO:
git commit -s -m "..."The-sappends aSigned-off-by:trailer, which confirms you agree to the Developer Certificate of Origin. No CLA required. - Push your branch and open a PR against
main. - Fill in the PR template. Link the issue or discussion that motivated the change.
- CI runs on every PR (build and Docker validation). Please ensure it passes before asking for review.
Short imperative subject line, optional detailed body:
fix(admin): prevent duplicate board slugs on rename
The slug generator was running before the conflict check, so two admins
renaming to the same target within a few seconds would both succeed and
collide on next read. Reorder to validate after generation.
Conventional Commits (feat:, fix:, chore:, docs:, refactor:,
test:) are preferred but not required.
This project follows the Contributor Covenant. By participating, you agree to uphold it.
Please do not open a public issue for security vulnerabilities. Follow
the process in SECURITY.md instead.
By contributing to FeedLog, you agree that your contributions will be licensed under the MIT License.