<?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>DEV Community: staticwebapps</title>
    <description>The latest articles tagged 'staticwebapps' on DEV Community.</description>
    <link>https://dev.to/t/staticwebapps</link>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/tag/staticwebapps"/>
    <language>en</language>
    <item>
      <title>I Found a Way to Deploy a Static Site by Just Zipping a Folder</title>
      <dc:creator>Samuel Aondo</dc:creator>
      <pubDate>Mon, 14 Sep 2026 10:29:45 +0000</pubDate>
      <link>https://dev.to/rareniches/i-found-a-way-to-deploy-a-static-site-by-just-zipping-a-folder-5126</link>
      <guid>https://dev.to/rareniches/i-found-a-way-to-deploy-a-static-site-by-just-zipping-a-folder-5126</guid>
      <description>&lt;p&gt;I found something new this week, and it's stuck with me because of how little it asks of you: you zip a folder, drop it in, and you get a live URL with SSL already on. That's the whole deploy.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5efmkg7k238r5uo0ebbl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5efmkg7k238r5uo0ebbl.png" alt="zip hosting" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem it solves
&lt;/h2&gt;

&lt;p&gt;Every time I've wanted to put a small static site online — a portfolio, a docs site, a landing page, a hackathon demo — the actual build was the easy part. The deploy was where I lost time: picking a host, wiring up a git integration, figuring out a build command for a project that didn't really need one.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://ziphost.co" rel="noopener noreferrer"&gt;ZipHost&lt;/a&gt; skips all of that. You already know how to make a zip file — that's the entire workflow:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Zip your project folder (Finder, Explorer, or a build script — doesn't matter)&lt;/li&gt;
&lt;li&gt;Drop it into the dashboard, or run one CLI command&lt;/li&gt;
&lt;li&gt;Get a live URL, SSL included, in about 3.8 seconds on average&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  What's actually included
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Free SSL on every site, no setup&lt;/li&gt;
&lt;li&gt;One-click rollbacks — every deploy is kept and versioned&lt;/li&gt;
&lt;li&gt;Deploy previews for sharing a change before it goes live&lt;/li&gt;
&lt;li&gt;Password-protected links for client review&lt;/li&gt;
&lt;li&gt;CLI or GitHub push if you'd rather automate it than drag files&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Where it fits
&lt;/h2&gt;

&lt;p&gt;It's not trying to be a platform for full applications — there's no server-side runtime here. But for the sites that "just need to exist somewhere" — portfolios, generated docs output, one-page landing pages, hackathon demos, client previews — it removes every step between "I have a folder" and "here's the link."&lt;/p&gt;

</description>
      <category>staticwebapps</category>
      <category>code</category>
      <category>webdev</category>
      <category>ai</category>
    </item>
    <item>
      <title>How to Host php website for free</title>
      <dc:creator>Samuel Aondo</dc:creator>
      <pubDate>Mon, 14 Sep 2026 10:27:30 +0000</pubDate>
      <link>https://dev.to/rareniches/how-to-host-php-website-for-free-1cpe</link>
      <guid>https://dev.to/rareniches/how-to-host-php-website-for-free-1cpe</guid>
      <description>&lt;p&gt;I had a small PHP script I wanted to share with a friend. Nothing fancy — no framework, no build step, just a handful of &lt;code&gt;.php&lt;/code&gt; files that needed to live somewhere reachable by a URL.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffewxzs8mll2mczff0skc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffewxzs8mll2mczff0skc.png" alt="php hosting" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Every "real" option I looked at wanted me to provision a VPS, install and patch PHP and a database by hand, and generate my own TLS certs before I could even see the thing running. That's a lot of setup for a weekend project.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I used instead
&lt;/h2&gt;

&lt;p&gt;I ended up on &lt;a href="https://phphost.se" rel="noopener noreferrer"&gt;phphost&lt;/a&gt; — PHP hosting built around one idea: you already know how to write PHP, you shouldn't need to know Linux to ship it.&lt;/p&gt;

&lt;p&gt;The deploy is genuinely just:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Upload a folder, a zip, or connect a git repo&lt;/li&gt;
&lt;li&gt;It sets up the PHP runtime and HTTPS automatically&lt;/li&gt;
&lt;li&gt;Your site is live at a working HTTPS URL in under 10 seconds&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;No config file, no shell to open.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's actually included
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Automatic HTTPS on every site, from the first deploy&lt;/li&gt;
&lt;li&gt;Cron jobs, if you need something running on a schedule&lt;/li&gt;
&lt;li&gt;MySQL support and per-site &lt;code&gt;.env&lt;/code&gt; variables for secrets&lt;/li&gt;
&lt;li&gt;Staging environments — a persistent pre-prod copy that doesn't count against your site limit&lt;/li&gt;
&lt;li&gt;Deploy history with one-click rollbacks&lt;/li&gt;
&lt;li&gt;Uptime monitoring that pings your site and tells you before a user does&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>webdev</category>
      <category>php</category>
      <category>staticwebapps</category>
      <category>programming</category>
    </item>
    <item>
      <title>GEO for Developers: Structuring Websites for AI Search, Retrieval, and Entity Clarity</title>
      <dc:creator>Joyno Media</dc:creator>
      <pubDate>Fri, 04 Sep 2026 04:01:34 +0000</pubDate>
      <link>https://dev.to/joynomediaofficial/geo-for-developers-structuring-websites-for-ai-search-retrieval-and-entity-clarity-3dmd</link>
      <guid>https://dev.to/joynomediaofficial/geo-for-developers-structuring-websites-for-ai-search-retrieval-and-entity-clarity-3dmd</guid>
      <description>&lt;p&gt;Generative Engine Optimization (GEO) is not only a content-writing task. Developers influence whether AI-powered search systems can reliably access, interpret, connect, and retrieve the information published on a website.&lt;/p&gt;

&lt;p&gt;A GEO-friendly website should make important relationships obvious:&lt;/p&gt;

&lt;p&gt;Organization → Services → People → Locations → Topics → Supporting Content&lt;/p&gt;

&lt;p&gt;The objective is not to manipulate AI systems or guarantee citations. It is to reduce ambiguity and create a technically accessible information architecture that helps search engines and AI-powered retrieval systems understand what the website represents.&lt;/p&gt;

&lt;p&gt;For developers, this means thinking beyond page speed and metadata. Website architecture, semantic HTML, entity consistency, internal linking, structured data, crawlability, and content relationships all contribute to how understandable a site becomes.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Start With Crawlability and Indexability&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;AI-search optimization cannot compensate for important content that search systems cannot reliably access.&lt;/p&gt;

&lt;p&gt;Before considering advanced GEO implementation, verify that important pages are:&lt;/p&gt;

&lt;p&gt;Publicly accessible&lt;br&gt;
Internally linked&lt;br&gt;
Included in the intended crawl path&lt;br&gt;
Not accidentally blocked&lt;br&gt;
Returning the correct HTTP status&lt;br&gt;
Using appropriate canonical URLs&lt;br&gt;
Included in XML sitemaps where relevant&lt;br&gt;
Rendered in a way search systems can process&lt;/p&gt;

&lt;p&gt;Common problems include:&lt;/p&gt;

&lt;p&gt;Important pages marked noindex&lt;br&gt;
Incorrect canonical tags&lt;br&gt;
Broken internal links&lt;br&gt;
JavaScript-dependent content that fails to render reliably&lt;br&gt;
Duplicate URLs&lt;br&gt;
Redirect chains&lt;br&gt;
Outdated XML sitemaps&lt;br&gt;
Important pages buried deep in the architecture&lt;/p&gt;

&lt;p&gt;GEO starts with technical accessibility.&lt;/p&gt;

&lt;p&gt;If the page cannot be reliably discovered, the quality of its entity information becomes much less useful.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create an Entity-Oriented Site Architecture&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Traditional website architecture is often organized around navigation.&lt;/p&gt;

&lt;p&gt;A GEO-focused architecture should also make the relationships between important business entities clear.&lt;/p&gt;

&lt;p&gt;For a digital marketing business, a simplified structure might look like:&lt;/p&gt;

&lt;p&gt;Organization&lt;/p&gt;

&lt;p&gt;→ Digital Marketing&lt;br&gt;
→ SEO&lt;br&gt;
→ Generative Engine Optimization&lt;br&gt;
→ Website Development&lt;br&gt;
→ Branding&lt;br&gt;
→ Commercial Video&lt;/p&gt;

&lt;p&gt;Then each service can connect to supporting educational content.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;p&gt;Generative Engine Optimization&lt;/p&gt;

&lt;p&gt;→ What Is GEO?&lt;br&gt;
→ GEO vs SEO&lt;br&gt;
→ Entity Optimization&lt;br&gt;
→ AI Search Visibility&lt;br&gt;
→ Structured Data&lt;br&gt;
→ GEO Measurement&lt;/p&gt;

&lt;p&gt;This creates a clearer knowledge graph within the website.&lt;/p&gt;

&lt;p&gt;The pages do not need to describe themselves as a knowledge graph. The relationship is created through hierarchy, content, URLs, navigation, breadcrumbs, and internal links.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Give Important Entities Dedicated Pages&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Important entities should not exist only as passing references inside unrelated pages.&lt;/p&gt;

&lt;p&gt;Depending on the website, dedicated pages may be useful for:&lt;/p&gt;

&lt;p&gt;The organization&lt;br&gt;
Major services&lt;br&gt;
Products&lt;br&gt;
Locations&lt;br&gt;
Team members&lt;br&gt;
Founders&lt;br&gt;
Industry solutions&lt;br&gt;
Important technologies&lt;/p&gt;

&lt;p&gt;A dedicated service page should clearly define the service instead of relying only on promotional copy.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;p&gt;Weak:&lt;/p&gt;

&lt;p&gt;Transform your visibility with next-generation solutions.&lt;/p&gt;

&lt;p&gt;Clearer:&lt;/p&gt;

&lt;p&gt;Generative Engine Optimization helps businesses improve how clearly their brand, services, and website information can be understood by AI-powered search and answer systems.&lt;/p&gt;

&lt;p&gt;The second version establishes an identifiable entity and its purpose.&lt;/p&gt;

&lt;p&gt;Developers can support this clarity by ensuring each major entity has a stable URL, logical navigation position, descriptive metadata, and relevant internal links.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Use Semantic HTML to Communicate Structure&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Visual design does not automatically communicate meaning to machines.&lt;/p&gt;

&lt;p&gt;A heading that looks large because of CSS is not necessarily a semantic heading.&lt;/p&gt;

&lt;p&gt;Use HTML structure to represent the content hierarchy accurately.&lt;/p&gt;

&lt;p&gt;Important considerations include:&lt;/p&gt;

&lt;p&gt;One meaningful primary heading&lt;br&gt;
Logical H2 and H3 relationships&lt;br&gt;
Semantic navigation&lt;br&gt;
Proper lists&lt;br&gt;
Tables for genuinely tabular information&lt;br&gt;
Meaningful links&lt;br&gt;
Appropriate article structure&lt;br&gt;
Accessible labels&lt;/p&gt;

