npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

storeapp-tui

v3.0.6

Published

Le Play Store du Terminal — client TUI Textual + backend FastAPI

Readme

StoreApp.TUI v3.0

Le Play Store du Terminal — une TUI immersive style Google Play pour découvrir, télécharger, installer et publier des applications en ligne de commande.


Aperçu rapide

 _____ ___  ___  ____  _____   _   ____  ____
/ ____|  _||   ||  _ \|  ___| / \ |  _ \|  _ \
\___ \ | |_|   || |_) |  _|  / _ \| |_) | |_) |
 ___) ||  _|   ||  _ <| |___/ ___ \  __/|  __/
|____/ |_| \___||_| \_\|____/_/   \_\_|  |_|

✦  Le Play Store du Terminal  ✦

socket

Backend public : https://storeapp-7mbo.onrender.com
Python requis : 3.9+
OS : Linux · macOS · Windows (WSL recommandé)


Installation

Option 1 — Script automatique (recommandé)

git clone https://github.com/gopu-inc/store-app.git
cd store-app
bash install.sh

Options disponibles :

| Flag | Effet | |---|---| | (aucun) | Installe uniquement le client TUI | | --dev | Client + dépendances serveur (développement local) | | --server | Dépendances serveur uniquement | | --uninstall | Supprime l'installation complète |

Option 2 — Manuelle

# 1. Cloner
git clone https://github.com/gopu-inc/store-app.git
cd store-app

# 2. Dépendances
pip install textual>=0.50.0 rich>=13.0.0 httpx>=0.27.0

# 3. (Optionnel) Installer le package
pip install -e .

Option 3 — pip (quand publié sur PyPI)

pip install storeapp-tui

Lancement

# Via l'entry-point installé
store

# Directement depuis le dépôt
cd store && python store.py

# Avec un serveur personnalisé
STOREAPP_API_URL=http://localhost:8000 store

Fonctionnalités v3.0

Écran Accueil — style Play Store

| Zone | Description | |---|---| | Top bar | Logo + barre de recherche intégrée + nom d'utilisateur connecté | | Catégories | Chips scrollables : Tout / Python / Node / Go / Rust / Bash… | | Carousel "En vedette" | 6 cartes riches (icône env, auteur, note ★, téléchargements) — cliquables | | Liste Applications | DataTable avec icônes d'environnement, notes colorées, highlight de recherche | | Barre de nav | Accueil · Parcourir · Publier · Profil |

Écran Parcourir — recherche avancée

| Fonctionnalité | Détail | |---|---| | Live search | Recherche dès 2 caractères tapés, sans appuyer Entrée | | Highlight | Correspondances surlignées dans le nom et la description | | Filtres Env | Chips : Tout / Python / Node / Go / Rust… | | Tri | Pertinence · Note ↓ · Téléchargements ↓ · Récent | | Statut serveur | Indicateur ● vert/rouge (ping Render en temps réel) |

Écran Détail — TabbedContent

| Onglet | Contenu | |---|---| | 📋 Informations | Nom, bundle, version, auteur, description, dépendances, permissions | | 📖 README | Rendu Markdown du README de l'application | | 📸 Médias | Icône pixel art (.pxl) + carousel de screenshots | | ⭐ Avis | Liste des notes et commentaires utilisateurs |

Installation automatique

Le bouton ⚙ Installer :

  1. Télécharge le .tpkg dans ~/.storeapp/downloads/
  2. Extrait l'archive dans ~/.storeapp/tmp_store/<bundle>/
  3. Détecte et exécute postinstall.sh automatiquement
  4. Affiche la progression et les logs en temps réel

Autres écrans

| Écran | Description | |---|---| | Login | ASCII art banner · Connexion + Inscription · Session persistante | | Publier | Upload .tpkg avec validation en temps réel |


Raccourcis clavier

| Touche | Action | |---|---| | Ctrl+H | Accueil | | Ctrl+B | Parcourir | | Ctrl+P | Publier | | Ctrl+Q | Quitter | | Escape | Retour / Fermer dialog | | 1 – 5 | Sélectionner une note (dialog de notation) | | F5 | Rafraîchir l'écran courant | | Tab / Shift+Tab | Naviguer entre les champs |


Architecture du projet

store-app/
├── install.sh              # Script d'installation universel
├── setup.py                # Package Python (pip install -e .)
├── MANIFEST.in             # Fichiers inclus dans la distribution
├── server.py               # Backend FastAPI (Render)
├── manifest.txml           # Manifest du projet
│
└── store/                  # Client TUI
    ├── store.py            # Point d'entrée (python store.py)
    ├── app.py              # StoreApp — routage, bindings globaux
    ├── api.py              # Client httpx → API Render
    ├── config.py           # Config + persistance session (~/.storeapp/)
    │
    ├── screens/
    │   ├── login.py        # Login/signup avec ASCII art
    │   ├── home.py         # Accueil Play Store (carousel, catégories)
    │   ├── browse.py       # Recherche live + filtres avancés
    │   ├── detail.py       # Détail tabbé + installation + médias
    │   └── publish.py      # Publication .tpkg
    │
    ├── widgets/
    │   ├── pixel_art.py    # PixelArtWidget — rendu .pxl (blocs colorés)
    │   ├── rating_dialog.py  # Modal notation 1–5 ★
    │   └── comment_dialog.py # Modal commentaire texte libre
    │
    ├── styles/
    │   └── app.tcss        # Thème cyberpunk dark complet (730+ lignes)
    │
    └── agent/              # Outils développeur
        ├── builder.py      # Construction du .tpkg
        ├── commands.py     # Commandes CLI (init/build/publish)
        └── metadata.py     # Gestion du manifest.txml

