<?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: Menelaos Vergis</title>
    <description>The latest articles on DEV Community by Menelaos Vergis (@menelaos_vergis_045957e7a).</description>
    <link>https://dev.to/menelaos_vergis_045957e7a</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1537632%2F7234e3ab-c637-4fae-ab18-d23e845ca571.png</url>
      <title>DEV Community: Menelaos Vergis</title>
      <link>https://dev.to/menelaos_vergis_045957e7a</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/menelaos_vergis_045957e7a"/>
    <language>en</language>
    <item>
      <title>A fast website with a blog, search and a contact form, hosted free</title>
      <dc:creator>Menelaos Vergis</dc:creator>
      <pubDate>Sun, 18 Oct 2026 08:17:59 +0000</pubDate>
      <link>https://dev.to/menelaos_vergis_045957e7a/a-fast-website-with-a-blog-search-and-a-contact-form-hosted-free-30g0</link>
      <guid>https://dev.to/menelaos_vergis_045957e7a/a-fast-website-with-a-blog-search-and-a-contact-form-hosted-free-30g0</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published on the &lt;a href="https://bootform.com/blog/free-website-blog-search-contact-form" rel="noopener noreferrer"&gt;BootForm blog&lt;/a&gt;. I work on BootForm, the form backend used in step 4; the templates are free and MIT licensed.&lt;/em&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;In short:&lt;/strong&gt; copy the free &lt;code&gt;vitepress-blog&lt;/code&gt; template on GitHub, edit it in the browser, and GitHub Pages publishes it at no cost. You get a blog with tags, search and an RSS feed, plus a contact form whose messages BootForm emails to you on its free plan. It takes about fifteen minutes and nothing to install.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You can have a website with a blog, tags, full-text search, an RSS feed and a contact form that actually sends you the messages, without paying for hosting and without installing anything. This post walks through it start to finish, in the browser.&lt;/p&gt;

&lt;h2&gt;
  
  
  What you end up with
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;A blog with a post list, tag pages and an RSS feed, all generated from a folder of text files.&lt;/li&gt;
&lt;li&gt;Search across every post, running in the visitor's browser.&lt;/li&gt;
&lt;li&gt;A contact page whose messages land in your inbox and in a dashboard.&lt;/li&gt;
&lt;li&gt;A live address like &lt;code&gt;https://yourname.github.io/vitepress-blog/&lt;/code&gt;, served by GitHub Pages.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4zklv7i83m8dgv41yt8u.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4zklv7i83m8dgv41yt8u.webp" alt="The finished blog's home page: a photo hero with the blog's name, " width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Search is built in. Press &lt;code&gt;/&lt;/code&gt; or &lt;code&gt;Ctrl K&lt;/code&gt; on any page and start typing:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Feqtjvmy6ypmgv59hza21.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Feqtjvmy6ypmgv59hza21.webp" alt="The search box open over the post list, with the word " width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here is &lt;a href="https://bootform.github.io/vitepress-blog/" rel="noopener noreferrer"&gt;the finished example&lt;/a&gt;, if you want to click around before you start.&lt;/p&gt;

&lt;h2&gt;
  
  
  Is a static site enough for a blog?
&lt;/h2&gt;

&lt;p&gt;For most blogs, yes. A static site is a folder of pre-built HTML files with no server or database behind it, so there is nothing to patch, nothing to break into, and every page loads as fast as a plain HTML file. That is also why it can be hosted for free.&lt;/p&gt;

&lt;p&gt;The one thing a static site cannot do by itself is receive a form, because there is no server to send it to. A form backend fills that gap: the form posts to the backend's address, and the backend emails each message on to you. That is the part BootForm does here, on its free plan.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;When a static site is the wrong choice:&lt;/strong&gt; if you sell products, need customer logins, or the person updating the site will never touch a text file, use a shop platform or a CMS instead. A static blog suits people who are happy to write a post as a file.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two templates, pick one
&lt;/h2&gt;

&lt;p&gt;Both are free, open source (MIT), and ship with a working contact form.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;a href="https://github.com/BootForm/first-website" rel="noopener noreferrer"&gt;first-website&lt;/a&gt;&lt;/th&gt;
&lt;th&gt;&lt;a href="https://github.com/BootForm/vitepress-blog" rel="noopener noreferrer"&gt;vitepress-blog&lt;/a&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;What it is&lt;/td&gt;
&lt;td&gt;One page, plain HTML&lt;/td&gt;
&lt;td&gt;A full blog built with VitePress&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Blog, tags, RSS, search&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Setup&lt;/td&gt;
&lt;td&gt;Browser only, about 15 minutes&lt;/td&gt;
&lt;td&gt;Browser only (or locally with Node.js)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Good for&lt;/td&gt;
&lt;td&gt;Your first page on the internet&lt;/td&gt;
&lt;td&gt;A site you will keep adding posts to&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The rest of this post builds &lt;code&gt;vitepress-blog&lt;/code&gt;. If one page is all you need, &lt;code&gt;first-website&lt;/code&gt;'s README walks you through the same steps for a single page.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Make your own copy
&lt;/h2&gt;

