Day One Wasn't Over. Here's Everything Else That Happened.
The first post went up, then I spent the rest of the day going down a rabbit hole of SEO, email setup, logos, social accounts and webhooks. Here's all of it.

I published the first post this morning and thought I was done for the day. I was not done for the day.
Once the site was live I started noticing all the things that were missing. Not broken exactly, just not finished. No real email address. No favicon. No way for Google to find the site. Newsletter signup form that collected nothing. Each one felt like a small thing until I started fixing them and realised each fix came with its own rabbit hole.
Here's everything that happened between the first post going up and me finally closing the laptop tonight.
Wiring Up the Newsletter
The newsletter signup form had been sitting on the homepage looking great and doing absolutely nothing. Emails were being submitted, logged to the console, and silently discarded. Not ideal.
Went with Resend (resend.com) for email because it has a free tier, a clean interface, and an Audiences feature where subscriber emails actually get stored. First attempt at connecting it failed immediately. The existing API key in Resend was restricted to sending emails only and couldn't manage contacts. Had to create a new one with full access, then create an Audience to store the subscribers, which gave me an Audience ID to work with.
Both the API key and the Audience ID went into the local .env.local file and into Vercel's environment variable settings. Installed the Resend npm package, updated the subscribe API route to actually call resend.contacts.create() with the email and the audience ID, deployed, and tested it on the live site. Email appeared in Resend's contacts. Signup is now working properly.
Setting Up a Proper Email Address
Needed hello@madewithprompts.co.uk rather than whatever personal address I'd been using. Looked at Zoho Mail first as it used to have a free plan. It no longer does.
Went with ImprovMX (improvmx.com) instead, which does free email forwarding. Added two MX records to the domain's DNS settings in GoDaddy and that was it. Any email sent to hello@madewithprompts.co.uk now forwards straight to my personal inbox. The whole thing took about ten minutes once the DNS records were in, though DNS changes can take a little while to propagate so there was some waiting around involved.
Sitemap and robots.txt
For the site to actually appear in search results, Google needs to be able to find and understand it. Two files help with that.
The sitemap at /sitemap.xml tells Google every page that exists on the site. Built it using Next.js 15's built-in sitemap support so it pulls all blog post slugs and project slugs directly from Sanity and updates automatically whenever new content is published. No manual updates needed, ever.
The robots.txt at /robots.txt tells crawlers what they can and cannot index. Everything is open except /studio, which is the Sanity CMS backend and has no business being in search results. Points crawlers to the sitemap URL so they know where to look.
Both files are now live and doing their jobs quietly in the background.
Google Search Console
Setting up the sitemap is one thing. Telling Google it exists is another. Signed up for Google Search Console, added the site, and verified ownership by adding a Google verification meta tag to the root layout in Next.js. Deployed the change, clicked verify in Search Console, and it confirmed ownership immediately.
Then submitted the sitemap URL so Google starts crawling all the pages properly. The site should start appearing in search results within a few days. This is the kind of thing that takes five minutes to set up and pays off for years, so worth doing on day one even if it feels like admin.
Reading Time on Blog Posts
Small detail but one of those things that makes a blog feel properly finished. Added estimated reading time to each post card, showing something like "Mar 25, 2026 · 4 min read" next to the publish date.
Done entirely in the Sanity query using a function that extracts plain text from the post body, counts the words, and divides by 200 words per minute. No extra package, no manual input. Publish a post and the reading time calculates itself.
Open Graph Images
Open Graph images are the preview images that appear when you share a link on social media or in a WhatsApp message. Without them you just get a blank card or a random image pulled from the page, which looks unprofessional.
Built a dynamic OG image generator at /api/og using Next.js 15's built-in next/og. It accepts the post title and type as parameters and generates a 1200x630 image on the edge runtime, matching the site design. Dark background, indigo to violet gradient accent, large title text, site URL in the footer.
Every blog post and project page now has a proper preview image when shared anywhere. Posts with a cover image use that instead. Twitter card metadata was added at the same time. The whole thing works automatically for any new content going forward.
Social Media Accounts
Set up proper brand accounts so the site has somewhere to point people and somewhere to share posts from.
X (Twitter) is live at x.com/MadeWithPrompts, created using the hello@ email address and completely separate from any personal account. LinkedIn is set up as a company page at linkedin.com/company/made-with-prompts. GitHub at github.com/madewithprompts was already there from the initial build and is now properly linked.
All three plus the email address are now in the site footer as icon links. The placeholder GitHub link that had been sitting there from the initial build got replaced with the real URL. Small thing but one of those details that matters.
Logo and Favicon
The site had been running all day with no logo and no favicon, just the default Next.js icon on the browser tab. Fixed that tonight.
Generated a logo using Ideogram.ai. Two versions: a full text logo with MadeWithPrompts in an indigo to violet gradient on a dark background, and a standalone chevron icon for use as a profile picture and favicon.
Used realfavicongenerator.net to turn the chevron icon into a full favicon bundle covering every format needed, including the .ico file, various PNG sizes, the Apple touch icon for iOS home screens, and the Android Chrome icons. Dropped all of them into the /public folder and wired them into the site metadata. The chevron now appears on the browser tab and as the icon if you add the site to your phone's home screen.
Fixing the Webhook Properly
Covered this briefly in the first post but worth going into more detail here because it caught me out a few times before it was fully sorted.
The root cause was two separate caching issues stacked on top of each other. Page cache was set to revalidate every 3600 seconds, meaning even a fresh deployment could serve an hour-old version of a page. On top of that the Sanity CDN was also caching responses independently. Content published in Sanity was effectively invisible to the site for up to an hour.
Fixed both. Dropped revalidate to 60 seconds across all pages and disabled the Sanity CDN cache in the client config. Then went a step further and set up a proper webhook. Created an API route at /api/revalidate that calls Next.js's revalidatePath to clear the entire page cache, secured with a secret token checked against the request header. Configured the webhook in Sanity's dashboard pointing at the live URL, set to fire on create, update and delete. Publishing anything in Sanity Studio now makes it live on the site within seconds.
Where Things Stand
By the end of day one the site has a working newsletter signup, a professional email address, proper SEO foundations, a sitemap, Google Search Console set up, reading times on posts, Open Graph images for social sharing, brand accounts on X and LinkedIn, a proper logo and favicon, and a webhook that makes publishing instant.
That is a lot for one day, and almost none of it involved me writing code directly. Claude Code handled the implementation throughout. My job was describing what I wanted, reviewing what came back, testing it, and occasionally debugging when something did not work first time.
Tomorrow I want to start on the paper trading bot. That is a proper build and will probably take more than one day, but that is what the next post is for.
Follow along at madewithprompts.co.uk