Rank your stuff β no tiers, no noise, just accurate 1v1 rankings.
Features β’ Demo β’ Tech Stack β’ Getting Started β’ Project Structure β’ Deployment β’ Contributing β’ License
RANKMAKER is a web application that lets users build precise, personalized rankings through fast 1-on-1 matchups. Instead of dragging items into broad tiers, users are presented with head-to-head battles and their choices are compiled into an ordered ranking using an efficient sorting algorithm.
Pick a template β movies, music, sports, anime, food, and many more β and let the battles decide what really comes out on top.
Live site: rankmaker.net
- 1v1 Battle System β Fast, tap-friendly matchup interface that minimizes decision fatigue.
- Smart Sorting Algorithm β Generates accurate rankings from the fewest comparisons possible.
- Pre-built Templates β Across 18 categories: Movies, Music, Sports, Games, TV, Anime, Food, and more.
- Full-text Search β Search templates by title, description, or individual options.
- Podium & Full Results β Animated podium for the top 3 plus a complete ordered list.
- Share & Export β Download your ranking as an image, share the template link, or post to X (Twitter).
- Battle History β Review every matchup you made during a ranking session.
- Undo & Finish Early β Changed your mind? Undo the last matchup or finish early at any time.
- Manual Reorder β Fine-tune your final ranking by dragging items into position.
- Internal Tracking β Anonymous tracking of ranking starts for internal analytics and future features.
- Responsive Design β Fully responsive, looks great on phones, tablets, and desktops.
- View Transitions β Smooth page transitions powered by Astro's View Transitions API.
- SEO Optimized β Dynamic sitemap, proper meta tags, and semantic HTML.
- Cookie Consent β GDPR-compliant cookie consent banner.
| Layer | Technology |
|---|---|
| Framework | Astro 5 (static output) |
| Styling | Tailwind CSS 4 |
| Language | TypeScript |
| Fonts | Outfit (Google Fonts) |
| Icons | Font Awesome 6 |
| Data Source | Local JSON file (src/data/templates.json) |
| Storage | Cloudflare KV (Internal Tracking) |
| Hosting | Cloudflare Pages via @astrojs/cloudflare adapter |
| Package Manager | pnpm |
- Node.js β₯ 18
- pnpm β₯ 8 (install with
npm install -g pnpmif needed)
# Clone the repository
git clone https://github.com/martinezharo/rankmaker.git
cd rankmaker
# Install dependencies
pnpm install# Start the dev server (http://localhost:4321)
pnpm dev# Build for production
pnpm build
# Preview the production build locally
pnpm previewrankmaker/
βββ public/ # Static assets (logos, favicon, images)
β βββ images/ # Template cover images
β βββ RANKMAKER-logo.webp
β βββ robots.txt
β βββ ...
βββ src/
β βββ components/
β β βββ ranking/ # Battle & results components
β β β βββ BattleView.astro
β β β βββ ResultsView.astro
β β β βββ FinishEarlyModal.astro
β β β βββ BattleHistoryModal.astro
β β βββ Header.astro
β β βββ Footer.astro
β β βββ TemplateCard.astro
β β βββ CategorySection.astro
β β βββ SEOContent.astro
β β βββ SmartImage.astro
β β βββ CookieConsent.astro
β βββ data/
β β βββ templates.json # All template data (auto-generated)
β βββ layouts/
β β βββ Layout.astro # Base HTML layout
β βββ pages/
β β βββ index.astro # Homepage with category sections
β β βββ search.astro # Template search & filter page
β β βββ about.astro # About page
β β βββ contact.astro # Contact page
β β βββ api/
β β β βββ track.ts # Server-side API for ranking tracking
β β βββ template/
β β β βββ [slug].astro # Dynamic template page (battle + results)
β β βββ sitemap.xml.ts # Dynamic XML sitemap
β β βββ ... # Legal pages (privacy, terms, cookies, etc.)
β βββ styles/
β β βββ global.css # Global styles & Tailwind config
β βββ env.d.ts # TypeScript definitions for Cloudflare runtime
βββ astro.config.mjs # Astro configuration
βββ wrangler.jsonc # Cloudflare Workers config
βββ tsconfig.json
βββ package.json
βββ pnpm-lock.yaml
We have implemented a Server-Side API (/api/track) that logs anonymous ranking events to Cloudflare KV whenever a user clicks "Start Ranking".
- Why? This is currently used for internal control to see which templates are most popular.
- Future Plans: This data will be used to implement a real-time "Times Ranked" counter on the frontend for each template card and detail page.
RANKMAKER is configured to deploy on Cloudflare Pages using the @astrojs/cloudflare adapter.
# Build the project
pnpm build
# Deploy to Cloudflare
npx wrangler pages deploy dist- Connect your GitHub repository in the Cloudflare Pages dashboard.
- Set the build command to
pnpm build. - Set the output directory to
dist. - Add your environment variables if needed.
Contributions are welcome! Please read the Contributing Guide before submitting a pull request.
This project is licensed under the MIT License β see the LICENSE file for details.
Made with β€οΈ by Oli
