How to build a social network using ASP.NET Core Razor Pages, EF Core, PostgreSQL, Tailwind, cookie auth, Kestrel, Nginx, VPS

Build Northline Commons, a neighborhood social network with ASP.NET Core Razor Pages, EF Core, PostgreSQL, Tailwind, cookie auth, Kestrel, Nginx, VPS.

  • Difficulty Intermediate
  • Parts 12
  • Stack ASP.NET Core Razor Pages, EF Core, PostgreSQL, Tailwind, cookie auth, Kestrel, Nginx, VPS

How this project works

Northline Commons is the ASP.NET 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-aspnet-social is a working snapshot.

The stack, and why these tools

JobChoiceWhy
Language / frameworkC#, ASP.NET Core 8 Razor PagesRazor Pages keep each social screen (feed, profile, compose) in one page model. EF Core maps follows and likes with unique indexes. You ship one Kestrel process behind Nginx.
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 to Razor page handlers. A Blazor WASM frontend would move authorization to an API you then have to lock down twice.
AuthenticationASP.NET cookie authentication with Identity-style password hashingCookie auth with HttpOnly cookies and antiforgery tokens. Hand-roll the cookie; do not put JWTs in localStorage.
Process / proxyKestrel + systemd, 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 ASP.NET 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.