Fully Hosted: GitHub-Powered Guestbook
Hosting a web app typically demands costly servers, a barrier for small projects. I bypassed this with Fully Hosted, a guestbook app entirely on GitHub, using GitHub Actions and SQLite for the database and GitHub Pages for HTML. In the web’s bustling marketplace, Fully Hosted is a cozy inn, welcoming visitors to leave their mark without a penny spent.
Messages are stored in an SQLite database via GitHub Actions, fetched and displayed on a static page using sql.js, making the app free and serverless.
# GitHub Action workflow to store messages
name: Update Guestbook Database
on:
workflow_dispatch:
inputs:
name:
required: true
message:
required: true
jobs:
update-db:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Insert guestbook entry
run: |
sqlite3 data.db "CREATE TABLE IF NOT EXISTS guestbook (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, message TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP);"
sqlite3 data.db "INSERT INTO guestbook (name, message) VALUES ('$NAME', '$MESSAGE');"
env:
NAME: ${{ inputs.name }}
MESSAGE: ${{ inputs.message }}
This workflow stores messages in SQLite, while the client renders them:
async function displayMessages() {
const response = await fetch('data.db');
const buffer = await response.arrayBuffer();
const db = new SQL.Database(new Uint8Array(buffer));
const result = db.exec("SELECT * FROM guestbook");
renderMessages(result);
}
Fully Hosted’s charm is its accessibility, inviting all to participate without server costs.

Creating Fully Hosted was like opening a roadside tavern, offering warmth without cost. At DOSAYGO, we champion accessibility, building tools that invite everyone to the table. Fully Hosted is a welcoming space, a digital guestbook where stories are shared freely.