&lt;p&gt;Open &lt;a href="https://github.com/BootForm/vitepress-blog" rel="noopener noreferrer"&gt;github.com/BootForm/vitepress-blog&lt;/a&gt;, click &lt;strong&gt;Use this template&lt;/strong&gt;, then &lt;strong&gt;Create a new repository&lt;/strong&gt;. Keep the name &lt;code&gt;vitepress-blog&lt;/code&gt; and make it public.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5qeoi75962kryfbt73ho.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5qeoi75962kryfbt73ho.webp" alt="The vitepress-blog repository on GitHub with the " width="800" height="325"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Keeping the name saves you a step. If you rename it, the README's Step 1 lists the two lines to change to match.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: Turn on GitHub Pages
&lt;/h2&gt;

&lt;p&gt;In your new repository, go to &lt;strong&gt;Settings&lt;/strong&gt;, then &lt;strong&gt;Pages&lt;/strong&gt;, and set &lt;strong&gt;Source&lt;/strong&gt; to &lt;strong&gt;GitHub Actions&lt;/strong&gt;. From now on, every change you save builds the site and publishes it by itself. The template already includes the workflow that does this.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0xi64lv2szze1rm0s7l5.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0xi64lv2szze1rm0s7l5.webp" alt="GitHub's Pages settings with Source set to " width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: Make it yours, in the browser
&lt;/h2&gt;

&lt;p&gt;On your repository's main page, press the full-stop key (&lt;code&gt;.&lt;/code&gt;). GitHub opens &lt;code&gt;github.dev&lt;/code&gt;, a full code editor in the browser.&lt;/p&gt;

&lt;p&gt;Look for &lt;code&gt;CHANGE ME&lt;/code&gt;. The places that matter:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;docs/.vitepress/config.mts&lt;/code&gt;: the blog's title and description.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;docs/index.md&lt;/code&gt;: the home page text.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;docs/.vitepress/theme/style.css&lt;/code&gt;: your brand colour.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;docs/.vitepress/authors.ts&lt;/code&gt;: your name, instead of the example authors.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;scripts/generate-rss.mjs&lt;/code&gt;: &lt;code&gt;SITE_URL&lt;/code&gt;. Put your own GitHub username in place of &lt;code&gt;yourname&lt;/code&gt;, otherwise the feed's links point at someone else's address.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every post is a Markdown file in &lt;code&gt;docs/posts/&lt;/code&gt;. The top of each one says its title, date, author and tags:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;layout&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;page&lt;/span&gt;
&lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Your post title&lt;/span&gt;
&lt;span class="na"&gt;date&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;2026-10-15&lt;/span&gt;
&lt;span class="na"&gt;author&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;priya&lt;/span&gt;
&lt;span class="na"&gt;tags&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;some-tag&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;another-tag&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To write a new post, copy one of the example files and change it. The post list, the tag pages, the RSS feed and the search index all rebuild from whatever is in that folder, so there is no other file to update.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fycbuq7k2bgsxhwi30jds.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fycbuq7k2bgsxhwi30jds.webp" alt="The generated post list: each post with a photo, its date and author, a one-line description and its tags" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Don't commit yet. The contact form goes in the same commit.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4: Connect the contact form
&lt;/h2&gt;

&lt;p&gt;The contact page (&lt;code&gt;docs/contact.md&lt;/code&gt;) is already built. It just needs somewhere to send messages.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6vwdfodgxz8f29ldvtv5.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6vwdfodgxz8f29ldvtv5.webp" alt="The template's contact page: a " width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open BootForm's &lt;a href="https://bootform.com/uuidgenerator" rel="noopener noreferrer"&gt;UUID generator&lt;/a&gt; and copy the ID it gives you. That ID is your form. There is nothing to sign up for yet.&lt;/li&gt;
&lt;li&gt;In &lt;code&gt;docs/contact.md&lt;/code&gt;, find &lt;code&gt;__YOUR_FORM_ID__&lt;/code&gt; in the form's &lt;code&gt;action&lt;/code&gt; and paste your ID over it.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A BootForm form ID is a UUID you generate yourself. Pasting it into a form's &lt;code&gt;action&lt;/code&gt; makes the form work straight away, and the first person to claim the ID receives everything sent to it. So use the ID that was generated for you, never one you saw in a tutorial (this one included).&lt;/p&gt;

&lt;p&gt;Leave the hidden &lt;code&gt;honeypot&lt;/code&gt; field in the form alone. It is BootForm's spam trap: bots fill it in, people never see it, and while the honeypot is on (it is by default), a submission without it is treated as spam. More in &lt;a href="https://bootform.com/docs/spam-protection" rel="noopener noreferrer"&gt;Spam protection&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Now open the &lt;strong&gt;Source Control&lt;/strong&gt; panel on the left, write a message such as "Make it mine", and click &lt;strong&gt;Commit &amp;amp; Push&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 5: Go live and send yourself a message
&lt;/h2&gt;