Flux de données

Utilisateur
    │
    ▼
StoreApp (app.py)          ← bindings clavier, routage screens
    │
    ├── StoreAPI (api.py)  ← httpx → https://storeapp-7mbo.onrender.com
    │       │
    │       └── /apps · /search · /featured · /download · /rate · /comment
    │
    └── Screens            ← workers thread (jamais de freeze UI)

Format .pxl (pixel art)

Les icônes et screenshots sont stockés côté serveur en PNG et convertis à la volée en .pxl (texte brut) par l'API.

Format hex (par défaut) :

#1a1b1e #58a6ff #58a6ff #1a1b1e
#58a6ff #ffffff #ffffff #58a6ff
#1a1b1e #58a6ff #58a6ff #1a1b1e

Format palette :

PALETTE
B=#1a1b1e  W=#ffffff  A=#58a6ff  .=transparent
PIXELS
B A A B
A W W A
B A A B

Rendu dans le terminal : blocs colorés via Rich.


Format .tpkg

Les applications publiées sur le store sont des archives .tar.gz renommées .tpkg.

Structure attendue :

monapp.tpkg/
├── manifest.txml           # Obligatoire
├── README.md               # Recommandé
├── postinstall.sh          # Exécuté automatiquement à l'installation
├── icon.png                # 200×200 px (optionnel)
└── screenshots/            # Max 5 PNG (optionnel)
    ├── 01.png
    └── 02.png

manifest.txml minimal :

<?xml version="1.0" encoding="UTF-8"?>
<manifest>
  <name>Mon Application</name>
  <bundle>com.auteur.monapp</bundle>
  <version>1.0.0</version>
  <author>Auteur</author>
  <description>Description courte</description>
  <environnement>python</environnement>
  <entrypoint>main.py</entrypoint>
</manifest>

Agent CLI (développeurs)

# Initialiser un nouveau projet
agent init

# Construire le .tpkg
agent build

# Publier sur le store (connexion requise)
agent publish

Backend (serveur FastAPI)

Le serveur server.py est déployé sur Render à l'adresse https://storeapp-7mbo.onrender.com.

Lancer localement

# Dépendances serveur
pip install fastapi uvicorn[standard] python-jose[cryptography] pillow python-multipart httpx

# Variables d'environnement requises
export GITHUB_TOKEN=ghp_xxxxxxxxxxxxx    # Token GitHub (stockage des .tpkg)
export GITHUB_REPO=owner/repo            # Dépôt de stockage
export SECRET_KEY=changeme               # Clé JWT (optionnel, défaut généré)

# Lancement
python server.py
# → http://localhost:8000

Routes principales

| Méthode | Route | Description | |---|---|---| | GET | /apps | Liste toutes les applications | | GET | /apps/{bundle} | Détail d'une application | | GET | /apps/{bundle}/icon | Icône .pxl 16×8 | | GET | /apps/{bundle}/screenshots | Screenshots .pxl 40×14 | | GET | /search?q=… | Recherche full-text | | GET | /featured | Applications en vedette | | GET | /download/{bundle} | Téléchargement .tpkg | | POST | /signup | Création de compte | | POST | /login | Connexion (JWT) | | POST | /publish | Publication .tpkg | | POST | /rate/{bundle} | Note + commentaire |


Données persistantes locales

~/.storeapp/
├── session.json            # Token JWT + nom d'utilisateur
├── downloads/              # .tpkg téléchargés
├── apps/                   # Applications installées
└── tmp_store/              # Extraction temporaire à l'installation

Dépendances

| Paquet | Version min | Rôle | |---|---|---| | textual | 0.50.0 | Framework TUI | | rich | 13.0.0 | Rendu texte coloré | | httpx | 0.27.0 | Client HTTP async-compatible | | fastapi | (serveur) | API REST | | uvicorn | (serveur) | Serveur ASGI | | pillow | (serveur) | Conversion PNG → .pxl | | python-jose | (serveur) | JWT |


Contribution

  1. Forkez le dépôt
  2. Créez une branche : git checkout -b feat/ma-fonctionnalite
  3. Committez : git commit -m "feat: description"
  4. Pushez : git push origin feat/ma-fonctionnalite
  5. Ouvrez une Pull Request

Licence

MIT — voir LICENSE