No description
- TypeScript 99.5%
- CSS 0.3%
- HTML 0.1%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
| client | ||
| server | ||
| .dockerignore | ||
| .env.example | ||
| .gitignore | ||
| docker-compose.prod.yml | ||
| docker-compose.yml | ||
| LICENSE | ||
| package-lock.json | ||
| package.json | ||
| README.md | ||
Nahalo Vault 🛡️
A self-hosted Magic: The Gathering card collection manager, visual tactical deck builder, Scryfall explorer, and TradePost Hub built for collectors, players, and local trade groups.
✨ Features
📦 Collection & Binder Vault
- Grid, Binder, & Table Views: High-res imagery, foil badges, finish indicators, and quantity badges.
- Binder Organization & Set Completion Matrix: Assign custom binders with target MTG Set and Bonus Sheet tracking (e.g.
BLB,SPG). - Multi-Format CSV & Text Importer: One-click import for ManaBox CSV, Moxfield, DelverLens, MTG Arena, and Plain Text.
- Portfolio Financials: Real-time market valuation in USD ($) and EUR (€) using Scryfall market pricing.
- Condition & Printing Management: Easily switch card printings, art variants, foils, and language editions.
⚔️ Visual Deck Builder
- Format Support: Commander / EDH, Standard, Modern, Pioneer, Legacy, Vintage, and Pauper.
- Analytics & Mana Visualizer: Live Mana Curve, Color Identity breakdown, card type distribution, and Commander-specific financial totals.
- Playtesting Simulator: 7-Card opening hand and mulligan testing suite.
- Precon Library: Instant pre-constructed deck loader backed by PostgreSQL JSONB storage.
- Multi-Format Deck Export: 1-click export and file download for MTG Arena, MTGO (.dec), Plain Text, and CSV.
🤝 TradePost & Public Sharing
- Want / Have Exchange Matrix: Track trade-in and want lists with live market values.
- Public Shareable Showcase Links: Generate isolated, cryptographically unguessable public URLs (
/share/:type/:token) for wishlists, tradelists, binders, or constructed decks. - Security Isolation: Public visitors access sanitized read-only views with zero internal credential or database visibility.
🔔 Price Alerts & Market Watcher
- Multi-Marketplace Alerts: Monitor price dips across TCGPlayer, Cardmarket, ManaPool, CardKingdom, and eBay.
- Automated Scanning & SMTP: Background price checking with instant email notifications when targets hit.
🛡️ Security, Audit Trail & Control Panel
- Master Password Security: BCrypt password hashing, session versioning, and auto-generated persisted JWT secrets.
- Comprehensive Audit Trail: Real-time logging of authentication events, collection mutations, binder changes, deck updates, and public link access.
- Scryfall Bulk Data & Offline Image Cache: Download sets for offline high-res image serving with disk telemetry and cache purge tools.
- Automated Scheduled Backups: Recurring database backup snapshots stored to disk or manual browser export.
🚀 Quick Start (Production Docker)
The easiest way to run Nahalo Vault in production is using Docker Compose:
1. Clone & Configure Environment
git clone https://forge.nahalopagus.cc/przemchess/nahalo-vault.git
cd nahalo-vault
cp .env.example .env
Edit .env to set your desired POSTGRES_PASSWORD and host port APP_PORT (default 5175).
2. Launch the Production Stack
docker compose -f docker-compose.prod.yml up -d --build
- Web App: http://localhost:5175 (or your configured
APP_PORT) - Backend API: Proxied internally by Nginx to Node.js runtime
🛠️ Local Development
Prerequisites
- Node.js 20+
- PostgreSQL 16+ (or run via
docker compose -f docker-compose.dev.yml up db -d)
1. Install Dependencies
npm install
npm --prefix server install
npm --prefix client install
2. Push Database Schema
npm --prefix server run db:push
3. Start Development Servers
npm run dev
- Client runs on
http://localhost:5175 - Backend API runs on
http://localhost:3005
⚙️ Environment Configuration (.env)
| Variable | Description | Default |
|---|---|---|
APP_PORT |
Host port exposed for web app | 5175 |
NODE_ENV |
Environment mode (production / development) |
production |
POSTGRES_USER |
Database username | postgres |
POSTGRES_PASSWORD |
Database password | postgres |
POSTGRES_DB |
Database name | mtg_vault |
CLIENT_URL |
Public origin URL for reverse proxy routing | http://localhost:5175 |
ALLOWED_ORIGINS |
Comma-separated list of allowed CORS origins | http://localhost:5175,http://localhost:80 |
JWT_SECRET |
(Optional) Pre-defined 64-character JWT secret | Auto-generated in DB |
VAULT_MASTER_PASSWORD |
(Optional) Pre-configured master password fallback | Configured on first launch |
📜 License & Disclaimers
License
This project is open source under the MIT License.
Wizards of the Coast Fan Content Policy
Nahalo Vault is unofficial Fan Content permitted under the Wizards of the Coast Fan Content Policy. Portions of the materials used are property of Wizards of the Coast. © Wizards of the Coast LLC.
Scryfall Attribution
Card data, prices, imagery, and mana symbols are powered by the Scryfall API. Scryfall is not affiliated with this project.