&lt;p&gt;Open the &lt;strong&gt;Actions&lt;/strong&gt; tab of your repository. The deploy run takes about a minute; when it turns green, your site is at &lt;code&gt;https://yourname.github.io/vitepress-blog/&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Open the contact page, fill it in and press Send. Because nobody owns this form yet, BootForm holds the message and shows you a page offering to claim the form. Create a free account there (signing up with GitHub is quickest) and the form is yours: the waiting message shows up in your dashboard, and new messages are emailed to the address you signed up with.&lt;/p&gt;

&lt;p&gt;Until it is claimed, a form holds up to 10 messages for 48 hours, so claim it before you share the site.&lt;/p&gt;

&lt;h2&gt;
  
  
  How much does it cost?
&lt;/h2&gt;

&lt;p&gt;Nothing, for a blog like this one. GitHub Pages hosts a public repository's site for free, within &lt;a href="https://docs.github.com/en/pages/getting-started-with-github-pages/github-pages-limits" rel="noopener noreferrer"&gt;soft limits&lt;/a&gt; of 1 GB per site and 100 GB of bandwidth a month. BootForm's free plan adds the contact form, with 150 submissions a month across up to 3 active forms, email and Discord notifications, and spam protection. See &lt;a href="https://bootform.com/pricing" rel="noopener noreferrer"&gt;pricing&lt;/a&gt; for the paid plans.&lt;/p&gt;

&lt;p&gt;A custom domain is optional. The site works on its &lt;code&gt;github.io&lt;/code&gt; address; your own domain costs whatever your registrar charges, and &lt;a href="https://bootform.com/docs/computer-setup" rel="noopener noreferrer"&gt;Setting up your computer&lt;/a&gt; covers pointing it at GitHub Pages.&lt;/p&gt;

&lt;p&gt;One thing worth knowing: GitHub's own documentation says Pages is not meant to run an online business, an e-commerce site or software as a service. A personal blog, a portfolio or a small business's information site is the kind of thing it is for.&lt;/p&gt;

&lt;h2&gt;
  
  
  Frequently asked questions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Is GitHub Pages really free?
&lt;/h3&gt;

&lt;p&gt;Yes, for a public repository. GitHub's published limits are 1 GB per site and a soft limit of 100 GB of bandwidth a month, which is far more than a small blog uses.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can a static site have a working contact form?
&lt;/h3&gt;

&lt;p&gt;Yes. The form posts to a form backend instead of your own server. With BootForm you point the form's &lt;code&gt;action&lt;/code&gt; at &lt;code&gt;https://f.bootform.com/&lt;/code&gt; followed by your form ID, and each message is emailed to you and kept in a dashboard.&lt;/p&gt;

&lt;h3&gt;
  
  
  Do I need to install anything?
&lt;/h3&gt;

&lt;p&gt;No. Everything in this post happens in the browser: GitHub's web pages and the &lt;code&gt;github.dev&lt;/code&gt; editor. GitHub Actions builds the site for you. You can still run it on your own computer with Node.js if you prefer.&lt;/p&gt;

&lt;h3&gt;
  
  
  What happens to messages before I sign up?
&lt;/h3&gt;

&lt;p&gt;BootForm holds up to 10 messages for 48 hours on a form nobody has claimed yet. Claim the form with a free account and they are delivered to you; after 48 hours unclaimed, they are deleted.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can I use my own domain?
&lt;/h3&gt;

&lt;p&gt;Yes. GitHub Pages supports custom domains with free HTTPS. You buy the domain from any registrar and point it at GitHub; &lt;a href="https://bootform.com/docs/computer-setup" rel="noopener noreferrer"&gt;Setting up your computer&lt;/a&gt; walks through it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where to go next
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Add more to the pages.&lt;/strong&gt; &lt;a href="https://bootform.github.io/site-sections/" rel="noopener noreferrer"&gt;site-sections&lt;/a&gt; has 27 copy-paste sections (heroes, pricing, FAQs, footers) written to work inside these templates.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Let an AI agent do the editing.&lt;/strong&gt; Each template ships with an &lt;code&gt;AGENTS.md&lt;/code&gt;, and the &lt;a href="https://github.com/BootForm/site-skills" rel="noopener noreferrer"&gt;Claude Code plugins&lt;/a&gt; can add sections, new kinds of content and a theme for you.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;More templates.&lt;/strong&gt; &lt;a href="https://bootform.com/docs/templates" rel="noopener noreferrer"&gt;Starter templates&lt;/a&gt; lists the rest, including a one-page business site that ends on your own domain.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Using another site builder?&lt;/strong&gt; The &lt;a href="https://bootform.com/docs/framework-jekyll" rel="noopener noreferrer"&gt;Jekyll&lt;/a&gt;, &lt;a href="https://bootform.com/docs/framework-vue" rel="noopener noreferrer"&gt;Vue&lt;/a&gt; and &lt;a href="https://bootform.com/docs/framework-vanilla-js" rel="noopener noreferrer"&gt;plain HTML&lt;/a&gt; guides show the same form in each.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Start with &lt;a href="https://github.com/BootForm/vitepress-blog" rel="noopener noreferrer"&gt;the template&lt;/a&gt;: the whole thing takes about fifteen minutes.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>tutorial</category>
      <category>beginners</category>
      <category>github</category>
    </item>
  </channel>
</rss>
