Skip to content

End-to-End Walkthrough

With the backend on Railway and the frontend on GitHub Pages, Bulletin is a fully deployed full-stack application. This lesson walks through every user flow to verify the complete system works.

Browser (GitHub Pages)
→ HTTPS request
→ Railway (Express + SQLite)
→ Response
→ React updates UI

Both halves are live. Every API call crosses the internet — latency is real, CORS is live, and the database is persistent.

  1. Visit your GitHub Pages URL
  2. Click Register
  3. Enter a username and password — submit
  4. You should be logged in and redirected to the feed
  5. Open your database viewer or call GET /users — confirm the new user record exists

If registration fails, check:

  • The Railway API is running (Railway dashboard → service logs)
  • CORS allows your GitHub Pages origin
  • VITE_API_URL points to the correct Railway URL
  1. Log in as your test user
  2. Click New Post
  3. Enter a title and body — submit
  4. You should land on the new post’s detail page
  5. Navigate back to the feed — confirm the post appears
  1. Navigate to any post
  2. You should see the comment form (you’re logged in)
  3. Submit a comment
  4. Confirm it appears in the list immediately
  5. Refresh the page — confirm it persists (it’s in the database)
  1. On any post in the feed, click the ▲ button
  2. The count should increment immediately (optimistic)
  3. Wait a moment — the count should settle at the server’s value
  4. Reload the page — confirm the count persisted
  1. Click any username in the feed
  2. Confirm the profile page loads with the user’s post history
  3. Click one of the posts in the history — confirm the detail page loads
  1. Log out
  2. Try to navigate directly to /bulletin/create
  3. Confirm you’re redirected to /login
  4. Log in — confirm you’re redirected back to /create

You can’t easily simulate a 24-hour token expiry in testing, but you can verify the interceptor works:

  1. Log in
  2. Open browser DevTools → Application → Local Storage
  3. Manually corrupt the token value
  4. Try any authenticated action (upvote, create post)
  5. Confirm you’re automatically logged out
LayerTechnologyDeployed on
DatabaseSQLite + better-sqlite3Railway (persisted on disk)
APINode.js + Express + TypeScriptRailway
Authbcrypt + JWT
FrontendReact + TypeScript + ViteGitHub Pages
CI/CDGitHub Actions

This is a complete, working, deployed full-stack application. Both halves are independently deployable — the API is a standalone service that any client (React, mobile, CLI) can use.

Follow the walkthrough above with your deployed Bulletin app.

  1. Complete all six walkthroughs (registration, create post, comment, upvote, profiles, auth protection).
  2. Check each one off as you verify it works end-to-end.
  3. If any flow is broken, use browser DevTools → Network tab to see the failing request, and Railway logs to see the server-side error.
  • Verify every user flow on the deployed app — integration bugs only appear end-to-end.
  • Network tab + Railway logs is the debugging toolkit for deployed API issues.
  • The complete stack: SQLite → Express → Railway → GitHub Pages → React.
  • Both halves are independently deployable REST services.