F Fora Mihai-AlexandruWeb & automation · Timișoara

Portfolio · September 2026

Five businesses.
Five websites.
No two look alike.

Every page below was written from that business's own Google reviews, opening hours and public record — then given a design language derived from what the business actually is. Not one template was swapped out. Not one claim was invented.

All of them are live right now. Click any of them and check.

  • 6live builds you can open
  • 5design systems, 0 templates
  • 1,014businesses scanned by my own tool
  • 0invented facts on any page

One developer · five design languages · scroll to see why each one is what it is

Where these came from — said plainly

I find a real local business with strong reviews and no website. I read everything public about them: the Google Places record, every review, the directory listings. Then I build the site first — finished, live, on a real URL — and only then message the owner with the link.

So these are spec builds. The owners did not commission them and none of them has paid me. I am saying that up front, because the alternative — quietly implying five paying clients — is exactly the sort of thing this whole approach exists to avoid. What they do prove is the only thing a portfolio can prove: that I can research a business I have never met, find the true thing worth saying, and ship a finished site around it in a day.

I

The websites

Five plates. Each one: what the business is, what its reviews actually said, and the design direction that came out of it.

Plate 01

Grădinița Kinderland

Private kindergarten · Timișoara, Romania · written in Romanian

kinderland-gradinita.pages.dev
Kinderland homepage: the headline reads Fără grabă. Fără presiune. Fără comparație.
Kinderland on a phone

The idea

The headline — „Fără grabă. Fără presiune. Fără comparație." — is not a slogan I wrote. It is a sentence a mother left in a Google review in August 2026. Twenty-two parents rated this kindergarten 5.0 and they all wrote about the same thing: nobody rushes the child. So the page says that, in her words, above the fold.

The reviews also gave me things the school's own page had never mentioned — that they knead bread on Thursdays, that Friday is „ziua altfel", that the teachers upload photos to an app every day. Those became sections. The design is a warm storybook world because the buyer is a nervous parent, not a procurement officer.

Refused: stock photos of other people's children, an invented founding year, a made-up accreditation, and the monthly fees — which sit on the live page as 000 until the owner supplies them.

Sector
Early years education
Source data
Google Places API · 22 reviews · the school's own page
Build
Hand-written HTML/CSS/JS · GSAP, ScrollTrigger, SplitText
Notable
Full Romanian diacritics, schema.org LocalBusiness, sticky call bar on mobile
Status
Spec build · sent to the owner

Plate 02

Sapphire Driving School

Driving school · Leicester, UK · 5.0 from 504 reviews

sapphire-driving-preview.netlify.app
Sapphire Driving School homepage: You're allowed 15 faults. Our learners use one.
Sapphire on a phone

The idea

Five hundred and four reviews. Not one below five stars. And no website — my scanner flagged them as "no site", which I assumed was a bug in my own code, so I checked the registry.

Their domain had expired. A drop-catching firm re-registered sapphiredrivingschool.co.uk in February 2026 and pointed it at a domain-resale page. Every person who Googles them and clicks the old link lands on an advert for their own domain. I took that to them along with three exact-name alternatives I had verified were still free.

The page itself takes the one number every learner already knows — the UK test allows 15 minor faults — and makes it the headline. The counter underneath fills one box out of fifteen.

Refused: prices (marked £00 — to confirm), instructor photos (hatched placeholders), any pass-rate figure. The instructors' names — Mubarak and Munira — appear only because their own reviewers wrote them.

Sector
Driver training
Source data
Google Places API · Nominet RDAP registry lookup · reviews
Build
Static HTML/CSS · baked responsive images · Netlify
Notable
The pitch was a domain-loss finding, not a design opinion
Status
Spec build · outreach asset

Plate 03

Drive Ease School of Motoring

Driving instructor · Wollaton, Nottingham · 4.7 from 63 reviews

drive-ease.pages.dev
Drive Ease homepage: Learning to drive is frightening. That's the part Kalim is good at.
Drive Ease on a phone

The idea

Sixty-three reviews and almost none of them mention price or speed. They mention fear. "Patient, calm and professional… even when I made mistakes." "Gave me lots of confidence for my test." Every competitor in Nottingham leads with pass rates. This one leads with the fear, and names the instructor: "Learning to drive is frightening. That's the part Kalim is good at."

