<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Daniel Mayo</title>
    <description>The latest articles on Forem by Daniel Mayo (@dmayo3).</description>
    <link>https://forem.com/dmayo3</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2908021%2F8b3c9983-214c-4317-81b2-13bc0b216d5c.jpg</url>
      <title>Forem: Daniel Mayo</title>
      <link>https://forem.com/dmayo3</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/dmayo3"/>
    <language>en</language>
    <item>
      <title>Lessons Learned from Building a Landing Page with ChatGPT</title>
      <dc:creator>Daniel Mayo</dc:creator>
      <pubDate>Sun, 09 Mar 2025 15:10:23 +0000</pubDate>
      <link>https://forem.com/dmayo3/lessons-learned-from-building-a-landing-page-with-chatgpt-m8p</link>
      <guid>https://forem.com/dmayo3/lessons-learned-from-building-a-landing-page-with-chatgpt-m8p</guid>
      <description>&lt;p&gt;Building a landing page for my side project was a slow and iterative process. I went into it wanting a design that would be impressive, something with a real wow factor. But that was easier said than done.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Challenges of AI-Generated Design
&lt;/h2&gt;

&lt;p&gt;ChatGPT is great for a lot of things, but designing web pages that truly look great isn't one of them. The initial suggestions were functional but lacked visual impact. I also tried Lovable.dev, which produces aesthetically pleasing designs but felt too formulaic and generic. I wanted something unique, something that told a story rather than just listing features.&lt;/p&gt;

&lt;p&gt;I briefly considered using a template, but nothing I saw really appealed to me. In hindsight, I probably should have looked harder. That said, a good landing page doesn’t need to reinvent the wheel. It just needs to communicate clearly and convert effectively.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Iterative Grind
&lt;/h2&gt;

&lt;p&gt;Since I wasn’t starting with a solid template or design inspiration, I ended up iterating endlessly on a rough concept. &lt;/p&gt;

&lt;p&gt;Most of the time was spent on fiddly issues:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Responsive design testing and tweaks&lt;/li&gt;
&lt;li&gt;Smooth scrolling between sections&lt;/li&gt;
&lt;li&gt;A down arrow button to guide users through the page&lt;/li&gt;
&lt;li&gt;Key up/down handlers for navigation&lt;/li&gt;
&lt;li&gt;Managing the foreground, background, and positioning&lt;/li&gt;
&lt;li&gt;Picking out some nice photo backgrounds from Unsplash&lt;/li&gt;
&lt;li&gt;Trying to come up with some reasonable copy&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The result was something that looks acceptable on every device size and orientation provided as a preset in the Chrome Dev Tools, but it doesn't look great on every device. It's a compromise.&lt;/p&gt;

&lt;p&gt;While these elements contributed to a dynamic experience, they added complexity that probably wasn’t necessary. In retrospect, I should have asked: does this add meaningful value, or is it just making things harder? At least for the first version.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I’d Do Differently
&lt;/h2&gt;

&lt;p&gt;Looking back, I should have just kept it simple. A conventional scrolling page, without complex section transitions or extra interactions, would have saved a lot of time and frustration.&lt;/p&gt;

&lt;p&gt;Additionally, I wish I had a clearer idea of the content from the start. The messaging, the way I present the benefits of the app, is still not where I want it to be. But at least now I have a foundation to iterate on.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Takeaways for Others
&lt;/h2&gt;

&lt;p&gt;Don’t overcomplicate it. Fancy interactions might seem cool, but they can slow down development and introduce tricky layout issues.&lt;/p&gt;

&lt;p&gt;If like me you’re not a designer, consider a template. Even if it doesn’t feel perfect at first, you can tweak an existing design much faster than starting from scratch. It's hard starting with a blank canvas.&lt;/p&gt;

&lt;p&gt;Have a clear vision for your content. Design supports messaging, not the other way around. Knowing exactly what you want to say upfront makes everything easier.&lt;/p&gt;

&lt;p&gt;Follow landing page best practices. Make sure your page has a strong headline, concise copy, clear CTA, and is mobile-friendly.&lt;/p&gt;

&lt;p&gt;AI can help, but it won’t do it all for you. ChatGPT was great for iterating and problem-solving, but it didn’t magically produce a stunning design. Human judgment and refinement were still essential.&lt;/p&gt;

&lt;p&gt;In hindsight, it's probably better to have one or two pages / screens worth of content. Less is more. I ended up with multiple pages though.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Do You Think?
&lt;/h2&gt;

