Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

CodeByMAB/StackTrack

Repository files navigation

🟑 StackTrack

Track your dreams. One sat at a time.
A privacy-first Bitcoin wishlist tracker, built for sovereignty and simplicity.
Denominated in sats. Powered by NOSTR. Runs offline.


πŸš€ Features

  • 🧾 Add wishlist items priced in fiat, auto-converted to sats
  • πŸ” Login with NOSTR β€” no email, no passwords
  • 🌐 Works offline-first with localStorage caching
  • πŸ“Š Bitcoin price fetched via Block's Bitcoin Treasury API
  • πŸŒ“ Light and dark modes with full responsiveness
  • πŸ“‚ Organize items by category: Home, Car, Gear, Dream, Misc
  • 🧼 Zero trackers, zero ads β€” just your stack and your goals

🧱 Tech Stack

  • βš›οΈ React 19 + TypeScript
  • ⚑ Vite 6
  • 🎨 Chakra UI
  • 🟑 NOSTR (via NDK)
  • πŸ“ˆ Block API (price data)
  • πŸ”’ LocalStorage (offline + privacy-respecting)

πŸ“¦ Getting Started

# Clone the repo
git clone https://github.com/CodeByMAB/StackTrack.git
cd StackTrack
# Install dependencies
npm install
# Start development server
npm run dev
# Build for production
npm run build

πŸ§ͺ Offline + Testing

You can test offline functionality and login simulation directly from your browser:

πŸ”§ Create Dummy Login

const dummyPubkey = "npub1" + Array.from({length: 30}, () => 
 "0123456789abcdef"[Math.floor(Math.random() * 16)]).join('');
const dummyProfile = {
 name: "Test Stacker",
 about: "This is a test account for StackTrack development",
 picture: "https://api.dicebear.com/7.x/bottts/svg?seed=stacktrack"
};
localStorage.setItem('nostr_pubkey', dummyPubkey);
localStorage.setItem('nostr_profile', JSON.stringify(dummyProfile));
console.log('Test login created! Refresh the page to use it.');

πŸ’Έ Set Dummy Bitcoin Price

localStorage.setItem('stacktrack_bitcoin_price', JSON.stringify({
 usd: 62345.78,
 timestamp: Date.now() - 1000 * 60 * 20 // 20 minutes ago (expired)
}));
console.log('Dummy bitcoin price set in localStorage');

πŸ›‘οΈ Security Philosophy

  • Your keys are never stored
  • Only public data (like npub and avatar URL) are saved locally
  • All data is stored client-side, with no backend required
  • Input is sanitized to prevent XSS and malicious injection
  • Offline-first = minimal network exposure

πŸ“Έ Screenshots

🏠 Home Page

Home Page - Light Mode Home Page - Dark Mode Home Page - Login Modal

πŸ“Š Dashboard

Dashboard - Dark Mode Dashboard - Add Item Modal Dashboard - Edit Item Modal


🀝 Contributing

PRs welcome! Open an issue, fork the repo, and help us build the wishlist stacker Bitcoiners deserve.


πŸ“ License

MIT


Built for Bitcoiners. Powered by open-source.
NOSTR in. Fiat out. Stack on. ⚑

About

Progressive Web App for a savings app (in Bitcoin) based on real-time prices for things you want to save for.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

Contributors

Languages

AltStyle γ«γ‚ˆγ£γ¦ε€‰ζ›γ•γ‚ŒγŸγƒšγƒΌγ‚Έ (->γ‚ͺγƒͺγ‚ΈγƒŠγƒ«) /