A personal site with three tabs: Home (about), Socials, and a Library โ a personal MCBE pack management system with automatic pack indexing. Projects live on Home as cards, not their own tab.
- Home โ hero, bio, known/learning languages, and cards into Projects and the Library
- Projects (reached via a card on Home) โ every brand, client, and tool in one place
- Socials โ Discord, YouTube, GitHub, PayPal, MCPEDL, CurseForge
- Library โ the pack browser documented below
Custom color palette for optimal visual hierarchy:
- Primary Accent:
#489c49(Green) โ highlights, CTAs, active states - Light Gray:
#424549โ light neutral backgrounds - Medium Gray:
#36393eโ mid-tone neutrals - Dark Gray:
#282b30โ dark backgrounds - Darker Gray:
#1e2124โ primary background
Features:
- Responsive sidebar + main content layout
- Smooth animations and transitions
- Dark mode (default) + Light mode
- Professional pack cards with metadata
- Smart search and category filtering
- Category counts and author attribution
โโโ index.html # Main page
โโโ styles.css # Design system
โโโ script.js # Client-side app logic
โโโ generator.py # Auto-index generator
โโโ packs.json # Generated pack index (DO NOT EDIT)
โโโ README.md # This file
โโโ packs/ # Your pack storage
โโโ packs/
โ โโโ my-texture-pack/
โ โ โโโ pack.json # Pack metadata
โ โโโ another-pack/
โโโ clients/
โโโ addons/
โโโ website/
โโโ other/
Create a folder in packs/[category]/:
packs/packs/nyxora-texture-pack/
Create packs/packs/nyxora-texture-pack/pack.json:
{
"name": "Nyxora Texture Pack",
"description": "A vibrant texture pack overhauling terrain, mobs, and UI",
"author": "Your Name",
"version": "1.0.0",
"thumbnail": "๐ฆ",
"tags": ["texture", "pack", "mcbe"],
"category": "packs",
"license": "MIT"
}Supported Fields:
nameโ Pack display namedescriptionโ Brief descriptionauthorโ Your name/usernameversionโ Version number (e.g., "1.0.0")thumbnailโ Emoji or image URL (use emoji for simplicity)tagsโ Search keywordscategoryโ One of:packs,clients,addons,website,otherlicenseโ License type (optional)
Put your pack files, configs, etc. inside the pack folder:
packs/packs/nyxora-texture-pack/
โโโ pack.json
โโโ README.md
โโโ textures/
โโโ license.txt
Generate the index:
python generator.pyThis scans packs/ and updates packs.json. It also:
- Calculates pack sizes
- Counts files
- Generates
sitemap.xmlfor SEO - Updates category counts
Commit and push to GitHub:
git add -A
git commit -m "Add new design pack: Modern UI Kit"
git push origin mainYour site updates automatically with the new pack!
Every card and detail page shows the pack name as Minecraft-style splash text over a banner image:
- Drop a
pack_banner.pnginto a pack's folder to use it as that pack's own banner (falls back tobg.pngif that's what's there). - Otherwise, the sitewide default banner at
assets/default-banner.pngis used โ add that file once and every pack without its own banner picks it up automatically.
The splash text uses "Gyroscope Mojang F" by Vyacheslav Kirnos
(CC BY-SA 3.0) โ see assets/fonts/license.txt.
Drop more than one pack file (.mcpack/.mcaddon/.zip/etc) into the same
pack folder and the generator lists every one on the detail page, newest
first, each with its own size/date/Download button. The version number is
read from the filename (My_Pack_V1.6.0.mcpack) or, if there isn't one,
from the file's own manifest.json.
Every Download button (sidebar and each version row) routes through
Linkvertise before handing over the real file โ same setup as ClientLibrary.
Configure it in script.js:
const LINKVERTISE_USER_ID = 499358;
function isMonetizationOn() { return true; }Packs in the website category skip the detail page entirely โ clicking
the card opens the site directly (in a new tab, unless "Open Links in
New Tab" is off in Settings).
To add one, no pack.json is required. Just create a folder with:
packs/website/glacier-client/
โโโ glacierclient.xyz โ empty file; the filename IS the link
โโโ icon.png โ card thumbnail
โโโ bg.png โ optional banner (unused since there's no detail page)
The generator treats any file in the folder that isn't pack.json,
icon.png, bg.png, or a known doc file (README/LICENSE) as the link
file โ its filename becomes https://<filename>. Run python generator.py
afterward to pick it up. You can still add a pack.json alongside these
files for a custom name/description/tags; otherwise the folder name is
used.
- Find packs by name, description, or tags
- Real-time filtering as you type
- Filter by: Packs, Clients, Addons, Website, Other
- Shows pack count per category
- The "All" view groups results by category with a divider line and label
- One-click filtering
- Name (A-Z) โ alphabetical
- Recently Added โ newest first
- Most Downloads โ most popular
- Dark mode (default) for late-night browsing
- Light mode for daytime
- Settings panel for preferences
- Pack name and description
- Author attribution
- Download count
- Pack size
- Version number
- Tags/keywords
Use Emoji (Recommended):
"thumbnail": "๐จ"Use Image URL:
"thumbnail": "https://example.com/image.png"Available Emoji for Common Types:
- Packs:
๐ฆ๐จ๐๏ธ - Clients:
๐ก๏ธโ๏ธ๐ง - Addons:
โจ๐งฉ๐ฎ - Website:
๐๐ป๐ - Other:
๐๐ญ๐
- packs โ Texture/resource packs
- clients โ MCBE client builds and configs
- addons โ Behavior pack addons and mods
- website โ Site source code and web tools
- other โ Everything else (capes, misc tools, resources)
The generator.py script automates index management:
# Scan and update index
python generator.py
# Check for missing metadata
python generator.py --validateWhat it does:
- Scans
packs/directory - Reads
pack.jsonfrom each folder - Calculates directory sizes
- Updates
packs.jsonwith all metadata - Generates
sitemap.xmlfor search engines - Reports any issues or missing data
Use Cases:
- After adding new packs
- Before deploying to production
- In CI/CD pipeline for automation
-
Naming Convention
- Use kebab-case for folder names:
modern-ui-kitโ notModern UI Kit - Use meaningful names that describe the pack
- Use kebab-case for folder names:
-
Metadata Quality
- Write clear, concise descriptions (2-3 sentences)
- Include relevant tags for discoverability
- Use emoji thumbnails for consistency
-
Pack Organization
- Keep related files together in the pack folder
- Include a
README.mdwith usage instructions - Add
LICENSEfile for legal clarity
-
Versioning
- Use semantic versioning:
MAJOR.MINOR.PATCH - Increment when adding features or fixes
- Use
1.0.0for initial release
- Use semantic versioning:
-
Downloads Tracking
.metadata.jsonin a pack folder sets the starting count picked up by the generator:
{ "downloads": 150, "last_updated": "2026-08-29" }
- From there, downloads count up live in the browser โ no server or
Cloudflare Worker needed. Every click on a pack's Download button
calls a free public counter ([abacus](https://jasoncameron.dev/abacus/)),
which persists and increments the count globally. The pack detail
page fetches the current live count on load and falls back to the
static seed number above until the first real click happens.
## ๐ Deployment
### GitHub Pages
1. Push to GitHub repository
2. Enable GitHub Pages in repo settings
3. Site auto-deploys to your domain
### Custom Domain
Add your domain in `CNAME` file (already configured)
### CI/CD
Add to your workflow to auto-generate index:
```yaml
- name: Update Pack Index
run: python generator.py
After deploying, you can track:
- Total packs available
- Downloads per pack
- Popular categories
- User searches
The generator creates sitemap.xml for search engine indexing.
Edit styles.css CSS variables:
:root {
--color-accent: #489c49; /* Your brand color */
--color-bg-primary: #1e2124; /* Background */
}- Sidebar width:
--sidebar-width: 280px - Grid columns:
grid-template-columns - Spacing:
--spacing-*variables
Edit script.js createPackCard() method to display additional metadata.
packs/
โโโ packs/
โ โโโ nyxora-texture-pack/
โ โโโ pack.json
โ โโโ README.md
โ โโโ LICENSE
โ โโโ textures/
โ โโโ blocks/
โ โโโ ui/
pack.json:
{
"name": "Nyxora Texture Pack",
"description": "A vibrant texture pack overhauling terrain, mobs, and UI",
"author": "Your Name",
"version": "2.1.0",
"thumbnail": "๐ฆ",
"tags": ["texture", "pack", "mcbe"],
"category": "packs"
}Q: Can I have nested categories? A: No, but you can use tags for more detailed organization.
Q: How often should I run the generator? A: After adding/removing packs, or set it up in CI/CD to run automatically.
Q: Can I customize the pack card display?
A: Yes! Edit the createPackCard() method in script.js.
Q: How do I track pack downloads?
A: Add .metadata.json file in each pack folder.
For issues or questions:
- Check the pack.json format matches the template
- Ensure generator.py ran successfully
- Verify packs.json was updated
Pack Library generator is MIT licensed.
Individual packs have their own licenses (specified in pack.json).
Built with ๐ using a custom design language