&lt;p&gt;A page should remain structurally understandable even if its visual styling is removed.&lt;/p&gt;

&lt;p&gt;For example, a service page may follow:&lt;/p&gt;

&lt;p&gt;H1: Generative Engine Optimization Services&lt;/p&gt;

&lt;p&gt;H2: What Is Generative Engine Optimization?&lt;/p&gt;

&lt;p&gt;H2: How GEO Works&lt;/p&gt;

&lt;p&gt;H2: What GEO Helps Businesses Improve&lt;/p&gt;

&lt;p&gt;H2: GEO vs Traditional SEO&lt;/p&gt;

&lt;p&gt;H2: What Businesses Should Consider&lt;/p&gt;

&lt;p&gt;That hierarchy gives both users and machines clearer context than a collection of generic headings such as:&lt;/p&gt;

&lt;p&gt;Discover&lt;br&gt;
Transform&lt;br&gt;
Grow&lt;br&gt;
What's Next&lt;/p&gt;

&lt;p&gt;Creative design language can remain, but important page structure should communicate actual meaning.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Make Important Answers Extractable&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;AI-powered retrieval systems may use only a small section of a page.&lt;/p&gt;

&lt;p&gt;Developers and content teams should therefore design pages so important answers can stand on their own.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;p&gt;What is GEO?&lt;/p&gt;

&lt;p&gt;Generative Engine Optimization is the process of improving digital content and website information so AI-powered search and answer systems can more accurately understand, retrieve, summarize, and potentially reference a business.&lt;/p&gt;

&lt;p&gt;This works better than requiring the system to combine several paragraphs scattered across the page.&lt;/p&gt;

&lt;p&gt;Useful components include:&lt;/p&gt;

&lt;p&gt;Definition blocks&lt;br&gt;
Short answer paragraphs&lt;br&gt;
Step sequences&lt;br&gt;
Comparison tables&lt;br&gt;
Checklists&lt;br&gt;
Clearly labeled FAQs&lt;/p&gt;

&lt;p&gt;This also improves usability for people scanning the page.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Avoid Hiding Critical Information Inside Interfaces&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Modern websites frequently place information inside:&lt;/p&gt;

&lt;p&gt;Tabs&lt;br&gt;
Accordions&lt;br&gt;
Sliders&lt;br&gt;
Modals&lt;br&gt;
Interactive cards&lt;br&gt;
Client-rendered components&lt;/p&gt;

&lt;p&gt;These patterns are not automatically bad.&lt;/p&gt;

&lt;p&gt;The problem occurs when essential business information exists only inside an interface that is difficult to render, inaccessible without interaction, or missing from the underlying document structure.&lt;/p&gt;

&lt;p&gt;Important information such as:&lt;/p&gt;

&lt;p&gt;Service descriptions&lt;br&gt;
Location details&lt;br&gt;
Company identity&lt;br&gt;
FAQs&lt;br&gt;
Pricing when publicly available&lt;br&gt;
Product information&lt;/p&gt;

&lt;p&gt;should remain technically accessible.&lt;/p&gt;

&lt;p&gt;Developers should test pages beyond what appears visually in a browser.&lt;/p&gt;

&lt;p&gt;Ask:&lt;/p&gt;

&lt;p&gt;If an automated retrieval system accesses this page, is the important information actually present and understandable?&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Strengthen Internal Linking With Context&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Internal links do more than help users navigate.&lt;/p&gt;

&lt;p&gt;They communicate relationships between entities and topics.&lt;/p&gt;

&lt;p&gt;Consider these two anchors:&lt;/p&gt;

&lt;p&gt;Weak:&lt;br&gt;
Read more&lt;/p&gt;

&lt;p&gt;Stronger:&lt;br&gt;
Learn how structured data supports AI search visibility&lt;/p&gt;

&lt;p&gt;The second link tells the user and the retrieval system what the destination page represents.&lt;/p&gt;

&lt;p&gt;A GEO-friendly internal linking strategy should connect:&lt;/p&gt;

&lt;p&gt;Service pages to supporting guides&lt;br&gt;
Supporting guides back to relevant services&lt;br&gt;
Topic clusters to pillar pages&lt;br&gt;
Team profiles to authored content when appropriate&lt;br&gt;
Location pages to genuinely available services&lt;br&gt;
Related questions to deeper explanations&lt;/p&gt;

&lt;p&gt;Avoid linking every keyword occurrence.&lt;/p&gt;

&lt;p&gt;Internal links should describe real relationships.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Use Breadcrumbs to Reinforce Hierarchy&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Breadcrumb navigation can provide another clear signal of site structure.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;p&gt;Home → Services → Generative Engine Optimization&lt;/p&gt;

&lt;p&gt;or:&lt;/p&gt;

&lt;p&gt;Home → Insights → AI Search → Entity Optimization&lt;/p&gt;

&lt;p&gt;This makes the page's location within the broader website easier to understand.&lt;/p&gt;

&lt;p&gt;Breadcrumbs also improve user navigation on larger websites.&lt;/p&gt;

&lt;p&gt;When appropriate, the visible breadcrumb structure can be supported by valid BreadcrumbList structured data.&lt;/p&gt;

&lt;p&gt;The markup should represent the actual page hierarchy rather than inventing one solely for search engines.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Implement Structured Data as Entity Support&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Structured data can help machines interpret specific information about a page.&lt;/p&gt;

&lt;p&gt;Depending on the website, useful schema types may include:&lt;/p&gt;

&lt;p&gt;Organization&lt;br&gt;
LocalBusiness&lt;br&gt;
Service&lt;br&gt;
Product&lt;br&gt;
Person&lt;br&gt;
Article&lt;br&gt;
BlogPosting&lt;br&gt;
BreadcrumbList&lt;br&gt;
VideoObject&lt;br&gt;
FAQPage when appropriate&lt;/p&gt;

&lt;p&gt;The most important rule is accuracy.&lt;/p&gt;

&lt;p&gt;Structured data should represent information that genuinely exists.&lt;/p&gt;

&lt;p&gt;Do not invent:&lt;/p&gt;

&lt;p&gt;Ratings&lt;br&gt;
Reviews&lt;br&gt;
Prices&lt;br&gt;
Locations&lt;br&gt;
Certifications&lt;br&gt;
Employees&lt;br&gt;
Services&lt;/p&gt;

&lt;p&gt;For GEO, structured data should be treated as a machine-readable reinforcement of the visible content—not as a separate layer containing claims the user cannot see.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Connect Organization Information Consistently&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The website should make its primary organization entity easy to identify.&lt;/p&gt;

&lt;p&gt;Important organization information can include:&lt;/p&gt;

&lt;p&gt;Official business name&lt;br&gt;
Website&lt;br&gt;
Logo&lt;br&gt;
Contact information&lt;br&gt;
Business description&lt;br&gt;
Location&lt;br&gt;
Relevant social profiles&lt;/p&gt;

&lt;p&gt;These details should remain consistent throughout the website.&lt;/p&gt;

&lt;p&gt;For example, a footer should not show one company name while structured data contains another unrelated variation unless the relationship is clearly established.&lt;/p&gt;

&lt;p&gt;The same principle applies to location information.&lt;/p&gt;

&lt;p&gt;If the company is headquartered in Cebu, the website should not create ambiguous signals implying offices in locations where no genuine office exists.&lt;/p&gt;

&lt;p&gt;Entity clarity depends on factual consistency.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Use Stable URLs for Important Content&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Constantly changing URLs can weaken the relationships a website has built over time.&lt;/p&gt;

&lt;p&gt;Important service and resource pages should use stable, descriptive URLs whenever possible.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;p&gt;/generative-engine-optimization/&lt;/p&gt;

&lt;p&gt;is clearer than:&lt;/p&gt;

&lt;p&gt;/service-07-new-final/&lt;/p&gt;

&lt;p&gt;Good URLs usually:&lt;/p&gt;

&lt;p&gt;Describe the topic&lt;br&gt;
Avoid unnecessary dates&lt;br&gt;
Avoid random IDs when not required&lt;br&gt;
Use consistent patterns&lt;br&gt;
Remain stable&lt;/p&gt;

&lt;p&gt;If an important URL must change, implement an appropriate redirect and update internal references.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Reduce Duplicate Entity Pages&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Duplicate or nearly identical pages can create ambiguity.&lt;/p&gt;

&lt;p&gt;For example, a website might accidentally have:&lt;/p&gt;

&lt;p&gt;/geo-services/&lt;br&gt;
/generative-engine-optimization/&lt;br&gt;
/ai-search-services/&lt;br&gt;
/geo-ai-search/&lt;/p&gt;

&lt;p&gt;If all four pages target essentially the same service and search intent, search systems may struggle to understand which page is authoritative.&lt;/p&gt;

&lt;p&gt;Developers and SEO teams should regularly review:&lt;/p&gt;

&lt;p&gt;Duplicate URLs&lt;br&gt;
Parameter variations&lt;br&gt;
Canonicalization&lt;br&gt;
Thin location pages&lt;br&gt;
Repeated service pages&lt;br&gt;
Archived versions&lt;/p&gt;

&lt;p&gt;Consolidation may be more useful than creating another page.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Make JavaScript Rendering Reliable&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;JavaScript frameworks can create excellent websites, but critical content should not depend on fragile client-side behavior.&lt;/p&gt;

&lt;p&gt;Review whether:&lt;/p&gt;

&lt;p&gt;Primary page content is available during rendering&lt;br&gt;
Metadata is generated correctly&lt;br&gt;
Canonicals are stable&lt;br&gt;
Internal links use crawlable URLs&lt;br&gt;
Server errors do not produce empty pages&lt;br&gt;
Hydration problems do not remove content&lt;br&gt;
Important structured data is present correctly&lt;/p&gt;

&lt;p&gt;Server-side rendering, static generation, or other rendering approaches may help depending on the application's architecture.&lt;/p&gt;

&lt;p&gt;There is no single framework required for GEO.&lt;/p&gt;

&lt;p&gt;The important outcome is that meaningful content is accessible reliably.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Improve Page Performance Without Removing Context&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Performance matters because slow websites create poor user experiences and can interfere with discovery.&lt;/p&gt;

&lt;p&gt;Developers should optimize:&lt;/p&gt;

&lt;p&gt;Images&lt;br&gt;
Fonts&lt;br&gt;
JavaScript&lt;br&gt;
CSS&lt;br&gt;
Video&lt;br&gt;
Third-party scripts&lt;br&gt;
Caching&lt;br&gt;
Server response&lt;br&gt;
Layout stability&lt;/p&gt;

&lt;p&gt;However, performance optimization should not remove useful context.&lt;/p&gt;

&lt;p&gt;For example, replacing a detailed service explanation with only an image may reduce HTML size but make the page much less understandable.&lt;/p&gt;

&lt;p&gt;Optimize delivery, not meaning.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Make Images and Video Understandable&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Visual content can support GEO when the surrounding information explains what it represents.&lt;/p&gt;

&lt;p&gt;For images:&lt;/p&gt;

&lt;p&gt;Use meaningful filenames when practical&lt;br&gt;
Provide accurate alt text&lt;br&gt;
Add captions when they provide useful context&lt;br&gt;
Place images near relevant content&lt;/p&gt;

