Build a AdonisJS Social Network

Build Canopy Commons, a neighborhood social network with AdonisJS, Edge, Tailwind, Lucid, PostgreSQL, session auth, Node, Nginx, VPS.

  • Difficulty Intermediate
  • Parts 12
  • Stack AdonisJS, Edge, Tailwind, Lucid, PostgreSQL, session auth, Node, Nginx, VPS

How this project works

Canopy Commons is the AdonisJS remake of Westloop: a neighborhood social network with accounts, profiles, follows, likes, comments, a following timeline, search, notices, and a real Ubuntu VPS deploy. Each numbered folder in fcc-adonis-social is a working snapshot.

The stack, and why these tools

JobChoiceWhy
Language / frameworkTypeScript, AdonisJSAdonis gives you Laravel-shaped structure in Node: Lucid, validators, and a first-party session guard. A social graph is relational — Lucid migrations and unique indexes beat assembling Express plugins.
DatabasePostgreSQLFollows, likes, and comments need foreign keys and unique pairs. SQLite is only for the first laptop boot.
CSSTailwind CSSFeeds, avatars, and a sticky nav are layout-heavy. Utilities stay in the templates you already edit.
JavaScriptHTMX + Alpine.jsHTMX posts likes and follows into Adonis controllers. Alpine only opens the account menu. A separate React SPA would add a second origin on the VPS.
AuthenticationAdonis session auth (Lucid users, hashed passwords)Use the official session guard and hash with scrypt. Do not store JWTs in localStorage for a first social app.
Process / proxyNode + PM2, Nginx, Let’s EncryptSame VPS shape as Westloop: one app process, Postgres on localhost, Nginx for TLS and static/media files.
Hosting / DNSHetzner Cloud CX22 (or Contabo / DigitalOcean), Cloudflare Registrar + DNSYou own the box. PaaS is easier and teaches less.
EmailConsole locally, Postmark in productionPassword reset must leave the laptop.

If you already finished the AdonisJS blog, keep going — this project adds a social graph and a VPS ship, not another CRUD journal.

Open GitHub repo →

Parts in order

Work through the parts in sequence. Each lesson explains the ideas, then points you to a runnable GitHub snapshot.