The Great Apes — Personal Blog
Personal blog featuring articles, a gallery, a PDF reader, and an AI chatbot. Built without frameworks or bundlers — vanilla HTML, CSS, and JavaScript with Vercel serverless functions as the backend.

A personal blog — "The Great Apes" — live at https://www.amazthegreatape.com/. A static multi-page site with no framework and no build step, where every dynamic capability is added by a serverless function or a Firebase listener rather than by a bundler.
Highlights
- No framework, no bundler, and that is the design — plain HTML pages plus vanilla JS in an IIFE module pattern. Header and footer are injected at runtime by
loadComponent()fetching partial HTML, so navigation is edited once inlayout/header.htmlrather than in every page. - A three-layer cache-busting system that actually reaches open tabs — versioned asset URLs (
css/style.css?v=…) force a refetch, per-folderCache-Controlheaders keep HTML revalidating while versioned CSS/JS cache for seven days, and anASSET_VERSIONconstant compared against ano-storeversion.jsontriggers exactly one reload. The third layer exists because the first two cannot rescue a tab left open for days or a page restored from bfcache; admin pages are deliberately skipped, since reloading mid-article would discard the draft. - Dynamic Open Graph tags without server rendering the whole site —
api/artikel.jsreads_artikel.htmland renders per-article OG meta, with/artikel.htmlrewritten to it invercel.json. The generatedartikel.htmlat the repo root is gitignored output, not a source file. - A PDF reader that streams from Google Drive —
api/drive-pdf.jsruns on the Edge runtime and proxies range requests for the pdf.js-based "Pojok Baca" reader, passingContent-Rangethrough; the EdgeResponsenever forwardsContent-Length, which is why the range handling is explicit. - The AI key never reaches the browser — the chatbot talks to
api/chat.js, a server-side DeepSeek proxy. The Firebase config in client JS is public client configuration by design; security rests on database rules, not on hiding it.
Key Features
- Articles — writing with comments and reactions backed by Firebase Realtime Database, plus a search endpoint and a content index.
- Gallery — photo collections driven by
data/galeri.jsonand Firebase, with lightbox viewing. - Pojok Baca — an in-browser PDF e-reader streaming books through the Drive proxy, so nothing large is committed to the repo.
- Chatbot — a DeepSeek-backed assistant reachable from the site, proxied server-side.
- Testimonials, portfolio and contact — semi-static content in
data/*.jsoncombined with live Firebase records and akirim-pesanendpoint. - Admin panel — Firebase Auth login gating article, gallery and testimonial management directly from the browser.
Tech Stack
- HTML + CSS + vanilla JavaScript (ES6, IIFE modules, no framework)
- Firebase Realtime Database, Auth and Storage (compat SDK v8.10.1, loaded from CDN)
- Vercel Serverless Functions (
api/*.js, nativehandler(req, res), not Express) - Vercel Edge runtime (
api/drive-pdf.jsstreaming proxy) - DeepSeek API (chatbot, server-side only)
- pdf.js (Pojok Baca e-reader)
- Vercel (hosting, deploys on push to
main)
Status & Maturity
Active and in continuous use. There is no automated test suite — verification is a documented manual browser checklist plus one ad hoc Puppeteer script run by hand, never in CI. Local development splits between Live Server for static pages and vercel dev for the api/ endpoints. The line count below is dominated by tracked static assets and written content rather than application logic, and is reported that way on purpose.
Measured Metrics
| Commits | 125 |
| Date Range | 31 Mar 2026 – 11 Aug 2026 |
| Lines of code | 93,523 (mostly static asset/content files, not all logic) |
| Automated tests | none |