&lt;p&gt;For video:&lt;/p&gt;

&lt;p&gt;Use descriptive titles&lt;br&gt;
Provide captions&lt;br&gt;
Consider transcripts&lt;br&gt;
Explain the subject in surrounding text&lt;br&gt;
Use VideoObject structured data when appropriate&lt;/p&gt;

&lt;p&gt;Do not rely on the video itself to communicate information that is essential to understanding the page.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Strengthen Author and Expert Relationships&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For content where authorship matters, developers can support clearer relationships between:&lt;/p&gt;

&lt;p&gt;Article → Author → Organization&lt;/p&gt;

&lt;p&gt;An author page may include verified information such as:&lt;/p&gt;

&lt;p&gt;Name&lt;br&gt;
Role&lt;br&gt;
Relevant expertise&lt;br&gt;
Published articles&lt;br&gt;
Professional biography&lt;/p&gt;

&lt;p&gt;Do not automatically generate fake expert profiles for SEO.&lt;/p&gt;

&lt;p&gt;If authorship information is limited, keep it factual and concise.&lt;/p&gt;

&lt;p&gt;Strong GEO implementation is based on real entities.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Support Content Freshness&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Developers can make content maintenance easier by giving editorial teams access to:&lt;/p&gt;

&lt;p&gt;Updated dates&lt;br&gt;
Review dates&lt;br&gt;
Author information&lt;br&gt;
Structured content fields&lt;br&gt;
Reusable FAQ components&lt;br&gt;
Internal-link management&lt;br&gt;
Service information modules&lt;/p&gt;

&lt;p&gt;For changing topics such as AI search, content should periodically be reviewed.&lt;/p&gt;

&lt;p&gt;A technically excellent page containing outdated claims is still an information-quality problem.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Build for Clear Business Relationships&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A website should help machines answer basic questions about the business.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;p&gt;Who is this?&lt;br&gt;
Joyno Media.&lt;/p&gt;

&lt;p&gt;What is it?&lt;br&gt;
A digital marketing agency.&lt;/p&gt;

&lt;p&gt;What does it offer?&lt;br&gt;
Digital marketing, SEO, website development, branding, commercial video, GEO, and other stated services.&lt;/p&gt;

&lt;p&gt;Where is it based?&lt;br&gt;
Cebu, Philippines.&lt;/p&gt;

&lt;p&gt;What topic does this article cover?&lt;br&gt;
Generative Engine Optimization.&lt;/p&gt;

&lt;p&gt;How is the article related to the business?&lt;br&gt;
GEO is one of the services represented by the company.&lt;/p&gt;

&lt;p&gt;Developers do not need to write these questions into every page.&lt;/p&gt;

&lt;p&gt;They need to build an architecture where the answers are easy to infer from explicit, consistent information.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create a GEO-Friendly Technical Workflow&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A practical developer workflow can follow this sequence:&lt;/p&gt;

&lt;p&gt;Step 1: Crawl the Website&lt;/p&gt;

&lt;p&gt;Identify:&lt;/p&gt;

&lt;p&gt;Important URLs&lt;br&gt;
Status codes&lt;br&gt;
Redirects&lt;br&gt;
Canonicals&lt;br&gt;
Indexability&lt;br&gt;
Internal links&lt;br&gt;
Step 2: Map Entities&lt;/p&gt;

&lt;p&gt;Document the site's important:&lt;/p&gt;

&lt;p&gt;Organization&lt;br&gt;
Services&lt;br&gt;
People&lt;br&gt;
Locations&lt;br&gt;
Products&lt;br&gt;
Topics&lt;br&gt;
Step 3: Map Relationships&lt;/p&gt;

&lt;p&gt;Determine which pages should connect.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;p&gt;Organization → GEO Service → GEO Guides → Author&lt;/p&gt;

&lt;p&gt;Step 4: Review Page Structure&lt;/p&gt;

&lt;p&gt;Check:&lt;/p&gt;

&lt;p&gt;H1&lt;br&gt;
H2/H3 hierarchy&lt;br&gt;
Answer blocks&lt;br&gt;
Navigation&lt;br&gt;
Breadcrumbs&lt;br&gt;
Semantic markup&lt;br&gt;
Step 5: Validate Structured Data&lt;/p&gt;

&lt;p&gt;Make sure markup:&lt;/p&gt;

&lt;p&gt;Is syntactically valid&lt;br&gt;
Matches visible information&lt;br&gt;
Uses relevant schema types&lt;br&gt;
Does not contain unsupported claims&lt;br&gt;
Step 6: Review Rendering&lt;/p&gt;

&lt;p&gt;Confirm critical content works across:&lt;/p&gt;

&lt;p&gt;Desktop&lt;br&gt;
Mobile&lt;br&gt;
Server rendering&lt;br&gt;
Client rendering&lt;br&gt;
Step 7: Improve Internal Linking&lt;/p&gt;

&lt;p&gt;Connect related entities and content intentionally.&lt;/p&gt;

&lt;p&gt;Step 8: Monitor Changes&lt;/p&gt;

&lt;p&gt;Review:&lt;/p&gt;

&lt;p&gt;Search indexing&lt;br&gt;
Crawl errors&lt;br&gt;
structured-data errors&lt;br&gt;
Broken links&lt;br&gt;
Traffic&lt;br&gt;
AI referrals where measurable&lt;br&gt;
Content accuracy&lt;/p&gt;

&lt;p&gt;GEO should become part of ongoing website maintenance rather than a one-time implementation.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;What Developers Should Avoid&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Some practices can make a website harder to understand.&lt;/p&gt;

&lt;p&gt;Avoid:&lt;/p&gt;

&lt;p&gt;Hiding important content unnecessarily&lt;br&gt;
Generating thousands of thin pages&lt;br&gt;
Creating fake location pages&lt;br&gt;
Duplicating service content&lt;br&gt;
Stuffing keywords into structured data&lt;br&gt;
Using schema for information not visible to users&lt;br&gt;
Building navigation entirely around generic labels&lt;br&gt;
Publishing unsupported statistics&lt;br&gt;
Creating fake expert profiles&lt;br&gt;
Relying solely on JavaScript for critical information&lt;br&gt;
Changing URLs without redirects&lt;br&gt;
Treating GEO as a replacement for technical SEO&lt;/p&gt;

&lt;p&gt;Clarity is more valuable than complexity.&lt;/p&gt;

&lt;p&gt;GEO Developer Checklist&lt;/p&gt;

&lt;p&gt;Before considering a website technically ready for stronger AI-search visibility, review whether:&lt;/p&gt;

&lt;p&gt;Important pages are crawlable.&lt;br&gt;
Important pages are indexable.&lt;br&gt;
Canonicals are correct.&lt;br&gt;
URLs are stable.&lt;br&gt;
Primary entities have clear pages.&lt;br&gt;
Business information is consistent.&lt;br&gt;
Headings describe actual topics.&lt;br&gt;
Important answers are extractable.&lt;br&gt;
Internal links describe relationships.&lt;br&gt;
Breadcrumbs reinforce hierarchy.&lt;br&gt;
Structured data matches visible content.&lt;br&gt;
Critical content renders reliably.&lt;br&gt;
Mobile users can access the same important information.&lt;br&gt;
Images have meaningful context.&lt;br&gt;
Video content includes supporting text.&lt;br&gt;
Duplicate entity pages are controlled.&lt;br&gt;
Authors and organizations are connected accurately.&lt;br&gt;
Important pages are updated when necessary.&lt;br&gt;
No artificial authority signals are being manufactured.&lt;br&gt;
Final Thoughts&lt;/p&gt;

&lt;p&gt;GEO for developers is fundamentally an information-architecture problem.&lt;/p&gt;

&lt;p&gt;The technical objective is to make relationships clear:&lt;/p&gt;

&lt;p&gt;Business → Service → Topic → Answer → Supporting Evidence&lt;/p&gt;

&lt;p&gt;A site that is crawlable, semantically structured, internally connected, entity-consistent, and supported by accurate structured data provides a much stronger foundation for both traditional search and AI-powered retrieval.&lt;/p&gt;

&lt;p&gt;There is no technical switch that guarantees an AI system will cite or recommend a business.&lt;/p&gt;

&lt;p&gt;What developers can control is whether the website is easy to access, interpret, and connect.&lt;/p&gt;

&lt;p&gt;Businesses building a stronger technical foundation for AI-powered discovery can explore Joyno Media's &lt;a href="https://joynomedia.com/" rel="noopener noreferrer"&gt;generative engine optimization services&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Disclosure: This educational article was prepared by Joyno Media, a digital marketing agency based in Cebu, Philippines.&lt;/p&gt;

</description>
      <category>staticwebapps</category>
      <category>todayisearched</category>
      <category>technicalseo</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Automating 204 Lighthouse Audits to find the fastest Shopify Theme</title>
      <dc:creator>Deepak Jangra</dc:creator>
      <pubDate>Thu, 03 Sep 2026 15:25:58 +0000</pubDate>
      <link>https://dev.to/ivewor/automating-204-lighthouse-audits-to-find-the-fastest-shopify-theme-514n</link>
      <guid>https://dev.to/ivewor/automating-204-lighthouse-audits-to-find-the-fastest-shopify-theme-514n</guid>
      <description>&lt;p&gt;I needed to find the actual baseline speed of popular Shopify themes. Since dev stores are password-protected, manual PageSpeed Insights URLs don't work.&lt;/p&gt;

&lt;p&gt;I wrote a Node.js script using Puppeteer to bypass the storefront password, and hooked it into the Lighthouse CLI to audit 17 themes across mobile and desktop viewports, running 3 passes each to get the median.&lt;/p&gt;

&lt;p&gt;It turns out that while Shopify's default free themes are highly optimized, a few premium themes (like Broadcast and Expanse) manage to keep a perfect 100 score even with heavy UI components.&lt;/p&gt;

&lt;p&gt;I published my methodology, the full dataset, and the raw JSON reports on my blog. If you do Shopify dev work, you can check the baseline numbers. You check more about the &lt;a href="https://deepakj.dev/blog/fastest-shopify-themes" rel="noopener noreferrer"&gt;fastest shopify theme here&lt;/a&gt;&lt;/p&gt;

</description>
      <category>performance</category>
      <category>puppet</category>
      <category>staticwebapps</category>
      <category>ai</category>
    </item>
    <item>
      <title>A Beginner's Guide to Form Backends: What They Are and When You Need One</title>
      <dc:creator>Yevhen Kozachenko 🇺🇦🇩🇪</dc:creator>
      <pubDate>Mon, 31 Aug 2026 15:50:00 +0000</pubDate>
      <link>https://dev.to/ekwoster/a-beginners-guide-to-form-backends-what-they-are-and-when-you-need-one-25ne</link>
      <guid>https://dev.to/ekwoster/a-beginners-guide-to-form-backends-what-they-are-and-when-you-need-one-25ne</guid>
      <description>&lt;h1&gt;
  
  
  A Beginner's Guide to Form Backends: What They Are and When You Need One — with onsubmit.dev (form backend)
