# MakeArmy Static Dash Ultra-fast, no-framework homepage for curating links/tools with a **strict 3-column grid**, **config-driven theming**, and **crisp icon tiles**. Works on any static host. --- ## Quick start ```bash # put these files in a folder index.html styles.css app.js config.json images/ma-icon.png # header logo images/favicon.png|ico # favicon(s) icons/*.svg|png # item icons # serve locally (choose one) python3 -m http.server 8080 # or npx live-server --port=8080 Open http://localhost:8080 Press / to focus Search. Use Tab to keyboard-navigate tiles (visible focus rings). All content/layout is driven by config.json. File structure / ├─ index.html # markup shell; content is injected at runtime ├─ styles.css # styles (theme via CSS variables) ├─ app.js # reads config.json, builds UI, handles grid logic ├─ config.json # your data, colors, layout, icons ├─ images/ │ ├─ ma-icon.png │ └─ favicon.png (or .ico) └─ icons/ ├─ db-f.png ├─ privatebin.svg └─ ... (all tile icons) Config guide (config.json) JSON must be valid: double-quoted keys/strings, no comments, no trailing commas. Top level Key Type Description Default title string Big monospace header and "Home" subtitle string Small italic tagline under the title "" header Key Type Description Default logo string (URL/path) Header square logo "/images/ma-icon.png" background color Full-bleed header color + <meta name="theme-color"> "#101010" searchPlaceholder string Search input placeholder "Start typing to filter" showSearch boolean Hide/show search true icons Centralizes icon handling; item icons use filenames only and are prefixed by basePath. Key Type Description Default basePath string Prefix for all item icons (e.g., "/icons/") "" (none) fallbackIcon string If an icon 404s, swap to this file; if empty, a built-in SVG fallback is used "" defaultScale number Per-item default icon_scale multiplier 1 boxPercent string Icon box size inside tile (e.g., "85%") "85%" preloadTopN number Preload up to N icons for faster first paint 16 faviconPng string PNG favicon "/images/favicon.png" faviconIco string ICO favicon "/images/favicon.ico" ogImage string Social preview image header.logo typography Key Type Description Default sectionTitlePx number Section header font size (monospace) 22 itemLabelPx number Tile label font size (bold sans) 12 theme Base greys, pastel accents, and hover glow tuning. Key Type Description Default background color Page background #202020 panel color Section surface #121212 tile color Tile surface #202020 ink color Primary text #f2f2f2 inkDim color Muted text #a9a9a9 theme.accents (used when a section’s accent is 1..4): blue: "#3a85ff", green: "#1fc66e", red: "#ff3f5d", yellow: "#ffdb33" theme.glow (tile hover underglow): corePx (default 3) – thin inner highlight radius blurPx (default 7) – small outer halo (spread) coreAlpha (default 0.95) – inner brightness (0–1) outerAlpha (default 0.64) – outer brightness (0–1) layout Strict, compact 3-across layout using a 6-track grid under the hood. Key Type Description Default pageMax number Content wrap width (header is full-bleed) 2400 gapSections number Space between sections (px) 14 gapItems number Space between tiles (px) 10 gridCols number Internal grid tracks per section 6 tileColspan number Default tile span 2 sectionMin number Min section width (px) 300 sectionBasis number Preferred section width (px) 320 sectionMax number Max section width (px) 340 tileHeight number Fixed tile row height (px) 62 Last-row behavior 1 leftover → tile spans all tracks (full width) 2 leftovers → each spans half width 3 or multiples of 3 → normal rows a11y reducedMotion (bool) – advisory; UI also respects OS prefs via prefers-reduced-motion. focusOutline (bool) – advisory; visible focus rings are enabled. sections Array of section cards with a title, accent, and items. Section fields Key Type Description title string Text in the colored bar accent number | string 1..4 uses theme.accents; hex string (e.g., "#8a6cff") for custom Item fields Key Type Description label string Tile title (white, not underlined) href string Destination URL note string Optional subtitle (currently hidden in CSS; enable if desired) icon string Filename (e.g., "db-f.png") – combined with icons.basePath icon_scale number Per-icon scale to offset canvas padding (e.g., 1.15) icon_class string Extra CSS class for targeting icon_svg string Inline raw SVG string (advanced) target string _self or _blank check string URL to ping with <img> for “up/down” dot (should return any image; 4.5s timeout) Minimal example { "title": "MakeArmy", "header": { "logo": "/images/ma-icon.png", "background": "#101010", "showSearch": true }, "icons": { "basePath": "/icons/", "preloadTopN": 16 }, "theme": { "background": "#202020", "panel": "#121212", "tile": "#202020" }, "layout": { "pageMax": 2400, "gridCols": 6, "tileColspan": 2, "tileHeight": 62 }, "sections": [ { "title": "Utilities", "accent": 1, "items": [ { "label": "PrivateBin", "href": "https://paste.example.com", "icon": "privatebin.svg", "target": "_blank" }, { "label": "Images", "href": "https://img.example.com", "icon": "picsur.png", "target": "_blank" }, { "label": "Docs", "href": "https://docs.example.com", "icon": "docs.svg" } ] } ] } Theming quickies Pastels: nudge theme.accents.* lighter/desaturated. Glow: adjust theme.glow.blurPx (spread) and coreAlpha/outerAlpha (intensity). Density: tweak layout.tileHeight, gapItems, gapSections. Text: bump typography.itemLabelPx or sectionTitlePx. Performance tips Prefer SVG icons; for PNG, export at 2× with transparent background. Keep icons.preloadTopN around 8–24. Cache /icons/ aggressively: Cache-Control: public, max-age=31536000, immutable. Keep app.js as defer (already set in index.html). Deploying Any static host: NGINX, Caddy, Apache, GitHub Pages, Cloudflare Pages, Netlify, S3 + CloudFront. Headers to consider Correct Content-Type for SVG: image/svg+xml. Cache icons long-term; keep config.json lightly cached while iterating. Keyboard & A11y / focuses search. Tab to navigate; tiles show visible outlines in section accent color. Reduced motion respected via prefers-reduced-motion. Troubleshooting “Failed to load config.json: JSON.parse …” JSON is strict: no comments, no trailing commas, double-quoted keys/strings only. Icons missing Confirm icons.basePath (e.g., "/icons/"). Hard reload (Ctrl/Cmd-Shift-R). Try opening https://your.site/icons/foo.png directly. Set icons.fallbackIcon (e.g., "fallback.svg"). Rows/columns odd or last row wraps Keep layout.gridCols: 6, tileColspan: 2. Ensure layout numbers are plain numbers (app adds px). Tiles too tall/short Adjust layout.tileHeight and/or typography.itemLabelPx. Status dot always ‘down’ check must return an image (some endpoints block image hotlinking). Use a dedicated “status pixel”. Contributing / Maintaining Add/remove items by editing sections[*].items in config.json. Order matters. Move objects inside the sections array to change section order. Set section accent to 1..4 (uses theme palette) or a custom hex (e.g., "#8a6cff"). To centralize icons, keep filenames in items and set "icons.basePath": "/icons/".