Final Review and Next Steps
Final Review and Next Steps
Run through the whole app
With your seeded data in place, walk through every feature one more time:
- Home — search for a name, phone fragment, or company; page through
results if you have enough contacts; click into a few - Detail page — star and unstar a contact; confirm phone/email links work
- New / Edit — create a contact with two groups checked; edit an
existing one to add a third - Delete — confirm the dialog appears, and cancel it at least once
before actually deleting something - Favorites — confirm it only shows starred contacts, and that search
still works within it - Groups — open a group’s page, confirm its contact count and list match
- Settings — export a CSV, then import it back in
If anything doesn’t behave as expected, the checkpoint at the end of the
relevant lesson describes exactly what should be true — that’s the fastest
way to find where things diverged.
What you built
Look back at the file tree now versus the empty shells you started with in
Module 1:
lib/db.ts— a single, reused connection poollib/contacts.tsandlib/groups.ts— every read and write, in plain SQLlib/actions.ts— every Server Action, the single bridge between your
forms and your datacomponents/— a handful of small, mostly server-rendered pieces, and
exactly one Client Component (DeleteContactButton), because that was
the only place one was actually needed- Nine working routes under
app/, each reading live data with
export const dynamic = "force-dynamic"
Nothing here reaches for a client-side data library, a REST API layer, or
an ORM. That’s not a limitation of this project — it’s a demonstration
that for an app like this, Server Components and Server Actions are
usually enough on their own.
Where you could take it next
None of these are built in this course — they’re deliberately left as
your next step, using the same patterns you just practiced:
- Authentication — scope contacts to a logged-in user (
user_idon
thecontactstable, a login flow) - Contact photos — an image field, plus a place to store the file
- Bulk actions — checkboxes on the Home page list, a Server Action
that deletes or re-groups several contacts at once - A smarter CSV import — detect and merge duplicates by email instead
of always inserting a new row - Birthdays — a date field, plus a “coming up this month” section on
the Home page
Each of those is a reasonable-sized project on its own, using the exact
same building blocks — a data function, a Server Action, and a page — you
now have real practice with.
Checkpoint
Every feature in the app works end to end, using data you seeded yourself,
and you can describe — without looking anything up — why exactly one
component in this project needed "use client".