Skip to content

DistroFinder is a web application built with React, TypeScript, and Vite that allows users to explore information about Linux distributions

License

Notifications You must be signed in to change notification settings

felagund1789/distrofinder

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

97 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

DistroFinder

TypeScript HTML5 CSS3 React React Router Vite

๐Ÿ“š Overview

DistroFinder is a frontend-only web application built with React, TypeScript, and Vite that allows users to explore information about Linux distributions in a clean, fast, and visually consistent way.

The app focuses on discoverability, clarity, and editorial-style presentation, making it easy to browse distros, inspect their details, and navigate between related information.

Note: DistroFinder is intentionally frontend-only. All data is loaded from static JSON files and images served as static assets.


Home page on desktop Distro detail page on desktop Distro comparison selection on desktop Distro comparison page on desktop Distro recommendation wizard on desktop Distro recommendation wizard on desktop Distro recommendation wizard on desktop

Home page on mobile Distro detail page on mobile Distro detail page on mobile

โœจ Features

๐Ÿ—‚๏ธ Distro Grid (Home)

  • Displays a grid of Linux distributions
  • Each distro is represented by a card with:
    • Thumbnail image
    • Name
    • Short description
    • Status indicator
  • Client-side search
  • Client-side filtering via select controls (Desktop, Category)
  • Filters and search are synced with URL query parameters
  • Fully static data source (no backend)

๐Ÿ“„ Distro Detail Page

  • Dedicated detail page per distro (/d/:slug)
  • Editorial-style layout with clear hierarchy:
    • Hero section with logo, name, and status
    • About section with description and screenshot
    • Technical overview with structured metadata
  • Clickable Desktop and Category tags that:
    • Navigate back to Home
    • Apply the corresponding filter automatically
  • Breadcrumb navigation (Home / Distro Name)
  • Fully responsive (mobile-first)
  • Dark mode support via CSS variables

โ†”๏ธ Distro Comparison Page

  • Side-by-side comparison of multiple distros
  • Comparison table with key attributes
  • Accessible via URL with query parameters (e.g. /?compare=ubuntu,mint)
  • Clickable links to remove distros from comparison

๐Ÿงญ Distro Recommendation Wizard

  • Interactive wizard that recommends distributions based on your needs (/wizard)
  • Accessible from the Home page via the recommendation callout/button
  • Steps collected by the wizard:
    • Experience level (beginner, intermediate, advanced)
    • Primary use cases (multiple selection)
    • Hardware profile (older computer, Raspberry Pi, server, etc.)
    • Priorities / philosophy (ease-of-use, privacy, stability, performance, free-software)
    • Preferred desktop environment and other options for intermediate/advanced users
  • The wizard scores distros client-side against your answers and presents a ranked list with short reasons for each recommendation
  • State is persisted locally (so you can resume the wizard), and the logic is implemented in src/utils/scoring.ts and src/utils/wizardStorage.ts.
  • Use the result list to jump to distro detail pages.

๐ŸŽจ Design System

  • Custom design system based on CSS variables (no Tailwind)
  • Light and dark themes
  • Reusable UI primitives:
    • Tag
    • StatusBadge
    • DefinitionRow
    • RadioGroup
  • Consistent spacing, typography, and color tokens

๐Ÿงฑ Project Structure

src/
โ”œโ”€โ”€ components/
โ”‚   โ”œโ”€โ”€ compare/          # Comparison-specific components
โ”‚   โ”œโ”€โ”€ distro/           # Distro-specific components
โ”‚   โ”œโ”€โ”€ layout/           # Layout-level components
โ”‚   โ”‚โ”€โ”€ routing/          # Routing-related components
โ”‚   โ”œโ”€โ”€ tags/             # Domain-aware clickable tags
โ”‚   โ”œโ”€โ”€ ui/               # Reusable UI primitives
โ”‚   โ””โ”€โ”€ wizard/           # Recommendation wizard components
โ”œโ”€โ”€ context/
โ”‚   โ””โ”€โ”€ DistroContext.tsx # Global state & data access
โ”œโ”€โ”€ data/
โ”‚   โ””โ”€โ”€ distroServices.ts # Data fetching utilities
โ”œโ”€โ”€ hooks/
โ”‚   โ””โ”€โ”€ useDebouncedSearch.ts
โ”œโ”€โ”€ pages/
โ”‚   โ”œโ”€โ”€ ComparePage.tsx   # Comparison page
โ”‚   โ”œโ”€โ”€ DistroDetail.tsx  # Detail page
โ”‚   โ””โ”€โ”€ Home.tsx          # Home page
โ”œโ”€โ”€ styles/
โ”‚   โ”œโ”€โ”€ global.css        # Design tokens & global styles
โ”‚   โ””โ”€โ”€ ...
โ”œโ”€โ”€ test/                 # Test utilities & mocks
โ”œโ”€โ”€ types/
โ”‚   โ””โ”€โ”€ distro.ts         # TypeScript types for distros
โ”œโ”€โ”€ utils/
โ”‚   โ””โ”€โ”€ filters.ts        # Filtering & search utilities
โ”œโ”€โ”€ App.tsx
โ””โ”€โ”€ main.tsx

