
A NYC catering, pizza-truck, and mobile-bar brand books events on how memorable they look. The website had to do the same job.
Next.js 16 and React 19 in TypeScript, Tailwind CSS 4 with shadcn components on Radix, Markdown posts through gray-matter and marked, JSON-LD on every service page, and seven security headers set in the proxy. Deployed on Vercel. Every form posts to Formspree.
Twenty-six pages, from a measured six.
On 27 August 2026 the site had 29 ranked keywords, an estimated 85 organic visits a month and six pages Google could index. Three keywords sat on page one, and all three were the brand's own name. The plan in the repo says it plainly: you cannot rank for terms you have no page for.
So the pages were built in the order the numbers set. Brooklyn first, because the August 2026 plan put catering brooklyn at 1,300 searches a month in the New York market. Corporate second, because corporate event catering had the highest cost per click in the dataset at a keyword difficulty of zero. Then Staten Island, weddings, Long Island, parties, and on down the list. Twenty new URLs shipped that day, and the sitemap dates each one by hand rather than stamping every page with the build time.
The same plan records the one thing code could not fix: the business had no claimed Google Business Profile, and every commercial result page it checked starts with a local pack. Until that profile exists the new pages compete for positions four to ten, and the plan says so in its second section.
A page that survives find-and-replace.
Ten catering pages, one per borough or region, each written around a fact that is only true there. The data file that builds them carries the rule in its first lines: if you could swap the area name and the page still read correctly, it is not finished. Brooklyn's page is about the walk-up, four flights with no elevator and a one-way street where the truck cannot idle. Staten Island's is about the driveway. Long Island's is about late May through June, when half of Nassau and Suffolk throws a party on the same four Saturdays.
Each record carries its own angle, four occasions, ten to twelve real neighborhoods, a note on where the pizza truck can park, three questions, and two neighboring pages to link sideways to. The structured data follows the same rule: every page's schema names its own borough or county as the area served, and a slug that is not in the list returns a 404.

The pizza page kept its slug because it already ranked.
In July 2026 Search Console had the pizza-truck page at position 8.1 for pizza truck, with 88 impressions and one click. The plan written that week called it a click-through problem, ruled that the page keeps its URL because renaming it would reset the history, and moved the search phrase into the H1. The schema on that page gained the nine-pizza menu as an offer catalog and a provider that points at the organization's own ID rather than repeating it.
Four pages now hang under it, one per occasion or region: weddings, parties, Long Island and Connecticut. Each opens with the reason it exists apart from the hub, carries five questions and links to one sibling and one related page, and its schema states the client's published starting price. The same day they shipped, a fix commit repaired the internal linking: two of the four spokes had gone out with no link pointing at them, and the corporate page was named on six pages without a keyword-anchored link from any of them, so the plain-text data now carries real links.

Two pages for the person who has to place the order.
The corporate page is written for whoever gets blamed if lunch is late: a certificate of insurance sent to building management before the date, a confirmed delivery window, an invoice with a PO number on it, and a five-step section that says so in order. It was second in the build order because corporate event catering had the highest cost per click in the whole dataset.
The contact form asks which of the three services you want before it asks anything else, then shows only that service's fields: an event type for catering, a location for the truck, a location and a package for the bar. Each submission reaches Formspree tagged with the service it came from. Three shorter forms sit inline on the service hubs, and on a phone a fixed booking bar appears on those three hubs once the menu or package section comes into view.


Which service first, then only that service's fields.
A poster first, a video second.
The home hero is a still until it is on screen. The poster is a 110 KB JPEG marked as the priority image, so it is fetched first and is what the browser paints before the video exists. The video has no sources at all until an observer sees the hero within 100 pixels; then the WebM and MP4 are attached and it fades in over a second. A visitor who has asked their system for reduced motion never downloads it. Every other video on the site gets its source only within 200 pixels of the viewport.
Every page response carries seven security headers from the proxy: a content security policy that limits images to the site's own and one photo host and form posts to Formspree, no framing, a year of HSTS, and a permissions policy that switches off camera, microphone, location and payment. The email address is never in the HTML; it renders after hydration.
Project details
- Pages26 in the sitemap
- DeploymentVercel ยท Formspree for every form
- Year2026
- PlatformWeb
- Live sitenewyorkfinefoods.com
Does your site have a page for what people search?