| Status | Draft |
| Author | Gatherloop Team |
| Last updated | 2026-07-14 |
| Target platform | Web (static site, deployed on GitHub Pages) |
| Language | Bahasa Indonesia (all customer-facing content) |
Gatherloop is a board game cafe located in Kraksaan, Probolinggo. Customers currently have no single place to find essential information: how much it costs to play, what games are available, what food & drinks are served, and where the cafe is located.
This project delivers a simple, mobile-first landing page (link-tree style) that answers those questions in one scroll, plus two supporting pages (Game Collection and F&B Menu).
- Give potential customers all key information (harga main, koleksi game, menu, lokasi) in one place.
- Be easily shareable as a single URL on Instagram bio, WhatsApp, and Google Maps profile.
- Be cheap to host and easy to maintain β static site on GitHub Pages, content editable by non-developers where possible (JSON data file, replaceable images).
- Online reservation / booking system
- Online ordering or payment
- CMS or admin dashboard
- User accounts
- Multi-language support (Indonesian only)
- Walk-in prospects (mobile, 80%+ of traffic expected): found Gatherloop via Instagram or Google Maps, want to know price, games, and location before visiting.
- Existing customers: want to check the game collection or menu before/while visiting.
Primary device: smartphone. The design must be mobile-first; desktop is a nice-to-have that reuses the same centered single-column layout.
graph TD
A["/ (Landing Page)"] --> B["/games (Koleksi Game)"]
A --> C["/menu (Menu F&B)"]
A --> D["Google Maps (external link)"]
| Route | Page | Description |
|---|---|---|
/ |
Landing | Hero, Harga Main, link items, FAQ, footer |
/games |
Koleksi Game | List of board games from a static JSON data file |
/menu |
Menu F&B | Displays the existing menu image(s) |
| external | Lokasi | Direct link to the Google Maps pin (opens in new tab) |
Single-column, link-tree style page with five sections, in order:
- Full-width hero image (cafe interior / people playing board games). Placeholder image until the real photo is ready.
- Gatherloop logo.
- Tagline in Indonesian, e.g.:
"Tempat Nongkrong Seru Sambil Main Board Game"
Ratusan pilihan game, kopi enak, dan teman baru menunggumu di Gatherloop.
- (Copy is placeholder β final wording to be confirmed by the owner.)
- Section title: "Harga Main".
- The rate is communicated with an image (poster/infographic produced by the team). The page only provides the layout slot; use a placeholder image for now.
- Image requirements:
- Displayed at full content width (max ~480px on desktop), maintains aspect ratio.
- Must have descriptive
alttext (e.g. "Daftar harga main Gatherloop") for accessibility and for when the image fails to load. - Image file lives in the repo (e.g.
public/images/harga-main.png) so the owner can update it by replacing the file.
Three large, tappable card/button links stacked vertically:
| Label (ID) | Destination | Behavior |
|---|---|---|
| π² Koleksi Game | /games |
Internal navigation |
| β Menu Makanan & Minuman | /menu |
Internal navigation |
| π Lokasi | Google Maps URL | Opens in new tab (target="_blank", rel="noopener") |
- Below the Lokasi link (or as its subtitle), show the address description:
Perum New Kraksaan Land, Blok G16, Kebonagung, Kraksaan
- Minimum tap target height 48px; full content width.
- Section title: "Pertanyaan yang Sering Ditanyakan" (or "FAQ").
- Accordion behavior: tapping a question expands its answer; tapping again collapses it. Multiple items may be open at once (simplest behavior; no exclusive-open requirement).
- Must work with keyboard (Enter/Space) and expose proper
aria-expandedstate. Prefer native<details>/<summary>for zero-JS robustness. - Initial FAQ content (placeholder, to be confirmed by owner):
| Pertanyaan | Jawaban (draft) |
|---|---|
| Apakah harus reservasi dulu sebelum datang? | Tidak perlu, kamu bisa langsung datang. Untuk rombongan besar, hubungi kami dulu via Instagram/WhatsApp. |
| Berapa harga untuk main board game? | Lihat bagian "Harga Main" di atas ya. Harga sudah termasuk akses ke semua koleksi game. |
| Apakah ada yang mengajari cara bermain? | Ada! Tim kami siap menjelaskan aturan game yang kamu pilih. |
| Jam operasionalnya kapan? | Setiap hari, silakan cek Instagram kami untuk jam operasional terbaru. |
| Apakah boleh datang sendirian? | Boleh banget! Kamu bisa gabung bermain dengan pengunjung lain. |
- FAQ content stored as a static data file (JSON) or inline content β implementation detail, but must be easy to edit.
- Social media icons + links (open in new tab): Instagram, WhatsApp, TikTok (final list to be confirmed; Instagram is mandatory).
- Short address line (same as Lokasi description) and copyright:
Β© 2026 Gatherloop.
- Page title: "Koleksi Game", with a back link to
/. - Renders a list/grid of games (1 column on mobile, 2β3 columns on wider screens).
- Each game card shows:
- Image (box art) β placeholder allowed initially
- Title
- Duration range β e.g. "30β60 menit"
- Player count range β e.g. "2β5 pemain"
- Age range β e.g. "8+"
- Data source: static JSON file in the repo (
src/data/games.json). JSON is chosen over markdown because the data is structured/tabular (numbers, ranges) and JSON can be imported/validated at build time without a frontmatter parsing step.
- Display rules:
- Duration:
"{min}β{max} menit"; if min == max, show single value ("30 menit"). - Players:
"{min}β{max} pemain"; if min == max,"{min} pemain". - Age:
"{minAge}+".
- Duration:
- v1 has no search/filter/sort (collection is small). If the collection grows, a client-side name filter can be added later (future enhancement).
- Page title: "Menu Makanan & Minuman", with a back link to
/. - Shows the existing menu image(s) at full content width. Support one or more images stacked vertically (menus often span multiple pages).
- Image files live in
public/images/menu/β the owner updates the menu by replacing files. - Each image needs
alttext ("Menu makanan dan minuman Gatherloop β halaman 1"). - Placeholder image until the real menu image is added to the repo.
- No dedicated page. The "Lokasi" link points directly to the Google Maps pin URL (to be provided by owner; use a placeholder
https://maps.app.goo.gl/...constant until then). - The address description "Perum New Kraksaan Land, Blok G16, Kebonagung, Kraksaan" appears in two places: under the Lokasi link and in the footer.
| Area | Requirement |
|---|---|
| Hosting | GitHub Pages, deployed automatically from main via GitHub Actions |
| Performance | Static output, minimal JS. Images lazy-loaded below the fold, compressed (WebP preferred). Target Lighthouse β₯ 90 on mobile for Performance/SEO/Accessibility |
| SEO | Indonesian meta title/description, Open Graph tags (for WhatsApp/Instagram link previews), favicon, sitemap.xml |
| Accessibility | Semantic HTML, alt text on all images, keyboard-operable accordion, sufficient color contrast |
| Responsiveness | Mobile-first (360px baseline); single centered column, max-width ~640px content on desktop |
| Browser support | Evergreen browsers + Android WebView (Instagram in-app browser) |
| Base path | Site must work under a GitHub Pages subpath (https://<org>.github.io/<repo>/) and a custom domain later β all internal URLs must respect the configured base path |
- Astro static site generator.
- Rationale: zero JS by default (fast on low-end phones), file-based routing for the 3 pages, components for shared header/footer, first-class JSON import for the games data, official GitHub Pages deploy action, and
baseconfig handles the Pages subpath problem. - Alternative considered: plain HTML/CSS/JS (no build). Rejected because header/footer/layout would be copy-pasted across pages and the games list would need client-side fetch + rendering, which is worse for SEO and slow devices.
- Rationale: zero JS by default (fast on low-end phones), file-based routing for the 3 pages, components for shared header/footer, first-class JSON import for the games data, official GitHub Pages deploy action, and
- Plain CSS (single stylesheet with CSS custom properties for theme tokens). No CSS framework needed at this size; can revisit if the site grows.
- No client-side framework. The FAQ accordion uses native
<details>/<summary>. - GitHub Actions workflow using
withastro/actionto build and deploy to GitHub Pages.
Visual tone: warm, playful, cozy ("tempat nongkrong"). Suggested tokens (to refine during implementation):
- Background: warm cream
#FAF6F0 - Primary/accent: deep green
#1F6F54(buttons, links) - Text: near-black
#26221D - Rounded corners (12β16px), soft shadows on cards.
- Font: a friendly sans-serif (e.g. system stack or a single Google Font such as "Nunito" self-hosted to avoid external requests).
βββββββββββββββββββββββββββββββ
β βββββββββββββββββββββββββββ β
β β β β
β β [ HERO IMAGE ] β β
β β people playing games β β
β β β β
β βββββββββββββββββββββββββββ β
β (o) Gatherloop β
β β
β Tempat Nongkrong Seru β
β Sambil Main Board Game β
β Ratusan pilihan game, β
β kopi enak, dan teman baru β
β β
β ββ Harga Main ββββββββββββ β
β βββββββββββββββββββββββββββ β
β β β β
β β [ HARGA MAIN IMAGE ] β β
β β (poster/infographic) β β
β β β β
β βββββββββββββββββββββββββββ β
β β
β βββββββββββββββββββββββββββ β
β β π² Koleksi Game βΊ β β
β βββββββββββββββββββββββββββ β
β βββββββββββββββββββββββββββ β
β β β Menu Makanan βΊ β β
β β & Minuman β β
β βββββββββββββββββββββββββββ β
β βββββββββββββββββββββββββββ β
β β π Lokasi β β β
β β Perum New Kraksaan β β
β β Land, Blok G16, β β
β β Kebonagung, Kraksaanβ β
β βββββββββββββββββββββββββββ β
β β
β ββ FAQ βββββββββββββββββββ β
β βββββββββββββββββββββββββββ β
β β Apakah harus reservasi β β
β β dulu sebelum datang? βΎ β β
β βββββββββββββββββββββββββββ€ β
β β Berapa harga untuk β β
β β main board game? βΎ β β
β βββββββββββββββββββββββββββ€ β
β β Apakah ada yang β β
β β mengajari cara main? β΄ β β
β β βββββββββββββββββββββββ β β
β β Ada! Tim kami siap β β
β β menjelaskan aturan game β β
β β yang kamu pilih. β β
β βββββββββββββββββββββββββββ β
β β
β βββββββββ footer ββββββββββ β
β [IG] [WA] [TikTok] β
β Perum New Kraksaan Land, β
β Blok G16, Kebonagung, β
β Kraksaan β
β Β© 2026 Gatherloop β
βββββββββββββββββββββββββββββββ
Same single centered column, max-width ~640px, generous whitespace on the sides; hero image may widen to ~960px with rounded corners.
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β βββββββββββββββββββββββββββββ β
β β [ HERO IMAGE ] β β
β βββββββββββββββββββββββββββββ β
β (o) Gatherloop β
β Tempat Nongkrong Seru Sambil Main β
β Board Game β
β β
β ββ Harga Main ββ β
β βββββββββββββββββββββββ β
β β [HARGA MAIN IMAGE] β β
β βββββββββββββββββββββββ β
β βββββββββββββββββββββββ β
β β π² Koleksi Game βΊ β β
β βββββββββββββββββββββββ β
β ... etc ... β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
βββββββββββββββββββββββββββββββ
β βΉ Kembali β
β β
β Koleksi Game β
β β
β βββββββββββββββββββββββββββ β
β β βββββββββ Splendor β β
β β β box β β± 30β60 menitβ β
β β β art β π₯ 2β4 pemainβ β
β β βββββββββ π 10+ β β
β βββββββββββββββββββββββββββ β
β βββββββββββββββββββββββββββ β
β β βββββββββ Uno β β
β β β box β β± 15β30 menitβ β
β β β art β π₯ 2β10 pemainβ β
β β βββββββββ π 7+ β β
β βββββββββββββββββββββββββββ β
β ... β
βββββββββββββββββββββββββββββββ
βββββββββββββββββββββββββββββββ
β βΉ Kembali β
β β
β Menu Makanan & Minuman β
β β
β βββββββββββββββββββββββββββ β
β β β β
β β [ MENU IMAGE PG 1 ] β β
β β β β
β βββββββββββββββββββββββββββ β
β βββββββββββββββββββββββββββ β
β β [ MENU IMAGE PG 2 ] β β
β βββββββββββββββββββββββββββ β
βββββββββββββββββββββββββββββββ
Each phase is one small, independently reviewable PR. Every PR leaves the deployed site in a working (if incomplete) state. Suggested order below; phases 4β7 are independent of each other and can be parallelized after phase 3.
PR: chore: scaffold Astro project and GitHub Pages deploy
- Initialize Astro project (minimal template),
.gitignore,README.mdwith local dev instructions (npm install,npm run dev). - Configure
siteandbaseinastro.config.mjsfor GitHub Pages. - GitHub Actions workflow (
.github/workflows/deploy.yml) building and deploying to Pages on push tomain. - A bare
/page with just "Gatherloop" text to prove the pipeline. - Done when: pushing to
mainpublishes the placeholder page on the GitHub Pages URL.
PR: feat: base layout, global styles, and footer with social links
- Shared
Layout.astro: HTML head (Indonesianlang="id", meta title/description, Open Graph tags, favicon), global CSS with color/typography tokens from Β§8. Footer.astro: social media icons (placeholder URLs as named constants), address line, copyright.- Landing page uses the layout (content still mostly empty).
- Done when: all future pages can compose
Layout+Footer; footer matches mockup.
PR: feat: landing hero and harga main sections
- Hero section: hero placeholder image, logo, tagline copy (Β§5.1.A).
- "Harga Main" section with the placeholder rate image slot (Β§5.1.B).
- Responsive per mockups 8.1/8.2.
- Done when: landing shows hero + harga main matching the mockup on mobile and desktop.
PR: feat: landing link-tree section (Koleksi Game, Menu, Lokasi)
- Three link cards (Β§5.1.C).
/gamesand/menumay 404 until phases 6β7 β acceptable, or link cards can be marked "segera hadir" until then (reviewer's choice; prefer shipping the real hrefs). - Lokasi card links to Google Maps placeholder URL, shows the address description, opens in a new tab.
- Done when: three cards render and navigate correctly.
PR: feat: landing FAQ accordion
- FAQ section using
<details>/<summary>with the draft Q&A content (Β§5.1.D), styled per mockup. - FAQ entries defined in a single easy-to-edit data structure (JSON file or const array).
- Done when: items expand/collapse via tap and keyboard; content matches Β§5.1.D.
PR: feat: game collection page backed by games.json
src/data/games.jsonwith the schema from Β§5.2, seeded with 5β10 real games (placeholder box-art images)./gamespage rendering the card grid with title, image, duration, players, age, and back link.- Formatting rules from Β§5.2 (range collapsing, "menit"/"pemain"/"N+").
- Done when: adding a game = adding one JSON entry + one image file, no code change.
PR: feat: menu F&B page
/menupage rendering one or more menu images frompublic/images/menu/with back link (Β§5.3).- Placeholder image until the real menu image is provided.
- Done when: replacing the image file(s) updates the menu with no code change.
PR: chore: real content, SEO polish, and launch checklist
- Swap placeholders that are ready: real hero photo, harga main image, menu images, Google Maps URL, social media URLs, final tagline & FAQ copy (owner input needed β see Β§10).
sitemap.xml, verify OG previews on WhatsApp, Lighthouse pass (β₯90 mobile), image compression to WebP.- Optional: custom domain setup (CNAME) if the owner has one.
- Done when: launch checklist in the PR description is fully checked.
- Final Google Maps pin URL for the Lokasi link.
- Social media accounts to include (Instagram handle, WhatsApp number, TikTok?).
- Final tagline wording and FAQ answers (drafts in Β§5.1 are placeholders).
- Hero photo, harga main poster image, and menu image files.
- Will a custom domain be used, or the default
github.ioURL? - Operating hours β show them on the landing page or keep pointing to Instagram?
- Search/filter on the game collection (by player count, duration).
- Game detail page with description and rules-summary link.
- Reservation via WhatsApp deep link with pre-filled message.
- Event/komunitas section (game nights, tournaments).
- Google Analytics or a lightweight privacy-friendly counter.