๐Ÿ“ฆ Data Model

Each Linux distribution is defined in JSON and enforced via TypeScript types. Example:

{
  "slug": "mint",
  "name": "Linux Mint",
  "lastUpdate": "2026-01-17 13:48",
  "description": "Linux Mint is an Ubuntu-based distribution...",
  "homepage": "https://linuxmint.com/",
  "osType": "Linux",
  "basedOn": "Debian (Stable), Ubuntu (LTS)",
  "origin": "Ireland",
  "architecture": "i686, x86_64",
  "desktop": "Cinnamon, MATE, Xfce",
  "category": "Beginners, Desktop, Live Medium",
  "status": "Active",
  "defaultDesktop": "Cinnamon, MATE, Xfce",
  "installation": "mintinstall",
  "defaultBrowser": "Firefox",
  "packageManagement": "DEB, Flatpak",
  "releaseModel": "Fixed",
  "officeSuite": "LibreOffice",
  "processorArchitecture": "x86_64",
  "initSystem": "systemd",
  "fileSystems": "Btrfs, ext4, XFS",
  "popularity": 2,
  "rating": 8.8,
  "reviewCount": 975,
  "slug": "mint",
  "name": "Linux Mint",
  "logo": "...",
  "screenshot": "...",
  "thumbnail": "...",
  "localPaths": {
    "logo": "...",
    "screenshot": "...",
    "thumbnail": "..."
  }
}

Images (logos, thumbnails, screenshots) are served as static assets.


๐Ÿš€ Getting Started

Prerequisites

  • Node.js 18+
  • npm or pnpm

Install dependencies

npm install

Run the development server

npm run dev

The app will be available at:

http://localhost:5173

Build for production

npm run build

๐ŸŒ— Theming & Dark Mode

  • Dark mode is implemented using CSS variables
  • Theme switching is handled at the root level
  • No duplicated styles between light/dark modes

๐Ÿ” Routing

  • / โ†’ Distro grid (home)
  • /d/:slug โ†’ Distro detail page
  • /?compare=:slug1,:slug2 โ†’ Distro compare page
  • /wizard โ†’ Distro recommendation wizard

React Router is used for client-side navigation.


โŒ What Is Not Included (By Design)

  • No backend
  • No authentication
  • No server-side rendering
  • No analytics

The app is intentionally simple, fast, and easy to reason about.


๐Ÿ”ฎ Future Improvements

The following features are good candidates for future iterations:

UI / UX

  • Facet-based filtering UI (tags with counts)
  • Collapsible filter sidebar on mobile
  • Active filter summary bar
  • Keyboard navigation improvements

Data & Content

  • Release history timeline
  • External links (official website, docs)
  • Screenshots gallery

Performance

  • Virtualized grid for very large datasets
  • Image lazy-loading optimizations

Developer Experience

  • Unit tests for selectors and utilities
  • Storybook for UI components
  • Linting and formatting rules

๐Ÿ› ๏ธ Technologies Used


๐Ÿค Contributing

Contributions are welcome! Feel free to open issues or submit pull requests on GitHub.


๐Ÿ“„ License

DistroFinder is licensed under the MIT License. Feel free to use, modify, and distribute it as you see fit!

About

DistroFinder is a web application built with React, TypeScript, and Vite that allows users to explore information about Linux distributions

Topics

Resources

License

Stars

Watchers

Forks

Contributors