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.
The full system
Section titled “The full system”Browser (GitHub Pages) → HTTPS request → Railway (Express + SQLite) → Response → React updates UIBoth halves are live. Every API call crosses the internet — latency is real, CORS is live, and the database is persistent.
Walkthrough: Registration
Section titled “Walkthrough: Registration”- Visit your GitHub Pages URL
- Click Register
- Enter a username and password — submit
- You should be logged in and redirected to the feed
- 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_URLpoints to the correct Railway URL
Walkthrough: Creating a post
Section titled “Walkthrough: Creating a post”- Log in as your test user
- Click New Post
- Enter a title and body — submit
- You should land on the new post’s detail page
- Navigate back to the feed — confirm the post appears
Walkthrough: Commenting
Section titled “Walkthrough: Commenting”- Navigate to any post
- You should see the comment form (you’re logged in)
- Submit a comment
- Confirm it appears in the list immediately
- Refresh the page — confirm it persists (it’s in the database)
Walkthrough: Upvoting
Section titled “Walkthrough: Upvoting”- On any post in the feed, click the ▲ button
- The count should increment immediately (optimistic)
- Wait a moment — the count should settle at the server’s value
- Reload the page — confirm the count persisted
Walkthrough: Profile pages
Section titled “Walkthrough: Profile pages”- Click any username in the feed
- Confirm the profile page loads with the user’s post history
- Click one of the posts in the history — confirm the detail page loads
Walkthrough: Auth protection
Section titled “Walkthrough: Auth protection”- Log out
- Try to navigate directly to
/bulletin/create - Confirm you’re redirected to
/login - Log in — confirm you’re redirected back to
/create
Walkthrough: Token expiry simulation
Section titled “Walkthrough: Token expiry simulation”You can’t easily simulate a 24-hour token expiry in testing, but you can verify the interceptor works:
- Log in
- Open browser DevTools → Application → Local Storage
- Manually corrupt the token value
- Try any authenticated action (upvote, create post)
- Confirm you’re automatically logged out
What you’ve built
Section titled “What you’ve built”| Layer | Technology | Deployed on |
|---|---|---|
| Database | SQLite + better-sqlite3 | Railway (persisted on disk) |
| API | Node.js + Express + TypeScript | Railway |
| Auth | bcrypt + JWT | — |
| Frontend | React + TypeScript + Vite | GitHub Pages |
| CI/CD | GitHub 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.
Exercise
Section titled “Exercise”Follow the walkthrough above with your deployed Bulletin app.
- Complete all six walkthroughs (registration, create post, comment, upvote, profiles, auth protection).
- Check each one off as you verify it works end-to-end.
- 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.