&lt;p&gt;So what I ended up with is not that great in my opinion, but I don't want to keep iterating on it forever. It'll do for now, just like the rest of my app - which is still very much an early stage work in progress.&lt;/p&gt;

&lt;p&gt;I’d love to hear your thoughts though! If you’ve built landing pages before, what lessons did you learn? Do you have feedback on my approach or my final result? And if you want to check out the RelayChat landing page yourself, you can find it here: &lt;a href="https://relaychat.social/?utm_source=devto&amp;amp;utm_medium=social&amp;amp;utm_campaign=landing" rel="noopener noreferrer"&gt;RelayChat.social&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>frontend</category>
      <category>chatgpt</category>
      <category>landingpage</category>
    </item>
    <item>
      <title>Building a Social Platform with FastAPI &amp; Neo4j: Lessons from a Side Project</title>
      <dc:creator>Daniel Mayo</dc:creator>
      <pubDate>Mon, 03 Mar 2025 11:31:09 +0000</pubDate>
      <link>https://forem.com/dmayo3/building-a-social-platform-with-fastapi-neo4j-lessons-from-a-side-project-oan</link>
      <guid>https://forem.com/dmayo3/building-a-social-platform-with-fastapi-neo4j-lessons-from-a-side-project-oan</guid>
      <description>&lt;p&gt;Firstly let me introduce the side project that I started, but never finished. Because I have a day job and a busy life. The lessons learned were interesting though. &lt;/p&gt;

&lt;p&gt;I wanted to build a simple social network. I was thinking of implementing Mastodon integration, but I never did get around to that. It had one user - me 😂&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Agentic coding&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;There's a lot of split opinions on how good GenAI agents are at coding.&lt;/p&gt;

&lt;p&gt;Initially I used ChatGPT for brainstorming and planning. It came up with the initial name and concept, and helped me get started with the most basic version. Honestly I would have been too lazy / busy to start this project otherwise.&lt;/p&gt;

&lt;p&gt;I used it for some initial coding help, before switching to Zed and Claude later on. Copilot is my other side kick for inline code suggestions / completion.&lt;/p&gt;

&lt;p&gt;I will henceforth refer to AI assistants and I as "we" 😁&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Database: Neo4j&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;First decision that I made was to use Neo4j for the database. &lt;/p&gt;

&lt;p&gt;Why not just use a relational database I hear you cry? &lt;/p&gt;

&lt;p&gt;Well, first of all a disclaimer: I work for Neo4j.&lt;/p&gt;

&lt;p&gt;Secondly, a graph database is tailor made for storing and querying social connections. Not that I have any users to connect 😂&lt;/p&gt;

&lt;p&gt;Thirdly, why not? For me it's more fun and easier to use. I do have an appreciation for Postgres, but I just find Neo4j more fun and freeing to work with.&lt;/p&gt;

&lt;p&gt;Oh and there's a free managed version you can spin up very easily (that I helped build). This was the biggest thing for me on this project: cheap and easy. &lt;/p&gt;

&lt;p&gt;Anyway, I'm not really here to promote Neo4j. That's just what I'm using. On to the next choice.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Backend: FastAPI&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Since I'm working a lot with Python these days and I find it quite pleasant and easy to use, it was quite natural for ChatGPT to suggest a Python backend, specifically FastAPI.&lt;/p&gt;

&lt;p&gt;I've not used it before, only Flask (which I'm not the biggest fan of).&lt;/p&gt;

&lt;p&gt;ChatGPT created the initial version along with Poetry for dependency management and I gave it a spin.&lt;/p&gt;

&lt;p&gt;I was instantly impressed. This is a very nice framework to use for getting started with. You can get something up and running super fast, while also supporting async requests, background tasks, and websockets for scalability.&lt;/p&gt;

&lt;p&gt;Sold! &lt;/p&gt;

&lt;p&gt;Why not Node.js or something like that? Well, I've used it before and honestly I wasn't a fan. I prefer JS/TS on the front-end. Just my preference. &lt;/p&gt;

&lt;p&gt;I could have also used Go or Java or something else, but that sounds much less fun for getting started quickly on a new project.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Frontend: vanilla JS&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;So, by this point in the story I had a working API that stores data in Neo4j. A headless social network if you will.&lt;/p&gt;

&lt;p&gt;Now I could create an Android/iOS client, but that's not my thing. So web app it is.&lt;/p&gt;

&lt;p&gt;I ask ChatGPT to knock up a quick front-end. We decide to avoid any heavy dependencies at the moment, so vanilla JS it is. No React etc.&lt;/p&gt;

