Italian paperwork, online, with the price shown before you start. Then I redesigned it.
Chapters7 · 1:19
Before you open, the questions start. “How much is the 730?” “Which documents do I need?” “Any update?”, asked twelve times before nine.
Let us handle the chaos. Smart CAF: your CAF office, online.
Your clients see every price up front, find the right service in seconds and upload their documents online. Your office gets every application complete, and clients follow every step: no “any update?” calls.
That’s your client’s side. Now, yours. The one screen your team works from: navigation; your views (assigned to me, unassigned, awaiting documents, overdue); every case with its status, payment, owner and due date; and search, from anywhere, with Ctrl K.
Walk-ins and calls, filed in seconds. Assign any case in one key. Clients hear about it instantly, by app and email. Missing a page? Ask from the case. They upload it, and the status updates itself.
Same office. Quieter phone. “Thanks! I saw the status online.”
Run a CAF? Let’s build yours. Prices, documents, requests, updates, cases, your team: your CAF office, online. Book a demo at hello@silverfish.dev. Built and set up for your office by silverfish.
Italian paperwork, online, with the price shown before you start. Then I redesigned it.
At a glance
- 01The problem
- Immigrants in Italy queue at offices without knowing the price or the documents needed.
- 02What I built
- An online office with fixed prices, phone uploads and case tracking. Then I redesigned it.
- 03The result
- Before is live at smartcaf.tech. After is online as a demo you can try.
Built with
Next.js · React · Express · MongoDB · Redis · Backblaze
The problem
Thousands of people in Italy, many of them immigrants, need help with paperwork: a tax return, a residence permit, a benefit for their children. The help exists, at offices called CAFs. But you usually find out the price and the list of documents only once you're there, often after queuing.
Smart CAF puts that office online: pick a service, see the fixed price, upload documents from your phone, and follow your case until it's done.
Words you'll need
- CAF
- A tax help centre
- Patronato
- Help with pensions, benefits and welfare
- ISEE
- Proof of household income, needed for many benefits
- Permesso di soggiorno
- A residence permit
- Codice fiscale
- The Italian tax code everyone has
Before and after
Same page, same day. Move between the stops to compare.
Five tasks, compared
Each line points to evidence in the code or on the live site.
-
01
First impression
From claims I couldn’t back up to a promise it keeps: the price, up front.
- Before
- Headline “Simplify Your CAF Journey”, a stats row I couldn’t back up (15k+ processed, 99% success) and wording like “Official Portal”.smartcaf.tech, 30 Sep 2026
- After
- “Your paperwork in Italy, handled.” Fixed fees on 50+ services, and life moments like New to Italy.smartcaf.xilofy.com, 30 Sep 2026
-
02
Finding a service
A way in for people who don’t know a service’s name.
- Before
- Search and a category filter, loaded in the browser after the page arrives.client/src/app/page.tsx
- After
- The same search, plus seven life moments that open the most common service, with its price and turnaround.components/home/content.ts
-
03
Applying
Nothing is lost if you close the tab.
- Before
- A 5-step pop-up. Closing it lost everything, and the tax code was checked for length only.ApplicationForm.tsx
- After
- Seven short screens, one topic each. The draft saves on every change, files included, and errors are explained.lib/applications/draft.ts
-
04
Tracking a case
From “what’s my status?” to “what do I do next?”
- Before
- A status badge, a live-updates panel and a list of requested documents.ProfilePage.tsx
- After
- A timeline of what happened and what’s next, with the requested document in the step that needs it.app/applications/[id]
-
05
Staff back office
Built for the rush at the desk, with the gap stated.
- Before
- A dashboard with revenue charts, agent assignment and Excel export. No undo.admin/OverviewView.tsx
- After
- A triage inbox with saved views, bulk actions, undo everywhere and a keyboard-first walk-in screen. No revenue charts yet.components/admin/*
The numbers, all of them
All measurements, same day, same settings, nothing left out. After wins on accessibility, weight and first paint. Today it's slower to show its main content, and that's the next thing I'm fixing.
| Measure | Before | After | Better |
|---|---|---|---|
| Lighthouse Accessibility | 88 | 100 | After |
| Lighthouse Best Practices | 96 | 100 | After |
| Lighthouse SEO | 100 | 100 | Equal |
| Lighthouse Performance | 91 | 74 today | Before |
| First Contentful Paint* | 2.4 s | 1.2 s | After |
| Largest Contentful Paint* | 2.8 s | 4.6 s today | Before |
| Total Blocking Time | 109 ms | 368 ms | Before |
| JavaScript transferred | 233 KB | 241 KB | Before |
| Requests | 28 | 40 | Before |
| Page weight, home | 1,175 KB | 825 KB | After |
| Languages | English | English + Italian | After |
| Draft saved if you close the tab | No | Yes, files included | After |
| Undo for staff actions | None | Every action | After |
| Revenue charts for staff | Yes | Not yet | Before |
Decision After · demo The redesign was slower at first
- Why
- The trace shows about 2.2 s of main-thread work while the page hydrates, which holds back painting a hero photo that has already downloaded. The fix is fewer client components above the fold and deferring the animated rotating word.
- Cost
- Until it ships, the Performance row stays in the table, with the real number.
Try it
Apply for a service the way a client would. It runs on demo data.
Live demo Try the redesign smartcaf.xilofy.comBefore: what shipped
The engine under the product, and the part I'm proudest of.
Decision Before Approval rules live on the server
- Why
- Agents can't approve or reject a case, and nothing is assigned before payment arrives. The browser can't talk its way around it.
Decision Before Private documents stay private
- Why
- Files are stored per client, previews use links that expire, and ownership is checked before any link is issued.
Decision Before Invoices that can't drift
- Why
- An invoice PDF is generated when payment is confirmed and withdrawn if the payment is reversed, and every change is logged.
Decision Before Email that arrives
- Why
- Emails are queued, retried with back-off, and switched to a second provider if the first one fails.
For engineersTechnical
- Next.js 16 client, Express 5 API, MongoDB via Mongoose, Redis + BullMQ workers, Backblaze B2 with presigned URLs, Brevo with SMTP fallback, four Docker containers behind nginx.
- Credits are deducted with one conditional update, so a balance can never go negative.
What I'd do differently. v1 shipped without automated tests, and its home page made claims I couldn't back up. My later projects run tests in CI from day one, and the redesign only says what's true.
After: what changed, and why
Decision After · demo Prices frozen at submission
- Why
- v1 already showed a fixed price on every service, and that stays. v2 also records the price at the moment you submit, so a later catalogue change never rewrites your bill.
Decision After · demo One topic per screen
- Why
- 4 stages over 7 short screens. That's more screens than v1's 5 steps, but no screen needs scrolling on a phone.
Decision After · demo Never lose an application
- Why
- The draft saves on every change, uploaded files included. In v1, closing the pop-up meant starting again.
Decision After · demo Errors you can act on
- Why
- The codice fiscale is checked properly, including omocodia (letters that replace digits when two people would share a code), and mistakes are explained in plain words.
Decision After · demo A back office built for walk-ins
- Why
- One keyboard-first screen recognises a returning client by email, then tax code, then phone, so staff can file for someone standing at the desk.
Decision After · demo Undo everywhere
- Why
- Every staff action can be reversed and is logged with who did it.
Decision After · demo Say only what's true
- Why
- The v1 marketing stats were replaced with the one promise the product keeps: a fixed price, shown before you start.
For engineersTechnical
- A single repository layer is the seam where the demo storage is swapped for the real API.
- Deadlines come from the slowest service in a case, and cases show as overdue, due today or soon.
- Browser storage syncs across tabs through
useSyncExternalStore, without a signed-out flash while loading.
What I'd do next
Check documents before a human does. A small image model could tell whether an uploaded photo is the right document, and readable, before an advisor opens it. That would cut the back-and-forth that slows every case down.
Project receipt · Smart CAF
Checked 30 Sep 2026against code and the live site
- My part
- Portal, back office and redesign [to confirm]
- Before
- Next.js 16, Express 5, MongoDB, Redis + BullMQ, Backblaze B2, Brevo, 4 Docker containers behind nginx
- After
- A new front end: Next.js 16, React 19, Motion. Demo data for now
- Shipped
- Before live at smartcaf.tech · After online as a demo at smartcaf.xilofy.com
- Measured
- Lighthouse 12, mobile, median of 3 runs, 30 Sep 2026
- Sources
- smartcaf.tech · smartcaf.xilofy.com · both repos