The design world is the Highway Code — numbered rules, drawn junction diagrams, and the British sign grammar where a triangle warns, a circle instructs and a rectangle informs. It is the calmest document in British life, and calm is what he is actually selling. Light ground, deliberately: a dark treatment would have made a driving instructor look like a SaaS company.

Refused: price per hour, block-booking discounts, a pass-rate percentage, years of experience, ADI grade. None of it exists in the source data, so none of it is on the page.

Sector
Driver training
Source data
Google Places API · public reviews quoted verbatim
Build
Hand-written HTML/CSS/JS · GSAP ScrollTrigger · SVG diagrams drawn in code
Notable
Every illustration is hand-written SVG — zero photography, zero stock
Status
Spec build · outreach asset

Plate 04

Ronnie Gears

Mobile car mechanic · Long Eaton, Nottingham · 4.9 from 58 reviews

ronnie-gears.pages.dev
Ronnie Gears homepage: He comes to your drive.
Ronnie Gears on a phone

The idea

Two things repeat in his reviews. He is mobile — "all done on my drive" — which was completely invisible online. And he is honest: two garages told one customer to scrap a car that needed "a new engine"; Ronnie replaced the timing chain and injector valves and it "runs like a new car". That story is the hero of the page, because it is the single most persuasive thing anyone has ever written about him.

The world is a mechanic's shadow board — the foam panel where every tool has a routed cut, so a missing tool is instantly visible. "Everything accounted for, nothing hidden" is literally what his reviews say about him, and it carries the whole page with no photography, which is exactly what we had.

Refused: prices, callout fees, "24/7", a service radius in miles, any warranty, years trading. The services list contains only jobs a named customer described in a public review — timing chain, injector valves, oil change, rear suspension, water pump, gearbox oil, brake pipes.

Sector
Vehicle repair, mobile
Source data
Google Places API · public reviews · verified geography
Build
Hand-written HTML/CSS/JS · 38 GSAP timelines · hand-drawn SVG tool set
Notable
The tool board animates slot by slot; every icon is SVG on a 100×100 grid
Status
Spec build · outreach asset

Plate 05

Drive Pass

Driving school · Aspley, Nottingham · 5.0 from 58 reviews

drive-pass.pages.dev
Drive Pass homepage: Brother, you will pass. You don't need to spend more money on lessons. You are ready.
Drive Pass on a phone

The idea

An instructor here told a pupil he did not need to buy any more lessons. The pupil wrote it down in a review: "Brother, you will pass. You don't need to spend more money on lessons. You are ready." In a trade that sells lessons by the hour, a man turning down money is the entire pitch. It is the headline, in quotation marks, with the reviewer named underneath.

The world is an engraved security document. The guilloche rosettes behind the hero are generated at run time from epitrochoid curves in JavaScript — 232 SVG paths, scroll-linked rather than looping. A banknote is the visual shorthand for "this is authentic and it cannot be faked", which is the exact claim the page makes about its own quotes.

Refused: price, pass-rate, test-centre name, coverage area, years in business, pupil count, any official crest. Ten reviews were read; where Google truncated one, the quote stops at the last word Google actually served.

Sector
Driver training
Source data
Google Places API · 10 reviews, five read off the live Maps page
Build
Hand-written HTML/CSS/JS · procedural guilloche generator · GSAP
Notable
Opening hours render live from the record, so the page can say "open now"
Status
Spec build · outreach asset
II

Software & automation

The websites are the visible half. This is the half that runs on its own — including the tooling that found those five businesses in the first place.

Automation · Python

The lead scanner

It queries the Google Places API across a list of service categories in a target city, pulls every business with a real review count, then visits each website it finds and scores how bad it is — dead links, no HTTPS, no viewport meta tag, Flash-era markup, a 2009 copyright line, a page that takes eleven seconds to load. Businesses with no site at all score highest. The UK edition also lifts a contact email out of the site, because in Britain email works and WhatsApp does not.

Output is a sorted Excel sheet plus a de-duplicating CSV history, so the same business is never contacted twice. It runs concurrently across a thread pool and falls back from the new Places API to the legacy one on its own.

