A minimal, trustworthy, offline-first AI chatbox PWA you can self-host on GitHub Pages (or any static host).
Add your own API connections and agents/prompts. Switch connections and agents from the composer, or let the app pick them automatically based on your first message.
main. The included workflow (.github/workflows/deploy.yml) builds and deploys the site to GitHub Pages automatically.No build step required — this is a pure static site. The workflow simply uploads the repo root as the Pages artifact.
# Python 3
python3 -m http.server 8000
# then open http://localhost:8000
Or any static file server (npx serve, caddy file-server, etc.). A normal file:// URL will NOT work because service workers require an http(s) origin.
Copy all files to any static host root (Netlify, Vercel, Cloudflare Pages, S3, Nginx). Ensure index.html, sw.js, manifest.webmanifest, app.js, providers.js, styles.css, and the icons/ folder are all served from the same directory. That's it — no backend, no database.
.html file.Mic button in the composer: click to start recording, click again to stop. Uses the free browser Web Speech API by default (Chrome/Edge). Optional Whisper API. Speaker button appears on assistant messages when text-to-speech is enabled. Uses free browser speech by default; optional OpenAI TTS or ElevenLabs.
Ask for an image (e.g. "draw a cat") and the app automatically routes to an enabled DALL·E or Stability AI connection. The generated image is shown inline in the chat.
Select the Web researcher agent and the app calls Tavily, Brave Search, or SerpApi, then asks your chat model to answer with source citations. Source chips are rendered below the reply.
In Settings → Knowledge base, choose an embedding provider and upload PDF, DOCX, TXT, MD, CSV, or HTML documents. The app chunks, embeds, and stores vectors locally in IndexedDB. Ask the Knowledge base researcher agent to retrieve relevant excerpts and answer from your uploaded files.
Attach PDF or DOCX files to any chat. Text is extracted in the browser using pdfjs-dist and mammoth.js and included in the message context.
Click the globe icon in the composer to open the browser panel in split view. The browser panel shows a search interface when first opened — type a URL or a search query to navigate. Send a message in browser mode and the AI uses a fetch-based browser agent to navigate pages, extract content, click links, and fill forms.
Link a folder or file in the composer. The autonomous agent loop can call web search, image generation, URL fetch, and knowledge base search when those connections are enabled, in addition to reading/writing files.
index.html App shell
app.js Chat UI, IndexedDB history, streaming, import/export, settings, folder wiring, routing
providers.js API connection presets and default agents
model-router.js Connection selection, API routing, streaming SSE parsing, fallback logic
browser-agent.js AI-driven browser control agent (fetch-based page extraction)
agent-loop.js Autonomous multi-step coding/writing/research loop with extra tools
voice.js Web Speech API + Whisper/TTS helpers
tools.js Image generation and web search API wrappers
doc-parser.js PDF/DOCX/text extraction and text chunking
rag.js Knowledge-base chunking, embedding, vector storage, retrieval
memory.js Lightweight agent memory layer (scoped notes)
tool-parser.js Shared XML/JSON tool call parser
fs-tools.js File System Access API wrapper (list, read, write, patch, search)
db.js IndexedDB wrapper (conversations, folder handles, knowledge base)
styles.css Minimal responsive dark/light UI
sw.js Service worker (app-shell precache + stale-while-revalidate)
manifest.webmanifest PWA manifest (installable)
icons/ App icons (SVG + PNG)
MIT — do whatever you want. Attribution appreciated.