&lt;/h1&gt;

&lt;p&gt;You built a portfolio site. The contact form looks great. The validation works. Then you click “Send” and realize there’s one missing piece: where does the form data actually go? This is where a form backend comes in. Services such as &lt;a href="https://onsubmit.dev" rel="noopener noreferrer"&gt;onsubmit.dev (form backend)&lt;/a&gt; give your form an endpoint that can receive submissions without requiring you to build and deploy your own server.&lt;/p&gt;

&lt;p&gt;If you’re learning frontend development, this distinction can be confusing at first. Let’s look at what happens after a user presses Submit, what “form backend as a service” means, and when using one makes more sense than writing an API yourself.&lt;/p&gt;

&lt;h2&gt;
  
  
  A form is only the frontend
&lt;/h2&gt;

&lt;p&gt;Consider a contact form containing a few familiar fields:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Name&lt;/li&gt;
&lt;li&gt;Email&lt;/li&gt;
&lt;li&gt;Message&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;HTML can collect those values, and JavaScript can validate them or improve the user experience. But something still needs to receive the submitted data and do something useful with it.&lt;/p&gt;

&lt;p&gt;In a traditional application, the flow might look like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Browser
   |
   | POST form data
   v
Your API server
   |
   +--&amp;gt; validate input
   +--&amp;gt; store data
   +--&amp;gt; send email/notification
   +--&amp;gt; return a response
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That API server is the form's backend.&lt;/p&gt;

&lt;p&gt;Building one can mean creating an API route, configuring a server or serverless function, validating input, handling errors, managing secrets, preventing abuse, and deploying and maintaining the whole thing.&lt;/p&gt;

&lt;p&gt;Those are valuable skills to learn. They can also be unnecessary infrastructure when all you want is a working contact form.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is a “form backend as a service”?
&lt;/h2&gt;

&lt;p&gt;A form backend service provides the server-side endpoint for you.&lt;/p&gt;

&lt;p&gt;Instead of sending submissions to an API that you wrote:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Browser -&amp;gt; Your frontend -&amp;gt; Your API -&amp;gt; Destination
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;you send them to a managed form backend:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Browser -&amp;gt; Your frontend -&amp;gt; Form backend service -&amp;gt; Destination
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The important idea is that your website can remain frontend-only.&lt;/p&gt;

&lt;p&gt;For example, you could host a static portfolio on a platform or CDN without provisioning your own application server just to process its contact form.&lt;/p&gt;

&lt;p&gt;A form backend generally takes responsibility for receiving the HTTP request and processing the submission. Depending on the service and configuration, it may also cover things such as validation, notifications, storage, or integrations.&lt;/p&gt;

&lt;p&gt;That makes this pattern particularly useful for static sites and relatively simple forms.&lt;/p&gt;

&lt;h2&gt;
  
  
  When should you use one?
&lt;/h2&gt;

&lt;p&gt;A managed form backend is a good fit when the form itself isn't an important part of your application's business logic.&lt;/p&gt;

&lt;p&gt;Common examples include portfolio contact forms, landing-page inquiries, feedback forms, waitlists, and simple lead-generation forms.&lt;/p&gt;

&lt;p&gt;Imagine you're a junior developer building your portfolio. Creating an entire Express application, database, deployment pipeline, and email integration just so recruiters can send you a message probably isn't the best use of the project's complexity budget.&lt;/p&gt;

&lt;p&gt;A form backend can keep that portfolio essentially static while still giving the form somewhere useful to send its data.&lt;/p&gt;

&lt;p&gt;It can also be handy for prototypes. If you're testing whether people are interested in an idea, getting the form online quickly may matter much more than designing a permanent backend architecture.&lt;/p&gt;

&lt;h2&gt;
  
  
  When should you build the backend yourself?
&lt;/h2&gt;

&lt;p&gt;Form backends aren't substitutes for every API.&lt;/p&gt;

&lt;p&gt;Suppose you're creating a banking application and a submitted form initiates a money transfer. That isn't simply a message you need to collect. It involves authentication, authorization, account state, transactional database operations, auditing, and application-specific security rules.&lt;/p&gt;

&lt;p&gt;That belongs in application backend code you control.&lt;/p&gt;

&lt;p&gt;The same applies when a submission is deeply tied to your domain model. Creating an order, modifying a user account, accessing sensitive internal systems, or running a complicated application-specific workflow will usually require your own backend.&lt;/p&gt;

&lt;p&gt;A useful question is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Am I collecting a submission, or executing my application's business logic?”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;For straightforward collection, a managed service may be sufficient. For application business logic, build the appropriate backend.&lt;/p&gt;

&lt;p&gt;There is also plenty of room between those extremes. Your requirements can grow over time, so choosing a managed service today doesn't prevent you from replacing it with your own API later.&lt;/p&gt;

&lt;h2&gt;
  
  
  A worked example with onsubmit.dev (form backend)
&lt;/h2&gt;

&lt;p&gt;As an example of the managed approach, onsubmit.dev (form backend) provides form endpoints without requiring you to operate your own backend.&lt;/p&gt;

&lt;p&gt;The service also provides integrations/packages for React, Next.js, Vue, and Astro, so it can fit into projects built with those frameworks rather than requiring you to restructure the application around a separate server.&lt;/p&gt;

&lt;p&gt;The important architectural change is small:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Before:

&amp;lt;form&amp;gt;
    ↓
Nowhere to send the data


With a form backend:

&amp;lt;form&amp;gt;
    ↓
Managed endpoint
    ↓
Submission gets processed
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To build the actual implementation, create/configure the form endpoint and follow the service's documentation for your framework at &lt;code&gt;https://onsubmit.dev/docs&lt;/code&gt; and &lt;code&gt;https://onsubmit.dev/integrations&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;This is worth emphasizing for beginners: an endpoint URL isn't just a magic string. It represents the server receiving your HTTP request. With a managed form backend, someone else operates that server-side layer for you.&lt;/p&gt;

&lt;h2&gt;
  
  
  What about JavaScript validation?
&lt;/h2&gt;

&lt;p&gt;Client-side validation and backend processing solve different problems.&lt;/p&gt;

&lt;p&gt;For example, your frontend might check whether an email looks valid before allowing a submission. That's useful because users receive immediate feedback.&lt;/p&gt;

&lt;p&gt;But frontend validation runs in the user's browser and can be bypassed. You should never treat it as a security boundary.&lt;/p&gt;

&lt;p&gt;Think of the responsibilities this way:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Frontend:
- Display the form
- Improve UX
- Catch obvious input mistakes
- Show loading/success/error states

Backend:
- Receive the request
- Treat input as untrusted
- Process the submission
- Perform server-side checks
- Return a result
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That remains true whether you wrote the backend yourself or use a form backend service.&lt;/p&gt;

&lt;h2&gt;
  
  
  “But shouldn't I build it myself to learn?”
&lt;/h2&gt;

&lt;p&gt;Sometimes, absolutely.&lt;/p&gt;

&lt;p&gt;If your goal is to learn backend development, building a form API is a great exercise. You can learn HTTP methods, request bodies, server-side validation, status codes, databases, environment variables, email APIs, security, and deployment from a relatively approachable project.&lt;/p&gt;

&lt;p&gt;But learning how to build infrastructure and deciding whether a production project needs that infrastructure are two different skills.&lt;/p&gt;

&lt;p&gt;Developers routinely rely on managed databases, authentication providers, payment processors, email APIs, cloud storage, and other services. Form handling can be another example of choosing a managed component when implementing it yourself provides little project-specific value.&lt;/p&gt;

&lt;h2&gt;
  
  
  The main takeaway
&lt;/h2&gt;

&lt;p&gt;Submitting a form is fundamentally an HTTP interaction: the browser collects some data and sends it somewhere. The moment you need to receive, validate, store, forward, or otherwise process that data on a server, you've entered backend territory.&lt;/p&gt;

&lt;p&gt;You then have a choice.&lt;/p&gt;

&lt;p&gt;Build that backend yourself when the submission involves your application's business logic, specialized security requirements, or workflows that require deeper control. Consider a form backend as a service when you're primarily collecting straightforward submissions and don't want to operate server-side infrastructure just for that purpose.&lt;/p&gt;

&lt;p&gt;Understanding that tradeoff is more useful than always reaching for one solution. The goal isn't to avoid backend development—it's to know when your project actually needs a custom backend and when a managed endpoint is enough.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>frontend</category>
      <category>staticwebapps</category>
    </item>
    <item>
      <title>Airtable as a Lightweight CRM: Capturing Website Leads Automatically</title>
      <dc:creator>Yevhen Kozachenko 🇺🇦🇩🇪</dc:creator>
      <pubDate>Sun, 30 Aug 2026 15:47:00 +0000</pubDate>
      <link>https://dev.to/ekwoster/airtable-as-a-lightweight-crm-capturing-website-leads-automatically-l88</link>
      <guid>https://dev.to/ekwoster/airtable-as-a-lightweight-crm-capturing-website-leads-automatically-l88</guid>
      <description>&lt;h1&gt;
  
  
  Airtable as a Lightweight CRM: Capturing Website Leads Automatically with onsubmit.dev (form backend)
&lt;/h1&gt;

&lt;p&gt;For a small business or solo founder, a full CRM can be more infrastructure than you need. If your workflow is essentially “website visitor submits a form → lead appears somewhere I can track it,” Airtable plus &lt;a href="https://onsubmit.dev" rel="noopener noreferrer"&gt;onsubmit.dev (form backend)&lt;/a&gt; can provide a lightweight alternative without requiring you to build and maintain your own form-processing backend.&lt;/p&gt;

&lt;p&gt;This setup is particularly useful for early-stage projects where you want structured lead management now but aren't ready to adopt HubSpot, Salesforce, or another dedicated CRM.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why use Airtable as a CRM?
&lt;/h2&gt;

&lt;p&gt;Airtable isn't a CRM in the traditional sense. It's a flexible database/spreadsheet hybrid, which makes it surprisingly effective for a simple sales pipeline.&lt;/p&gt;

&lt;p&gt;For example, a &lt;code&gt;Leads&lt;/code&gt; table might contain:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Name&lt;/td&gt;
&lt;td&gt;Contact name&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Email&lt;/td&gt;
&lt;td&gt;Contact details&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Company&lt;/td&gt;
&lt;td&gt;Company or project&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Message&lt;/td&gt;
&lt;td&gt;Original inquiry&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Status&lt;/td&gt;
&lt;td&gt;New, Contacted, Qualified, Won, Lost&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Source&lt;/td&gt;
&lt;td&gt;Website, referral, campaign, etc.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Created&lt;/td&gt;
&lt;td&gt;Submission date&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Notes&lt;/td&gt;
&lt;td&gt;Follow-up notes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;You can then create Airtable views for new leads, qualified opportunities, customers, or leads that need follow-up.&lt;/p&gt;

&lt;p&gt;For a founder handling a modest number of inquiries, that can be enough CRM.&lt;/p&gt;

&lt;h2&gt;
  
  
  The missing piece: getting website forms into Airtable
&lt;/h2&gt;

