Package discovery platform for the Flet ecosystem. Search, explore, and share Flet packages and extensions — all data aggregated from GitHub, PyPI, and ClickHouse in one place.
Like pub.dev for Flutter, but for Flet.
Flet PKG indexes all Flet packages from the community and official sources, enriches them with download stats and quality metadata, and serves everything from an in-memory index — zero-latency search, filter, sort, and pagination.
- Features
- Live Demo
- Installation
- Quick Start
- How It Works
- Configuration
- Project Structure
- Development
- Developer Guide
- Buy Me a Coffee
- Learn More
- Flet Community
- Support
- Contributing
If you find this project useful, please consider supporting its development:
- Search packages by name, description, topics, and keywords
- Filter by type (UI Controls, Services), category, PyPI availability, official only
- Sort by stars, downloads, trending, recently updated, or newest
- Package detail with README, changelog, dependencies, and download stats
- Verified badge — automatic quality verification based on multiple criteria
- New badge — highlights packages created in the last 30 days
- Share button — copy link and share to social networks
- Dark/Light mode — respects system preference, toggleable
- Responsive layout — adapts to desktop and mobile screens
- Local cache — persistent JSON cache for instant startup (stale-while-revalidate)
- Background re-indexing — hourly refresh without user interruption
- Topic search —
topic:audiosyntax for exact topic matching
Visit the live platform: flet-pkg-app.onrender.com
- Python 3.12+
- uv (fast Python package manager)
- A GitHub Personal Access Token
# Clone the repository
git clone https://github.com/brunobrown/flet-pkg-app.git
cd flet-pkg-app
# Install dependencies
uv sync
# Create secrets file and add your GitHub token
cat <<EOF > .secrets.toml
[default]
GITHUB_TOKEN = "ghp_your_personal_access_token_here"
EOF1. Configure your GitHub token in .secrets.toml:
[default]
GITHUB_TOKEN = "ghp_your_personal_access_token_here"2. Run the app:
# Desktop mode
uv run flet run main.py
# Web mode
uv run flet run main.py --web --port 8001Flet PKG builds an in-memory index at startup by fetching data from three sources:
GitHub API PyPI API ClickHouse
(discovery + (versions + (download
metadata) packages) stats)
│ │ │
└──────────┬───────┘─────────────────┘
│
PackageIndexService
(in-memory index)
│
┌───────┴───────┐
│ query() │ ← zero HTTP, microseconds
│ filter/sort │
│ paginate │
└───────────────┘
- Discovery — finds repositories with Flet-related topics on GitHub
- Enrichment — verifies PyPI existence, fetches versions and metadata
- Stats — retrieves download counts from ClickHouse (same source as pepy.tech)
- Index — builds in-memory list, re-indexes every hour in background
- Local cache — persists to disk for instant startup on next launch
All user queries run against the in-memory index — zero HTTP requests per interaction.
Configuration is managed by Dynaconf with two files:
| File | Purpose | Git tracked |
|---|---|---|
settings.toml |
Public settings (API URLs, cache TTLs, UI options) | Yes |
.secrets.toml |
Sensitive values (API tokens) | No |
| Setting | Default | Description |
|---|---|---|
INDEX_REINDEX_INTERVAL |
3600 (1h) | Background re-index interval |
CACHE_TTL_SECONDS |
300 (5min) | General cache TTL |
CACHE_TTL_DOWNLOADS |
86400 (24h) | Download stats cache TTL |
LOCAL_INDEX_CACHE_TTL |
21600 (6h) | Local JSON cache TTL |
NEW_PACKAGE_DAYS |
30 | Days to show "New" badge |
DEFAULT_PER_PAGE |
10 | Default pagination size |
Environment variable overrides use the prefix SET_VAR_DYNACONF_:
SET_VAR_DYNACONF_GITHUB_TOKEN=ghp_xxx uv run flet run main.pyflet-pkg-app/
├── main.py # Application entry point
├── config.py # Dynaconf configuration
├── settings.toml # Public settings
├── .secrets.toml # Sensitive settings (git-ignored)
├── src/
│ ├── core/ # Logger, constants, exceptions
│ ├── domain/ # Entities, use cases, repository ABC
│ │ ├── entities/ # Package, PackageType, SortOption
│ │ ├── usecases/ # SearchPackages, GetPackageDetail, etc.
│ │ └── repositories/ # Abstract PackageRepository
│ ├── data/ # External data sources and implementations
│ │ ├── sources/ # GitHub, PyPI, ClickHouse, PackageDiscovery
│ │ ├── repositories/ # PackageRepositoryImpl
│ │ └── models/ # Mappers (API response → domain entity)
│ ├── services/ # ApiService, CacheService, IndexService
│ ├── presentation/ # Flet UI (declarative mode)
│ │ ├── pages/ # PackagesPage, PackageDetailPage, ContributePage
│ │ ├── components/ # Header, SearchBar, PackageCard, Footer
│ │ ├── hooks/ # use_packages (state → UI bridge)
│ │ ├── state_management/ # AppState, PackagesState, AppContext
│ │ ├── navigation/ # NavigationService, AppRouter
│ │ └── themes/ # Light/Dark themes, colors
│ └── utils/ # Formatters, helpers
├── tests/
│ ├── unit/ # 124 unit tests
│ └── integration/ # Integration tests (require Flet runtime)
├── assets/ # Images and icons
├── docs/ # Documentation site (Docusaurus)
├── Dockerfile # Production container
└── render.yaml # Render deployment blueprint
# Clone and install
git clone https://github.com/brunobrown/flet-pkg-app.git
cd flet-pkg-app
uv sync
# Run the app
uv run flet run main.py
# Format
uv tool run ruff format
# Lint
uv tool run ruff check
# Type check
uv tool run ty check
# Unit tests
python -m pytest tests/unit/ -x -q| Tool | Purpose |
|---|---|
| Python 3.12+ | Runtime |
| Flet 0.84+ | UI framework (declarative mode) |
| httpx | Async HTTP client |
| Dynaconf | Configuration management |
| Ruff | Formatting and linting |
| ty | Type checking |
| pytest | Testing |
| Docker | Production deployment |
| Docusaurus | Documentation site |
Want your package to appear on Flet PKG? Follow these steps:
- Name your repository and PyPI package with the
flet-prefix - Add topics
fletandfletPackageon GitHub - Include
fletas a dependency inpyproject.toml - Add
keywordsinpyproject.toml - Write a complete
README.mdwith examples - Maintain a
CHANGELOG.md
The index refreshes every hour. New packages may take up to 60 minutes to appear.
For the full guide, see the Developer Guide in the documentation.
Join the community to contribute or get help:
If you like this project, please give it a GitHub star ⭐
Contributions and feedback are welcome!
- Fork the repository
- Create a feature branch
- Run all quality checks (
ruff format,ruff check,ty check,pytest) - Submit a pull request with detailed explanation
For feedback, open an issue with your suggestions.
Commit your work to the LORD, and your plans will succeed. Proverbs 16:3