&lt;p&gt;We decide to use Tailwind for CSS styling. No Bootstrap, no component lib. A very natural and solid choice for quick iteration.&lt;/p&gt;

&lt;p&gt;No Vite build or whatever. Just pure untransformed static files. The lack of build time or ceremony is very refreshing! &lt;/p&gt;

&lt;p&gt;The first version looked terrible of course. But it worked! &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Auth&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Okay, so it's time to add login capabilities. &lt;/p&gt;

&lt;p&gt;I don't want to roll my own, I don't want anything heavy. I want easy, and free.&lt;/p&gt;

&lt;p&gt;I decide to integrate Auth0 with Google OIDC as the one initial login method for now. &lt;/p&gt;

&lt;p&gt;Not as easy as I'd hoped, but eventually after a lot of back and forth I got it to work.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;6. Deployment Pt. 1: Render&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We arrived on using Render.io to deploy to the world. It was quick, easy, and best of all free to get started. &lt;/p&gt;

&lt;p&gt;It was pretty great for testing at first.&lt;/p&gt;

&lt;p&gt;But there's a catch: it suspends when not in use and the cold start times can be 50 seconds plus! &lt;/p&gt;

&lt;p&gt;I mean I don't blame them. You can upgrade to solve that problem. &lt;/p&gt;

&lt;p&gt;But it bugged me enough that I wanted to look at other options. Which led me to...&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;7. Deployment Pt. 2: D.O.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I switched to Digital Oceans App Platform. For a relatively low monthly fee, it solved what I was looking for. &lt;/p&gt;

&lt;p&gt;Compared to Render it was an absolute pain to set up. &lt;/p&gt;

&lt;p&gt;Eventually I got it working though and now it's set up it's easy to use. I just git push to deploy.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;8. Custom Domain&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Okay, so I wanted a custom domain now. I wanted to use a .social TLD.&lt;/p&gt;

&lt;p&gt;Of course my working title up until this point was already taken: ripple.social&lt;/p&gt;

&lt;p&gt;However, rpl.social was free. ChatGPT encouraged me to search for existing Trademarks. This was a pain, but eventually I found a clash. No go.&lt;/p&gt;

&lt;p&gt;Future app / start up idea: make trademark search easier. It could really use an app that brings it into the 21st Century.&lt;/p&gt;

&lt;p&gt;Next up: ChatGPT suggested relay.social&lt;/p&gt;

&lt;p&gt;Not bad I guess. But taken. Next it suggested RelayHub.social and RelayChat.social&lt;/p&gt;

&lt;p&gt;Neither were amazing but they were free. I went with the latter. Only after registering did I realise it sounds like Internet Relay Chat (IRC!)&lt;/p&gt;

&lt;p&gt;Oh well, it's not great but it worked as a stopgap.&lt;/p&gt;

&lt;p&gt;Naming things is really hard!!&lt;/p&gt;

&lt;p&gt;Edit: as of Jan 2026 I've shut down the app and I have disabled auto renewal for the domain. It's just wasting money at this point!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;9. Analytics: Swetrix&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Now, I had no users. No big surprise 😂&lt;/p&gt;

&lt;p&gt;I was half heartedly trying to get some, but without some kind of analytics I wouldn't know whether anyone is visiting or dropping off. &lt;/p&gt;

&lt;p&gt;I wanted something cheap while being GDPR compliant and privacy respecting. Swetrix ticked this box and is pleasantly simple to use. It tracks stats anonymously, without cookies or PII.&lt;/p&gt;

&lt;p&gt;As a bonus it comes with anonymous error reporting as well. Nice.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;10: Current Status&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In conclusion, I learned some new things and set up a project from scratch on a budget.&lt;/p&gt;

&lt;p&gt;If I start another project, I'd do things differently. The no. 1 thing I'd change is investing in strong guard rails to help guide agentic coding. I'm thinking plenty of automated tests, code formatting, linting, etc. The kind of things you'd set up for a professional team project, only with AI it's even more important because it makes dumb decisions all the time unless there's something there to stop it.&lt;/p&gt;

&lt;p&gt;In particular I would want to look into Cucumber BDD and Playwright testing. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Thanks for reading, well if you make it this far I'm impressed.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I'd love to hear about your own side projects.&lt;/p&gt;

&lt;p&gt;What would you have done differently to me if you were in my shoes? Any tips or suggestions?&lt;/p&gt;

&lt;p&gt;Any thoughts or questions about what I did?&lt;/p&gt;

</description>
      <category>chatgpt</category>
      <category>neo4j</category>
      <category>python</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