&lt;p&gt;The awkward part is usually connecting your public website to your lead database.&lt;/p&gt;

&lt;p&gt;You could have the browser call Airtable's API directly, but that would require credentials that shouldn't be exposed in client-side code. The safer conventional solution is your own API endpoint:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Website form
      ↓
Your API/serverless function
      ↓
Airtable API
      ↓
Leads table
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That API isn't necessarily difficult to write, but it introduces another component to deploy, secure, monitor, and maintain.&lt;/p&gt;

&lt;p&gt;A form backend removes that component from your application.&lt;/p&gt;

&lt;p&gt;With onsubmit.dev (form backend), the architecture becomes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Website form
      ↓
Form backend
      ↓
Airtable
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your site's job is simply to collect the lead.&lt;/p&gt;

&lt;h2&gt;
  
  
  Setting up the workflow
&lt;/h2&gt;

&lt;p&gt;Start by creating an Airtable base for your leads. Keep the initial schema small; &lt;code&gt;Name&lt;/code&gt;, &lt;code&gt;Email&lt;/code&gt;, &lt;code&gt;Company&lt;/code&gt;, &lt;code&gt;Message&lt;/code&gt;, &lt;code&gt;Status&lt;/code&gt;, and &lt;code&gt;Created&lt;/code&gt; are usually plenty.&lt;/p&gt;

&lt;p&gt;Then configure your form submission workflow and Airtable integration using the service's documentation. It's worth checking the current integration instructions rather than hard-coding an example from a blog post, especially because authentication and integration configuration can change over time.&lt;/p&gt;

&lt;p&gt;The goal is to map incoming form fields to the corresponding Airtable columns:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;name    → Name
email   → Email
company → Company
message → Message
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A useful pattern is to give every newly created record a default &lt;code&gt;New&lt;/code&gt; status. Your Airtable workflow can then be built around processing records with that status.&lt;/p&gt;

&lt;h2&gt;
  
  
  What about React, Next.js, Vue, and Astro?
&lt;/h2&gt;

&lt;p&gt;This approach isn't tied to a particular frontend stack.&lt;/p&gt;

&lt;p&gt;onsubmit.dev (form backend) provides integrations/packages for React, Next.js, Vue, and Astro, so the same basic architecture can work whether you have a static marketing site or an application built with one of those frameworks.&lt;/p&gt;

&lt;p&gt;For implementation code, use the current examples in the product documentation rather than copying an approximation: that ensures package names, APIs, and configuration match the version you're actually installing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Turning Airtable into a small sales pipeline
&lt;/h2&gt;

&lt;p&gt;Once submissions arrive automatically, Airtable becomes much more useful than an inbox full of contact-form notifications.&lt;/p&gt;

&lt;p&gt;Create a &lt;code&gt;Status&lt;/code&gt; single-select field with values such as:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;New → Contacted → Qualified → Won / Lost&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;You can then use filtered views to answer practical questions: Which leads haven't received a response? Which opportunities are qualified? Where did this month's inquiries originate?&lt;/p&gt;

&lt;p&gt;Add fields such as estimated value, next follow-up date, owner, and source only when you actually need them.&lt;/p&gt;

&lt;p&gt;This incremental approach is one advantage of using Airtable at an early stage. You don't have to design your entire sales process before receiving your first lead.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why not start with HubSpot or Salesforce?
&lt;/h2&gt;

&lt;p&gt;You certainly can. Dedicated CRMs provide capabilities Airtable doesn't, including sophisticated sales automation, contact timelines, reporting, permissions, email tooling, and integrations across larger sales organizations.&lt;/p&gt;

&lt;p&gt;The tradeoff is complexity.&lt;/p&gt;

&lt;p&gt;For an early-stage project with one person answering a handful of inquiries, a CRM implementation can be premature. Airtable's free tier combined with a form backend can cover the narrower requirement: capture leads reliably, put them into a structured pipeline, and make sure somebody follows up.&lt;/p&gt;

&lt;p&gt;There are limits. Airtable's free tier has usage restrictions, while your form service may have its own limits or pricing. As lead volume and sales processes grow, a purpose-built CRM can become the better choice.&lt;/p&gt;

&lt;h2&gt;
  
  
  A practical migration path
&lt;/h2&gt;

&lt;p&gt;Starting lightweight doesn't mean committing to Airtable forever.&lt;/p&gt;

&lt;p&gt;Your website form can remain conceptually separate from the system where leads ultimately live. If the business eventually moves to a dedicated CRM, you can migrate records and change the destination rather than redesigning the entire website.&lt;/p&gt;

&lt;p&gt;That's a useful rule for early-stage infrastructure: optimize for today's requirements while avoiding unnecessary coupling.&lt;/p&gt;

&lt;p&gt;For a solo founder or small team, Airtable plus a hosted form backend occupies a useful middle ground between manually copying inquiries from email and building a complete CRM integration yourself. It gets leads out of your inbox and into a trackable pipeline while keeping the website architecture small.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>frontend</category>
      <category>staticwebapps</category>
    </item>
    <item>
      <title>Webhook-First Form Handling: Piping Submissions Into Your Own Stack</title>
      <dc:creator>Yevhen Kozachenko 🇺🇦🇩🇪</dc:creator>
      <pubDate>Sat, 29 Aug 2026 15:45:00 +0000</pubDate>
      <link>https://dev.to/ekwoster/webhook-first-form-handling-piping-submissions-into-your-own-stack-31gi</link>
      <guid>https://dev.to/ekwoster/webhook-first-form-handling-piping-submissions-into-your-own-stack-31gi</guid>
      <description>&lt;h1&gt;
  
  
  Webhook-First Form Handling: Piping Submissions Into Your Own Stack with onsubmit.dev (form backend)
&lt;/h1&gt;

&lt;p&gt;For backend-heavy applications, form handling rarely ends with “send me an email.” A submission may need to enter a queue, be normalized and persisted, create a CRM lead, or trigger an internal workflow. &lt;a href="https://onsubmit.dev" rel="noopener noreferrer"&gt;onsubmit.dev (form backend)&lt;/a&gt; can sit at the public edge of that architecture: the browser submits to a managed form endpoint, while your own stack receives the resulting webhook and performs the domain-specific work.&lt;/p&gt;

&lt;p&gt;The interesting part of this approach is the separation between public form ingestion and application processing. Your backend no longer needs a dedicated internet-facing form controller just to deal with browser submissions.&lt;/p&gt;

&lt;h2&gt;
  
  
  The architecture
&lt;/h2&gt;

&lt;p&gt;A webhook-first pipeline can look like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Browser / static site
        |
        | form POST
        v
onsubmit.dev (form backend)
        |
        | webhook
        v
Your webhook endpoint
        |
        +----&amp;gt; Database
        |
        +----&amp;gt; Queue / event bus
        |
        +----&amp;gt; CRM
        |
        +----&amp;gt; Internal services
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is especially useful when the frontend and backend have different deployment lifecycles. A marketing site can remain static, for example, while submissions ultimately enter infrastructure owned by the backend team.&lt;/p&gt;

&lt;p&gt;The ingestion layer deals with accepting the form submission. Your webhook handler remains responsible for business semantics.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why put an ingestion layer in front?
&lt;/h2&gt;

&lt;p&gt;You could expose &lt;code&gt;/api/contact&lt;/code&gt; from your application and POST directly to it. For many products, that's entirely reasonable.&lt;/p&gt;

&lt;p&gt;The webhook-first model becomes more interesting when forms are outside your main application boundary: documentation sites, landing pages, Astro-generated sites, campaign pages, or independently deployed React/Vue frontends.&lt;/p&gt;

&lt;p&gt;Instead of making every frontend deployment aware of your internal application topology, you get a boundary like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;untrusted/public input
       ↓
form ingestion
       ↓
webhook boundary
       ↓
trusted application pipeline
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That boundary lets your application concentrate on what happens after ingestion.&lt;/p&gt;

&lt;p&gt;For example, a “request a demo” submission might result in a durable internal event rather than a synchronous chain of API calls:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;form.accepted
    ↓
queue
    ├──&amp;gt; lead persistence worker
    ├──&amp;gt; CRM synchronization worker
    └──&amp;gt; analytics worker
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now a temporary CRM outage does not necessarily have to make the original form-processing workflow fail.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keep webhook handlers boring
&lt;/h2&gt;

&lt;p&gt;A common webhook mistake is doing every piece of work before returning the HTTP response.&lt;/p&gt;

&lt;p&gt;Imagine this handler:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;receive webhook
    ↓
validate
    ↓
insert database row
    ↓
call CRM
    ↓
send notification
    ↓
update analytics
    ↓
return 200
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You have just coupled webhook acknowledgement to the latency and availability of several unrelated systems.&lt;/p&gt;

&lt;p&gt;For production systems, a better boundary is usually:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;receive
  → authenticate/validate
  → assign or read an event ID
  → durably persist/enqueue
  → acknowledge

worker
  → normalize
  → apply business rules
  → update DB
  → synchronize CRM
  → trigger downstream events
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This makes the webhook endpoint a thin adapter rather than another business-logic controller.&lt;/p&gt;

&lt;h2&gt;
  
  
  Assume delivery can happen more than once
&lt;/h2&gt;

&lt;p&gt;Once a form submission becomes a webhook, treat it like any other distributed event.&lt;/p&gt;

&lt;p&gt;In particular, consumers should be idempotent. If the same submission reaches your endpoint twice, processing it twice should not create two CRM contacts, send two welcome sequences, or produce duplicate database records.&lt;/p&gt;

