https://github.com/aspenini/memory-pak
A comprehensive console and game collection manager built with PyQt6
https://github.com/aspenini/memory-pak
application collecting collection consoles gamer games memory-pak pyqt6 python retro tool video-games yaml
Last synced: about 2 months ago
JSON representation
A comprehensive console and game collection manager built with PyQt6
- Host: GitHub
- URL: https://github.com/aspenini/memory-pak
- Owner: Aspenini
- License: mit
- Created: 2025-07-21T00:28:39.000Z (11 months ago)
- Default Branch: master
- Last Pushed: 2025-07-24T08:53:39.000Z (11 months ago)
- Last Synced: 2025-07-24T10:05:46.869Z (11 months ago)
- Topics: application, collecting, collection, consoles, gamer, games, memory-pak, pyqt6, python, retro, tool, video-games, yaml
- Language: Python
- Homepage:
- Size: 3.36 MB
- Stars: 0
- Watchers: 0
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# Memory Pak
[](https://github.com/Aspenini/Memory-Pak/actions/workflows/ci.yml)
[](https://github.com/Aspenini/Memory-Pak/actions/workflows/deploy.yml)
[](https://github.com/Aspenini/Memory-Pak/releases/latest)
[](https://github.com/Aspenini/Memory-Pak/releases)
[](LICENSE)
A cross-platform game collection tracker built with Rust, Tauri 2, Svelte, and WebAssembly. Memory Pak tracks consoles, games, and toy-to-life collectibles (LEGO Dimensions, Skylanders, and more) across owned, favorite, wishlist, and notes states.
## Features
- Desktop and mobile app shells through Tauri 2
- Static web/PWA build using the same Svelte frontend and Rust core compiled to WASM
- Embedded catalog precompiled at build time into a single binary blob (`postcard`)
- Deterministic slug-based entry IDs (`game:nes/super-mario-bros`, `collectible:legodimensions/batman`, etc.)
- Unified Collectibles tab spanning every toy-to-life line in `database/collectibles/`
- Cross-console search, sorting, filtering, and virtualized long lists
- JSON import/export at schema version `2.0`
## Project Structure
```text
Memory-Pak/
├── crates/
│ ├── memory_pak_core/ # shared Rust data model, queries, state reducer, import/export
│ └── memory_pak_wasm/ # wasm-bindgen adapter for the browser/PWA target
├── frontend/ # Svelte 5 + TypeScript + Vite app
├── src-tauri/ # Tauri 2 desktop/mobile shell and commands
├── database/ # `consoles.json`, `games/*.json`, `collectibles/*.json`
├── icons/ # platform icons reused by Tauri and PWA
└── site/ # GitHub Pages landing page; deploy copies frontend/dist to site/app
```
## Requirements
- Rust stable (pinned via `rust-toolchain.toml`)
- Bun 1.3+
- Tauri platform prerequisites for desktop/mobile builds (Xcode CLT on macOS, WebView2 on Windows, `webkit2gtk` etc. on Linux)
Install the rest of the tooling (`wasm-pack`, `tauri-cli`, the WASM target, and frontend deps) in one shot:
```bash
bun run install-tools
```
## Development
All commands are exposed as Bun scripts in the root `package.json`. Inspect that file to see every available script.
```bash
bun run test # cargo test --workspace
bun run check:wasm # check WASM adapter against wasm32-unknown-unknown
bun run frontend:dev # Svelte/Vite PWA development server
bun run frontend:build # production PWA build
bun run frontend:e2e # Playwright end-to-end tests
bun run tauri:dev # Tauri desktop app
bun run all-checks # fmt + clippy + test + check:wasm + frontend test/build
```
Icons under `icons/web/` are the canonical PWA icon source. Vite serves them under `/icons/...` in dev and emits them to `dist/icons/...` at build time, so there is no separate copy to keep in sync.
Tauri mobile entrypoints are scaffolded through the standard Tauri CLI:
```bash
bun run android:init
bun run android:dev
bun run android:build
bun run ios:init
bun run ios:dev
bun run ios:build
```
## User Data Storage
- **Desktop / mobile**: a single `state.json` under the OS data directory (`ProjectDirs::data_dir()/state.json`), written atomically via a temp file + rename.
- **Web / PWA**: a single IndexedDB record in the `memory-pak` database, written debounced to coalesce rapid toggles.
## Export Format
```json
{
"version": "2.0",
"exportedAt": "2024-01-01T00:00:00Z",
"entries": [
{
"id": "console:nes",
"owned": true,
"favorite": false,
"wishlist": false,
"notes": "My original NES"
},
{
"id": "game:nes/super-mario-bros",
"owned": true,
"favorite": true,
"wishlist": false,
"notes": ""
}
]
}
```