Every business in this portfolio came out of this tool. It is also how I caught Sapphire's expired domain: the scanner reported "no website" for a company that plainly used to have one, and that contradiction was worth a phone call.

1,014businesses scanned
  • Nottingham331
  • Bristol320
  • Leicester249
  • Timișoara114

Four cities, two countries, one script.

Mentor app dashboard

Full-stack application

Mentor

A multi-user self-improvement app. A fifteen-question interview generates a personalised twelve-month plan — 144 objectives, none of them repeating, sized to the minutes you say you actually have, with your stated blockers turned into counter-moves.

Around 19,000 lines of TypeScript. Supabase Postgres behind row-level security scoped to auth.uid(), so one account can never read another's rows — the real boundary, not the client. Email and Google OAuth. Offline writes queue in memory and flush when the connection returns. The AI coach runs through a serverless proxy that authenticates each caller with their own JWT and enforces a per-user monthly quota, so the API key never reaches the browser.

  • React
  • TypeScript
  • Vite
  • Supabase
  • Postgres RLS
  • Netlify Functions
  • Recharts
  • Playwright
  • WebGL
Whiskerling 3D virtual cat

3D · installable web app

Whiskerling

A virtual cat that runs in a browser tab at 60fps on a phone. No downloaded assets at all: the body is built from Three.js primitives on a real eighteen-bone rig, and the fur albedo and roughness maps are painted procedurally onto a 2048×2048 canvas at load time. Lighting is image-based from a generated room environment, so there is no HDRI file to license either.

It is an installable PWA with a service worker, and it listens — hold the talk button and it mimics you back. Open it and feed it ↗

  • Three.js
  • WebGL
  • PWA
  • Service worker
  • Web Audio
  • Canvas 2D

Automation · trading infrastructure

t212-bot

A paper-trading engine against the Trading 212 API, separated the way this kind of thing has to be separated or it eats your money: a market-data layer, a strategy interface with pluggable implementations, a portfolio model, a risk module that can veto an order, an append-only SQLite ledger, and a backtest engine that replays the same strategy code against history so the live and simulated paths cannot drift apart.

Five test suites cover the ledger, the risk rules, the runner, the backtester and the paper-trading path.

  • Python
  • SQLite
  • REST API
  • pytest
  • Backtesting

Automation · data pipeline

congress-trader

US congressional stock disclosures are published as dollar ranges, not amounts, which makes them useless until somebody models the uncertainty. This one weights each trade by the midpoint of its disclosed band, computes a size-weighted composite excess return per member, and estimates current holdings from net buy-minus-sell flow.

The methodology and every approximation in it are written at the top of the file, because a number without its assumptions is just a rumour.

  • Python
  • Data modelling
  • Alpaca API
  • ETL
III

How I work

Four rules. They are the reason the pages above read differently from the category default.

  1. 01

    Research before design

    Before a single line of CSS I read the whole public record — the Places entry, every review, the directory listings, the domain registry if a domain is involved. The headline is almost always already there, written by a customer. My job is to notice it.

  2. 02

    Nothing invented, ever

    No fabricated founding year, no invented pass rate, no stock photo of somebody else's staff. If a number is needed and does not exist, it ships as a visible placeholder the owner has to fill in. A business owner reading a page about their own business spots a made-up detail in one second, and you never get the trust back.

  3. 03

    The design comes out of the subject

    The Highway Code for a driving instructor. A shadow board for a mechanic. An engraved security note for a school whose whole pitch is that its reviews are real. Four projects in the same broad sector, four different worlds — because the direction is derived, not picked off a shelf.

  4. 04

    A live link before the deadline

    Fixed scope in writing, a fixed delivery date, and a working URL you can open on your own phone before that date — not silence and then a zip file. Everything above is hand-written HTML, CSS and JavaScript: fast, no plugins to break, and yours to keep.

Available now

Your business, built the same way.

One page or eight, in English or Romanian, live on your own domain with the source code yours to keep. Tell me the business and I will tell you honestly whether I am the right fit — and if I am, you get a preview link before the date I promised.

Fora Mihai-Alexandru · Timișoara, Romania (GMT+3) · replies daily, roughly 07:00–23:00
Applied Electronics & Telecommunications, Politehnica University of Timișoara