&lt;p&gt;If the incoming event has a stable unique identifier, store it alongside the processing state and enforce uniqueness at the database level. Conceptually:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="n"&gt;webhook_events&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;event_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;VALUES&lt;/span&gt; &lt;span class="p"&gt;(:&lt;/span&gt;&lt;span class="n"&gt;event_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'received'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;CONFLICT&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;event_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;DO&lt;/span&gt; &lt;span class="k"&gt;NOTHING&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A uniqueness constraint is substantially safer than an application-level “check whether this exists, then insert” sequence, which can race under concurrent delivery.&lt;/p&gt;

&lt;p&gt;Downstream integrations need the same consideration. If your CRM API supports idempotency keys, propagate a stable identifier into those calls.&lt;/p&gt;

&lt;h2&gt;
  
  
  Preserve the raw event
&lt;/h2&gt;

&lt;p&gt;It is tempting to immediately transform a form payload into your internal &lt;code&gt;Lead&lt;/code&gt; or &lt;code&gt;ContactRequest&lt;/code&gt; model and discard the original.&lt;/p&gt;

&lt;p&gt;Keeping the raw webhook payload is often worth the small storage cost.&lt;/p&gt;

&lt;p&gt;It gives you something to inspect when a mapping changes, a worker has a bug, or an external integration needs to be replayed. A useful internal event record typically contains the provider/event identifier, receipt timestamp, raw payload, processing status, attempt count, and last failure.&lt;/p&gt;

&lt;p&gt;That creates a useful distinction between “we received this submission” and “all downstream effects completed successfully.”&lt;/p&gt;

&lt;h2&gt;
  
  
  Treat the webhook as an external API
&lt;/h2&gt;

&lt;p&gt;Putting onsubmit.dev (form backend) in front of the form does not make the receiving webhook inherently trusted. The webhook route is still an externally reachable integration boundary.&lt;/p&gt;

&lt;p&gt;Use the authentication or verification mechanism documented for the integration, validate what you receive, enforce payload limits where appropriate, and keep credentials out of frontend code. Consult the current service documentation before implementing verification rather than assuming a particular signature scheme or payload format.&lt;/p&gt;

&lt;p&gt;After authenticity checks, apply your own domain validation as well. Transport validity and business validity are different questions.&lt;/p&gt;

&lt;p&gt;A syntactically valid submission can still contain a product ID your application does not recognize or a field value that violates an internal invariant.&lt;/p&gt;

&lt;h2&gt;
  
  
  Version your internal contract
&lt;/h2&gt;

&lt;p&gt;External form fields tend to evolve independently from backend models.&lt;/p&gt;

&lt;p&gt;Instead of letting a form payload flow unchanged through every service, normalize it at the ingestion boundary:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;external submission
       ↓
webhook adapter
       ↓
internal FormSubmissionReceived v1
       ↓
business consumers
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That adapter is the right place to rename fields, convert strings to internal types, attach application metadata, and translate a particular form into your domain vocabulary.&lt;/p&gt;

&lt;p&gt;It also prevents a marketing-site field rename from silently becoming a breaking schema change across several backend consumers.&lt;/p&gt;

&lt;h2&gt;
  
  
  Failure handling matters more than the happy path
&lt;/h2&gt;

&lt;p&gt;For a serious pipeline, decide what each type of failure means before shipping it.&lt;/p&gt;

&lt;p&gt;Transient downstream failures should normally be retryable. Invalid domain data may belong in a dead-letter path. Permanent CRM rejection should be observable without forcing endless retries. Database and queue operations should have clear durability semantics.&lt;/p&gt;

&lt;p&gt;Monitoring should answer at least three questions: Are submissions arriving? Are they being processed? Are downstream side effects succeeding?&lt;/p&gt;

&lt;p&gt;Those are separate health signals. A webhook endpoint returning successful responses says little about whether a queue worker has been failing for six hours.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where this pattern fits
&lt;/h2&gt;

&lt;p&gt;Webhook-first processing is a particularly clean fit for teams that already operate queues, workers, event-driven services, or centralized integration infrastructure. It also helps when multiple frontend stacks need the same ingestion mechanism; the service provides integrations/packages for Astro, Next.js, React, and Vue.&lt;/p&gt;

&lt;p&gt;For a tiny site where the only requirement is persisting a row in the same application database, adding another architectural boundary may not buy much. Directly handling the POST yourself can remain the simpler design.&lt;/p&gt;

&lt;p&gt;The value appears when public form ingestion and internal business processing are genuinely different concerns.&lt;/p&gt;

&lt;h2&gt;
  
  
  The useful abstraction
&lt;/h2&gt;

&lt;p&gt;The main architectural shift is to stop thinking about a form as a frontend feature that needs a bespoke backend route.&lt;/p&gt;

&lt;p&gt;Think of it as an event source:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;FormSubmissionReceived
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;onsubmit.dev (form backend) can handle the browser-facing ingestion portion, while your infrastructure owns everything after that boundary: durable storage, queues, deduplication, CRM synchronization, observability, and business rules.&lt;/p&gt;

&lt;p&gt;That gives backend teams a familiar integration model without requiring every static site or frontend application to become another custom form-processing service.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>frontend</category>
      <category>staticwebapps</category>
    </item>
    <item>
      <title>Turn Any HTML Form Into a Notion Database — Step by Step</title>
      <dc:creator>Yevhen Kozachenko 🇺🇦🇩🇪</dc:creator>
      <pubDate>Fri, 28 Aug 2026 15:42:00 +0000</pubDate>
      <link>https://dev.to/ekwoster/turn-any-html-form-into-a-notion-database-step-by-step-3bf0</link>
      <guid>https://dev.to/ekwoster/turn-any-html-form-into-a-notion-database-step-by-step-3bf0</guid>
      <description>&lt;h1&gt;
  
  
  Turn Any HTML Form Into a Notion Database — Step by Step with onsubmit.dev (form backend)
&lt;/h1&gt;

&lt;p&gt;If you want a waitlist, feedback form, or lead-capture form to create new rows in Notion without building an API, onsubmit.dev (form backend) can handle the server-side submission for you. Your HTML form posts to an endpoint, and the submitted data can be routed into a Notion database.&lt;/p&gt;

&lt;p&gt;This is particularly handy for small sites and static deployments where adding a backend just to process a form feels unnecessary.&lt;/p&gt;

&lt;h2&gt;
  
  
  What we're building
&lt;/h2&gt;

&lt;p&gt;The flow is simple:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;HTML form → onsubmit.dev (form backend) → Notion database&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;For example, imagine a product waitlist with fields for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Name&lt;/li&gt;
&lt;li&gt;Email&lt;/li&gt;
&lt;li&gt;Company&lt;/li&gt;
&lt;li&gt;Message&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every successful submission becomes a new row in a Notion database, giving you a lightweight lead list that your team can already view, filter, and organize.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Create the Notion database
&lt;/h2&gt;

&lt;p&gt;Start by creating a database in Notion for the submissions.&lt;/p&gt;

&lt;p&gt;Add properties matching the information you want to collect. For our example, that might look like:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Property&lt;/th&gt;
&lt;th&gt;Notion type&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Name&lt;/td&gt;
&lt;td&gt;Title&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Email&lt;/td&gt;
&lt;td&gt;Email&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Company&lt;/td&gt;
&lt;td&gt;Text&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Message&lt;/td&gt;
&lt;td&gt;Text&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The important part is to keep the form fields and your intended Notion properties aligned, so you know exactly where each submitted value should go.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Set up the form endpoint
&lt;/h2&gt;

&lt;p&gt;Create your form using &lt;a href="https://onsubmit.dev" rel="noopener noreferrer"&gt;onsubmit.dev (form backend)&lt;/a&gt;, then configure its Notion integration for the database where submissions should be stored.&lt;/p&gt;

&lt;p&gt;When connecting Notion, make sure the relevant Notion page/database has been shared with the integration. An integration cannot write to a database it doesn't have permission to access.&lt;/p&gt;

&lt;p&gt;Once configured, you get a submission endpoint for the form.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Connect your HTML form
&lt;/h2&gt;

&lt;p&gt;Set the form's action to the endpoint generated for your form and use &lt;code&gt;POST&lt;/code&gt; as the HTTP method.&lt;/p&gt;

&lt;p&gt;For example, your page can collect the four fields described above and send them to that endpoint. Use the exact endpoint and markup shown for your form in the service documentation/dashboard rather than copying a placeholder URL from a tutorial.&lt;/p&gt;

&lt;p&gt;The key idea is that the browser submits directly to onsubmit.dev (form backend). You don't need to create an Express route, serverless function, database connection, or custom Notion API handler just to receive the form.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Map the fields to Notion
&lt;/h2&gt;

&lt;p&gt;Configure the integration so each submitted form value is written to its corresponding Notion property.&lt;/p&gt;

&lt;p&gt;For our waitlist, the mapping is conceptually:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;name → Name&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;email → Email&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;company → Company&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;message → Message&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Pay attention to Notion property types here. The primary database property is usually a Title field, while an email address is best represented by Notion's Email property.&lt;/p&gt;

&lt;p&gt;After saving the integration, submit a test response through the actual form.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Check the resulting Notion table
&lt;/h2&gt;

&lt;p&gt;Open the database in Notion after submitting the form. A successful submission should appear as a newly created database row.&lt;/p&gt;

&lt;p&gt;Screenshot description: A Notion database displayed in table view with columns named \"Name,\" \"Email,\" \"Company,\" and \"Message.\" Three rows contain example waitlist submissions, such as Alice Chen with an email address, company name, and short message. Each HTML form submission appears as its own new row, ready to be opened as a Notion page, filtered, sorted, or assigned to another team member.&lt;/p&gt;

&lt;p&gt;At this point, Notion effectively becomes the destination for your form data.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where this pattern is useful
&lt;/h2&gt;

&lt;p&gt;A Notion-backed form works especially well when the submitted data is operational rather than application state. Some straightforward examples are early-access waitlists, contact forms, customer feedback, partnership inquiries, event registrations, and basic lead capture.&lt;/p&gt;

&lt;p&gt;It also means non-developers can work with incoming submissions using an interface they may already know instead of needing access to an application database.&lt;/p&gt;

&lt;p&gt;For more complex applications, you'll probably still want a conventional database and backend. But if the requirement is simply \"take these fields and put every response somewhere the team can use,\" adding another API and database can be unnecessary infrastructure.&lt;/p&gt;

&lt;h2&gt;
  
  
  That's it
&lt;/h2&gt;

&lt;p&gt;The final architecture stays pleasantly small:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;visitor → HTML form → form endpoint → Notion&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Your frontend remains a normal HTML form, onsubmit.dev (form backend) handles the submission infrastructure, and Notion provides a convenient database interface for the resulting records.&lt;/p&gt;

&lt;p&gt;That makes the same setup easy to reuse the next time a project needs a waitlist, feedback box, or lead form without spinning up a backend solely to process submissions.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>frontend</category>
      <category>staticwebapps</category>
    </item>
    <item>
      <title>Svelte/SvelteKit Forms: The Fastest Path From `&lt;form&gt;` to Inbox</title>
      <dc:creator>Yevhen Kozachenko 🇺🇦🇩🇪</dc:creator>
      <pubDate>Thu, 27 Aug 2026 15:38:00 +0000</pubDate>
      <link>https://dev.to/ekwoster/sveltesveltekit-forms-the-fastest-path-from-to-inbox-1p6n</link>
      <guid>https://dev.to/ekwoster/sveltesveltekit-forms-the-fastest-path-from-to-inbox-1p6n</guid>
      <description>&lt;h1&gt;
  
  
  Svelte/SvelteKit Forms: The Fastest Path From &lt;code&gt;&amp;lt;form&amp;gt;&lt;/code&gt; to Inbox with onsubmit.dev (form backend)
&lt;/h1&gt;

&lt;p&gt;SvelteKit makes forms pleasant to build, but a contact form still needs somewhere to send its data. If all you want is “visitor fills out &lt;code&gt;&amp;lt;form&amp;gt;&lt;/code&gt; → message arrives in my inbox,” building and operating another server-side handler can feel disproportionate. &lt;a href="https://onsubmit.dev" rel="noopener noreferrer"&gt;onsubmit.dev&lt;/a&gt; (form backend) provides a hosted form endpoint for that job, and its Svelte integration can keep the application code small.&lt;/p&gt;

&lt;p&gt;One naming detail is worth clearing up immediately: onsubmit.dev (form backend) is a service, while Svelte has its own &lt;code&gt;on:submit&lt;/code&gt; event directive. They are unrelated. In this article, references to the product always mean onsubmit.dev (form backend), not Svelte's &lt;code&gt;on:submit&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The usual SvelteKit approach
&lt;/h2&gt;

&lt;p&gt;SvelteKit already has a solid answer for server-side form handling: form actions.&lt;/p&gt;

&lt;p&gt;A typical contact form can POST to a &lt;code&gt;+page.server.ts&lt;/code&gt; action, where you validate the fields and then do something useful with them.&lt;/p&gt;

&lt;p&gt;Conceptually, that gives you:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Svelte &amp;lt;form&amp;gt;
    ↓
SvelteKit form action
    ↓
validation
    ↓
email provider / database / notification service
    ↓
your inbox
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is a good architecture when submitting the form kicks off application-specific business logic.&lt;/p&gt;

&lt;p&gt;For a simple portfolio, landing page, documentation site, or “contact us” form, however, you also inherit the less interesting parts of owning that pipeline: delivery integration, configuration, error handling, spam controls, and maintenance.&lt;/p&gt;

&lt;p&gt;That's where using a dedicated form backend can make sense.&lt;/p&gt;

&lt;h2&gt;
  
  
  Using &lt;code&gt;svelte-onsubmit&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;The Svelte integration is &lt;code&gt;svelte-onsubmit&lt;/code&gt;. Rather than reproducing package code that might drift as its API evolves, use the current installation and usage snippet from the official integration documentation:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://onsubmit.dev/integrations" rel="noopener noreferrer"&gt;https://onsubmit.dev/integrations&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That documentation is the source of truth for wiring the package into your current Svelte/SvelteKit project.&lt;/p&gt;

&lt;p&gt;The resulting architecture is deliberately simpler:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Svelte &amp;lt;form&amp;gt;
    ↓
hosted form endpoint
    ↓
your inbox
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You retain the form UI in Svelte while avoiding a custom application endpoint whose only responsibility is forwarding contact-form submissions.&lt;/p&gt;

&lt;h2&gt;
  
  
  What about a SvelteKit form action?
&lt;/h2&gt;

&lt;p&gt;There is an important architectural distinction here.&lt;/p&gt;

&lt;p&gt;SvelteKit actions run on the server and are useful when the server needs to participate in the operation. For example, you might have a form like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight svelte"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;form&lt;/span&gt; &lt;span class="na"&gt;method=&lt;/span&gt;&lt;span class="s"&gt;"POST"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="c"&gt;&amp;lt;!-- fields --&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"submit"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Send&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/form&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and then create a corresponding &lt;code&gt;+page.server.ts&lt;/code&gt; action.&lt;/p&gt;

&lt;p&gt;That approach is preferable when your submission needs to do things such as authenticate the current user, query your own database, enforce application-specific authorization, create several related records, or participate in a larger server-side workflow.&lt;/p&gt;

&lt;p&gt;For a plain contact form, the action can instead become glue code: receive &lt;code&gt;FormData&lt;/code&gt;, validate it, call another service, translate failures, and return a SvelteKit response.&lt;/p&gt;

&lt;p&gt;If you don't otherwise need that glue, &lt;code&gt;svelte-onsubmit&lt;/code&gt; plus onsubmit.dev (form backend) lets you remove it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Don't confuse the service with &lt;code&gt;on:submit&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;This naming collision is particularly easy to hit in Svelte tutorials.&lt;/p&gt;

&lt;p&gt;Svelte's &lt;code&gt;on:submit&lt;/code&gt; syntax is an event directive used to handle the browser's submit event in a component. It is part of Svelte's event-handling model.&lt;/p&gt;

&lt;p&gt;onsubmit.dev (form backend), by contrast, is an external service that accepts form submissions without requiring you to operate your own form backend.&lt;/p&gt;

&lt;p&gt;So these concepts sit at different layers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Svelte's &lt;code&gt;on:submit&lt;/code&gt;: client-side event handling.&lt;/li&gt;
&lt;li&gt;SvelteKit form actions: server-side application handling.&lt;/li&gt;
&lt;li&gt;onsubmit.dev (form backend): a hosted destination for form submissions.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Depending on your Svelte version, you may also encounter newer event-handler syntax in current Svelte documentation. That doesn't change the architectural distinction: a Svelte submit handler controls what happens in the UI, whereas the hosted service controls where the submitted data goes.&lt;/p&gt;

&lt;h2&gt;
  
  
  When I would keep the SvelteKit action
&lt;/h2&gt;

&lt;p&gt;A hosted form backend shouldn't automatically replace every server action.&lt;/p&gt;

&lt;p&gt;Keep the action when submitting the form is genuinely part of your application's backend. Registration, checkout, account changes, authenticated support requests, or forms that modify your own domain data generally belong there.&lt;/p&gt;

&lt;p&gt;A hosted endpoint is most attractive when the requirement is narrower: collect a few fields and deliver the result without creating backend infrastructure purely for the form.&lt;/p&gt;

&lt;p&gt;That can be especially useful for SvelteKit projects deployed as mostly static sites, where introducing server-side runtime requirements for one contact page would otherwise complicate deployment.&lt;/p&gt;

&lt;h2&gt;
  
  
  Progressive enhancement still matters
&lt;/h2&gt;

&lt;p&gt;One of SvelteKit's nicest form features is progressive enhancement. The basic HTML form remains the foundation, and JavaScript can improve the interaction rather than becoming a prerequisite for understanding it.&lt;/p&gt;

&lt;p&gt;The same principle is worth preserving with any external form integration. Think through:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What the user sees while a submission is in progress.&lt;/li&gt;
&lt;li&gt;How validation errors are presented.&lt;/li&gt;
&lt;li&gt;What happens when the network request fails.&lt;/li&gt;
&lt;li&gt;Whether repeated submissions are prevented.&lt;/li&gt;
&lt;li&gt;What success state replaces or resets the form.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those UX details matter regardless of whether the eventual receiver is your own &lt;code&gt;+page.server.ts&lt;/code&gt; action or a hosted endpoint.&lt;/p&gt;

&lt;h2&gt;
  
  
  Choosing between the two
&lt;/h2&gt;

&lt;p&gt;For application forms with application logic, SvelteKit actions are a natural fit. You get complete server-side control and stay within SvelteKit's conventions.&lt;/p&gt;

&lt;p&gt;For a form whose backend would amount to “accept these fields and send them to me,” a managed form backend removes code that often isn't central to the project.&lt;/p&gt;

&lt;p&gt;That's the useful dividing line: don't outsource backend logic your application actually needs, but don't build backend infrastructure solely because a &lt;code&gt;&amp;lt;form&amp;gt;&lt;/code&gt; needs an inbox.&lt;/p&gt;

&lt;p&gt;For a small Svelte/SvelteKit contact form, &lt;code&gt;svelte-onsubmit&lt;/code&gt; and onsubmit.dev (form backend) offer a short path from markup to a working submission flow—while Svelte's &lt;code&gt;on:submit&lt;/code&gt; remains, importantly, an entirely separate thing.&lt;/p&gt;

</description>
      <category>svelte</category>
      <category>webdev</category>
      <category>staticwebapps</category>
      <category>frontend</category>
    </item>
    <item>
      <title>Building a 100% Serverless Disposable Email Platform with Cloudflare D1 &amp; Next.js 15</title>
      <dc:creator>SK RAYHAN </dc:creator>
      <pubDate>Thu, 27 Aug 2026 05:51:48 +0000</pubDate>
      <link>https://dev.to/skrayhanyt_developer/building-a-100-serverless-disposable-email-platform-with-cloudflare-d1-nextjs-15-cj0</link>
      <guid>https://dev.to/skrayhanyt_developer/building-a-100-serverless-disposable-email-platform-with-cloudflare-d1-nextjs-15-cj0</guid>
      <description>&lt;p&gt;Hey DEV Community! 👋&lt;/p&gt;

&lt;p&gt;As developers, we've all been there: you're testing a signup flow, but you don't want to clutter your personal inbox, and existing disposable email services are either &lt;strong&gt;too slow&lt;/strong&gt;, &lt;strong&gt;full of annoying ads&lt;/strong&gt;, or &lt;strong&gt;charge a premium&lt;/strong&gt; for basic API access.&lt;/p&gt;

&lt;p&gt;I decided to solve this by building &lt;strong&gt;&lt;a href="https://trytempmail.co" rel="noopener noreferrer"&gt;TTMAIL (trytempmail.co)&lt;/a&gt;&lt;/strong&gt; — a modern, privacy-focused, and incredibly fast temporary email platform built entirely on the edge.&lt;/p&gt;

&lt;h2&gt;
  
  
  🛠 The Problem I Wanted to Solve
&lt;/h2&gt;

&lt;p&gt;Most "Temp Mail" services use outdated PHP/MySQL stacks or heavy polling, leading to:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;High Latency:&lt;/strong&gt; Waiting 30s+ for a verification email.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Privacy Concerns:&lt;/strong&gt; Logged data and trackers.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;No Developer DX:&lt;/strong&gt; Hard to use in Playwright or Cypress tests without paying.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  ⚡ The Tech Stack (Serverless Excellence)
&lt;/h2&gt;

&lt;p&gt;I wanted &lt;strong&gt;zero maintenance&lt;/strong&gt; and &lt;strong&gt;zero server bills&lt;/strong&gt;. Here is how I achieved it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Framework:&lt;/strong&gt; &lt;a href="https://nextjs.org/" rel="noopener noreferrer"&gt;Next.js 15 (App Router)&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Runtime:&lt;/strong&gt; &lt;a href="https://pages.cloudflare.com/" rel="noopener noreferrer"&gt;Cloudflare Pages Functions&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Database:&lt;/strong&gt; &lt;a href="https://developers.cloudflare.com/d1/" rel="noopener noreferrer"&gt;Cloudflare D1&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Email Ingestion:&lt;/strong&gt; &lt;a href="https://developers.cloudflare.com/email-routing/" rel="noopener noreferrer"&gt;Cloudflare Email Routing&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Design:&lt;/strong&gt; &lt;strong&gt;Neo-Brutalist UI&lt;/strong&gt; using Tailwind CSS.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🏗 Architecture Diagram
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
mermaid
graph LR
    Sender[Email Sender] --&amp;gt; CF_MX[Cloudflare MX]
    CF_MX --&amp;gt; Worker[Email Worker]
    Worker --&amp;gt; D1[(Cloudflare D1 Edge SQLite)]
    Client[Browser/CI Tool] --&amp;gt; API[Next.js API]
    API --&amp;gt; D1
🌟 Key Features for Power Users
1. ⚡ Sub-Second Speed
Because the database (D1) and the logic (Workers) live at the edge, emails are parsed and stored almost instantly.
2. 🛡️ Privacy by Design (Zero Tracking)
Pixel Stripper: Our edge worker automatically neutralizes 1x1 tracking pixels.
Auto-Purge: Emails are automatically deleted every 90 days.
3. 🤖 First-Class API for E2E Testing
Fetch emails programmatically in your CI/CD pipeline:
code
JavaScript
const response = await fetch('https://trytempmail.co/api/emails?address=qa-bot@trytempmail.co');
const { emails } = await response.json();
console.log(emails[0].subject);
4. 🔑 Cross-Device Sync
Use a custom passphrase for any alias to restore your inbox on any device.
🚀 Check it out!
Live Project: https://trytempmail.co
API Docs: https://trytempmail.co/api-docs
💬 I'd Love Your Feedback!
UI/UX: What do you think of the Neo-Brutalist aesthetic?
Features: Would you find Webhook support useful?
Performance: How is the delivery speed in your region?
Drop a comment below! 👇
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>webdev</category>
      <category>staticwebapps</category>
      <category>cloudflarechallenge</category>
      <category>nextjs</category>
    </item>
    <item>
      <title>Vue 3 Contact Forms Without Writing a Single Line of Backend Code</title>
      <dc:creator>Yevhen Kozachenko 🇺🇦🇩🇪</dc:creator>
      <pubDate>Wed, 26 Aug 2026 15:35:00 +0000</pubDate>
      <link>https://dev.to/ekwoster/vue-3-contact-forms-without-writing-a-single-line-of-backend-code-23b0</link>
      <guid>https://dev.to/ekwoster/vue-3-contact-forms-without-writing-a-single-line-of-backend-code-23b0</guid>
      <description>&lt;h1&gt;
  
  
  Vue 3 Contact Forms Without Writing a Single Line of Backend Code
&lt;/h1&gt;

&lt;p&gt;Building a contact form in Vue is easy until you get to the part where the submission has to go somewhere. Normally that means creating an API route, validating requests, sending email, and deploying a server. With &lt;a href="https://onsubmit.dev" rel="noopener noreferrer"&gt;onsubmit.dev (form backend)&lt;/a&gt;, you can instead connect a Vue 3 form to a hosted endpoint and route submissions to destinations such as email or Notion.&lt;/p&gt;

&lt;p&gt;In this tutorial, we'll build a contact form with Vue 3's Composition API and the &lt;code&gt;vue-onsubmit&lt;/code&gt; integration.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why can we skip the backend?
&lt;/h2&gt;

&lt;p&gt;A browser shouldn't send email directly or contain private credentials for third-party APIs such as Notion.&lt;/p&gt;

&lt;p&gt;A traditional setup therefore looks roughly like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Vue form
   ↓
Your API/server
   ↓
Email / Notion
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your server receives and processes the form submission.&lt;/p&gt;

&lt;p&gt;Using onsubmit.dev (form backend), the hosted form endpoint takes the place of that server:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Vue form
   ↓
Hosted form endpoint
   ↓
Email / Notion
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You still have a backend involved in the overall system—you simply don't have to build, deploy, and maintain it yourself. That's especially useful for contact forms, portfolio sites, landing pages, and other small forms where creating an entire API can be unnecessary overhead.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Create your form endpoint
&lt;/h2&gt;

&lt;p&gt;Create a form in the service dashboard and configure where submissions should be delivered.&lt;/p&gt;

&lt;p&gt;For example, you can route new contact requests to your email inbox or connect a Notion destination.&lt;/p&gt;

&lt;p&gt;You'll receive the configuration needed to connect your Vue application to the form backend.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Add the Vue integration
&lt;/h2&gt;

&lt;p&gt;For Vue 3, use the &lt;code&gt;vue-onsubmit&lt;/code&gt; package provided by the service.&lt;/p&gt;

&lt;p&gt;Install the package in your project according to the current integration documentation. Using the official package means you don't need to write your own &lt;code&gt;fetch()&lt;/code&gt; request or manually manage the submission lifecycle.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Build the contact form
&lt;/h2&gt;

&lt;p&gt;Here's the shape of a Composition API component:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight vue"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;script&lt;/span&gt; &lt;span class="na"&gt;setup&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;ref&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;vue&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;email&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;message&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;submitContactForm&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Submit with vue-onsubmit using the endpoint/configuration&lt;/span&gt;
  &lt;span class="c1"&gt;// generated for your form.&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;script&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;form&lt;/span&gt; &lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="na"&gt;submit.prevent=&lt;/span&gt;&lt;span class="s"&gt;"submitContactForm"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;label&amp;gt;&lt;/span&gt;
      Name
      &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;v-model=&lt;/span&gt;&lt;span class="s"&gt;"name"&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"name"&lt;/span&gt; &lt;span class="na"&gt;required&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;label&amp;gt;&lt;/span&gt;
      Email
      &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt;
        &lt;span class="na"&gt;v-model=&lt;/span&gt;&lt;span class="s"&gt;"email"&lt;/span&gt;
        &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"email"&lt;/span&gt;
        &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"email"&lt;/span&gt;
        &lt;span class="na"&gt;required&lt;/span&gt;
      &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;label&amp;gt;&lt;/span&gt;
      Message
      &lt;span class="nt"&gt;&amp;lt;textarea&lt;/span&gt;
        &lt;span class="na"&gt;v-model=&lt;/span&gt;&lt;span class="s"&gt;"message"&lt;/span&gt;
        &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"message"&lt;/span&gt;
        &lt;span class="na"&gt;required&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;gt;&amp;lt;/textarea&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"submit"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      Send message
    &lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/form&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;One important note about that example: the submission function is intentionally left as a placeholder rather than inventing a &lt;code&gt;vue-onsubmit&lt;/code&gt; API. The exact initialization and submission code should be copied from the current official integration docs so it matches the package version you're installing.&lt;/p&gt;

&lt;p&gt;Once you've inserted that documented &lt;code&gt;vue-onsubmit&lt;/code&gt; call, the three refs—&lt;code&gt;name&lt;/code&gt;, &lt;code&gt;email&lt;/code&gt;, and &lt;code&gt;message&lt;/code&gt;—can be sent as your form payload.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Understand what Vue is doing
&lt;/h2&gt;

&lt;p&gt;The Composition API part is deliberately small.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;ref()&lt;/code&gt; creates reactive values for each field, while &lt;code&gt;v-model&lt;/code&gt; keeps those values synchronized with the corresponding inputs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;email&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;v-model=&lt;/span&gt;&lt;span class="s"&gt;"email"&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"email"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The form uses Vue's &lt;code&gt;@submit.prevent&lt;/code&gt; modifier. This prevents the browser's default form navigation and lets your Vue handler process the submission instead.&lt;/p&gt;

&lt;p&gt;That detail is separate from onsubmit.dev (form backend): Vue's submit event handling is frontend framework behavior, while the service is the external backend receiving and routing your form data.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Handle success and failure states
&lt;/h2&gt;

&lt;p&gt;For a production form, it's worth adding a few UI states around the integration:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Disable the button while the request is being submitted.&lt;/li&gt;
&lt;li&gt;Show a confirmation such as "Thanks! Your message was sent."&lt;/li&gt;
&lt;li&gt;Display a useful error if submission fails.&lt;/li&gt;
&lt;li&gt;Clear the fields after a successful submission.&lt;/li&gt;
&lt;li&gt;Keep client-side validation for immediate feedback.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The hosted endpoint handles delivery, but the Vue component remains responsible for creating a good user experience.&lt;/p&gt;

&lt;h2&gt;
  
  
  Email or Notion?
&lt;/h2&gt;

&lt;p&gt;Where the data goes depends on how you configure the form rather than how you build the Vue inputs.&lt;/p&gt;

&lt;p&gt;For a personal portfolio, sending messages to email may be enough. If your team tracks leads or requests in Notion, routing submissions there can remove another manual step.&lt;/p&gt;

&lt;p&gt;That separation is useful: your Vue component collects the data, while the external form backend deals with routing it.&lt;/p&gt;

&lt;h2&gt;
  
  
  When does this approach make sense?
&lt;/h2&gt;

&lt;p&gt;Using a managed form backend is a good fit when forms aren't the core of your application's business logic.&lt;/p&gt;

&lt;p&gt;A contact page shouldn't necessarily require you to create a Node server, configure an email provider, store secrets, deploy an API, and monitor all of that infrastructure.&lt;/p&gt;

&lt;p&gt;For applications requiring complex authorization, transactional workflows, extensive server-side business rules, or tight integration with an existing database, your own backend may still be the better choice.&lt;/p&gt;

&lt;p&gt;For a straightforward Vue contact form, though, the architecture can stay refreshingly small:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Vue 3 + Composition API
          ↓
     vue-onsubmit
          ↓
 Hosted form backend
          ↓
    Email / Notion
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The frontend remains a normal Vue application, while form delivery becomes managed infrastructure rather than another backend project you have to maintain.&lt;/p&gt;

</description>
      <category>vue</category>
      <category>webdev</category>
      <category>frontend</category>
      <category>staticwebapps</category>
    </item>
    <item>
      <title>Serverless Infrastructure</title>
      <dc:creator>Nuwair Systems</dc:creator>
      <pubDate>Tue, 25 Aug 2026 11:59:33 +0000</pubDate>
      <link>https://dev.to/nuwairsystems/serverless-infrastructure-3lkg</link>
      <guid>https://dev.to/nuwairsystems/serverless-infrastructure-3lkg</guid>
      <description>&lt;p&gt;Scale to Millions of Requests — Pay Only for What You Use.&lt;/p&gt;

&lt;p&gt;Nuwair Systems designs and deploys event-driven serverless architectures on AWS Lambda, API Gateway, DynamoDB, and EventBridge. Infinite elasticity with zero server management — and a cost model that charges only for actual compute consumed.&lt;/p&gt;

&lt;p&gt;What We Deliver&lt;br&gt;
The four delivery pillars behind every Serverless Infrastructure engagement.&lt;/p&gt;

&lt;p&gt;Serverless Architecture Design&lt;br&gt;
Event-driven diagrams and function boundary decisions before a single line is written.&lt;/p&gt;

&lt;p&gt;Lambda &amp;amp; API Gateway&lt;br&gt;
Versioned functions with IAM least-privilege, WAF integration, and custom domain routing.&lt;/p&gt;

&lt;p&gt;DynamoDB &amp;amp; Aurora Serverless&lt;br&gt;
Single-table DynamoDB or Aurora Serverless v2 with automated backups and point-in-time recovery.&lt;/p&gt;

&lt;p&gt;IaC with CDK / Terraform&lt;br&gt;
Entire stack defined as code — reproducible across all environments with a single command.&lt;/p&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
        &lt;div class="c-embed__cover"&gt;
          &lt;a href="https://nuwair.com/serverless-infrastructure" class="c-link align-middle" rel="noopener noreferrer"&gt;
            &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fnuwair.com%2Fimages%2Flogo.png" height="114" class="m-0" width="553"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://nuwair.com/serverless-infrastructure" rel="noopener noreferrer" class="c-link"&gt;
            Serverless Infrastructure | Nuwair Systems
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            Serverless infrastructure on AWS by Nuwair Systems. Lambda, API Gateway, DynamoDB architectures that auto-scale and charge only for actual usage.
          &lt;/p&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
            &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fnuwair.com%2Ffavicon.png" width="553" height="114"&gt;
          nuwair.com
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


</description>
      <category>serverless</category>
      <category>staticwebapps</category>
      <category>infrastructure</category>
      <category>puppet</category>
    </item>
  </channel>
</rss>
