Pocket Change Showdown: The Penny-Pincher's Paradise
Feck yeah! It's time to tackle your moving expenses with a dash of style and a whole lot of sass! π°
Hey look, there's more Flair than a corporate drone with a Monday morning hangover!






Think you're bad at managing expenses? Ah, quit your whining. We've got everything: sassy Features β’ super-speed Quick Start β’ hassle-free Installation β’ wordy Documentation β’ places to rant... I mean, Contributing!
π Table of Contents
- What Features?
 - Screenshots β Because Who Reads?
 - Quick Start β No, Really, Itβs Quick
 - Slog through Installation
 - Mess About with Configuration
 - Usage - Whatβs the Point?
 - Guff About API Documentation
 - What Matters in Development?
 - Contributing - Your Turn to Bitch
 - License - Free Stuff's Always Good
 
β¨ Features
Core Functionality
- πΈ Receipt Management - Store craploads of receipts. We dare you.
 - π³ Multiple Payment Methods - We track whether you spent cash, credit, IOUs, or favors.
 - π·οΈ Smart Categorization - Keep your spending habits smart and snarky.
 - π Analytics Dashboard - Like looking at a magic crystal ball of shame.
 - π¨ 8 Color Themes - Because your expenses can't be as drab as your personality.
 - π± Mobile Responsive - Track on the go, from your phone or hell, a potato.
 - π No Login Required - No strings attached, like that one-night stand.
 
Data Management
- π₯ CSV Import - Bring the madness of an Excel sheet to a whole new level.
 - π€ CSV Export - Send your data on a field trip!
 - π Template Download - Look, Ma! Iβm organized.
 - πΎ Persistent Storage - Data that laughs in the face of restarts.
 
PCS-Specific Categories
- π Moving
 - βοΈ Travel
 - π Housing
 - π¦ Storage
 - π Transportation
 - π¨ Lodging
 - π Food
 - π¦ Supplies
 - ποΈ Services
 - β Make up your own crap!
 
πΈ Screenshots
Sample PDF
Donβt just stand there, gawk! pdf_sample.pdf
π Quick Start
Docker (Recommended)
# Unleash the Kraken with the latest image docker run -d \ --name pcs-tracker \ -p 5001:5001 \ -v pcs-data:/app/data \ -v pcs-uploads:/app/uploads \ tebwritescode/pocket-change-showdown:latest # Chuckle maniacally at http://localhost:5001
Docker Compose
# Phone-up Chuck Norris: "We're cloning a repo" git clone https://github.com/tebwritescode/pocket-change-showdown.git cd pocket-change-showdown # Compose your mess with Docker Compose docker-compose up -d # Dance your way to http://localhost:5001
π¦ Installation
Docker
Recognizing All Sorts
Because compatibility is key, unless it isn't!
# Pull for your peculiar machine docker pull --platform linux/arm64 tebwritescode/pocket-change-showdown:latest # Or let Docker rub its chin and decide docker pull tebwritescode/pocket-change-showdown:latest
Docker Run Degeneracy
# Deploy it, Captain docker run -d \ --name pcs-tracker \ -p 5001:5001 \ tebwritescode/pocket-change-showdown:latest # Make it last longer than a baking lesson docker run -d \ --name pcs-tracker \ -p 5001:5001 \ -v $(pwd)/data:/app/data \ -v $(pwd)/uploads:/app/uploads \ tebwritescode/pocket-change-showdown:latest # Secret sauce for the discerning chef docker run -d \ --name pcs-tracker \ -p 5001:5001 \ -e SECRET_KEY="your-secret-key-here" \ -e FLASK_ENV="production" \ -v pcs-data:/app/data \ -v pcs-uploads:/app/uploads \ tebwritescode/pocket-change-showdown:latest
Kubernetes
# Manifest your destiny, or just the code kubectl apply -f k8s/ # Or one by bloody one kubectl apply -f k8s/namespace.yaml kubectl apply -f k8s/secret.yaml kubectl apply -f k8s/pvc.yaml kubectl apply -f k8s/deployment.yaml kubectl apply -f k8s/service.yaml kubectl apply -f k8s/ingress.yaml # Optional, like an appendix # Check if your stuff's intact kubectl get all -n pcs-tracker # If it worked, buy yourself a drink at http://<node-ip>:30001
Kubernetes Thingamabobs
- Persistent Volumes - Turns out you donβt need to webscrape for dataβit sticks around.
 - Health Checks - It only mostly dies.
 - Resource Limits - So demanding!
 - Multi-Service - Load balance like a tightrope walker.
 - Ingress Ready - Fancy domain? Me too.
 
Local Development
# Kiss the clouds goodbye git clone https://github.com/tebwritescode/pocket-change-showdown.git cd pocket-change-showdown # Create a virtual haven python3 -m venv venv source venv/bin/activate # Unload a bag of dependencies pip install -r requirements.txt # Go-Go-Gadget application python app.py # Channel your inner regulator at http://localhost:5001
βοΈ Configuration
Environment Variables
| Variable | Description | Default | 
|---|---|---|
SECRET_KEY | 
SMERSH-level deception sessions key | pcs-secret-key-2024 | 
FLASK_ENV | 
Sneaky environment mood | production | 
DATABASE_URL | 
Alchemize this: your database | sqlite:///data/pcs_tracker.db | 
MAX_CONTENT_LENGTH | 
Maximum cr-p (content) upload size | 16777216 (16MB) | 
Data Persistence
To make data hang around like a bad smell:
/app/data- SQLite domicile/app/uploads- Receipts chill as BLOBs
π± Usage
Tossin' Pennies - Adding Expenses
- Sing "Add Expense!" from any rooftop or just click it
 - Wake up from title-only dream
 - Attach facepalming receipts (optional)
 - Ceremoniously hit "Save"
 
Inflicting Data - Importing
- Explore Import/Export β Import CSV
 - Don shiny template armor
 - Be daVinci, fill your masterpiece
 - Blast off with CSV sere-naah-de
 
Cheese-Cutting Format
csv Date,Title,Description,Category,Cost,Payment Method,Location,Vendor,Notes,Tags 2024-01-15,Moving Truck,U-Haul rental,Moving,299.99,Credit Card,Downtown,U-Haul,26ft truck,moving 2024-01-16,Hotel Stay,Overnight stay,Lodging,125.00,Company Card,Holiday Inn,Holiday Inn,1 night,travel
Manipulating Categories & Payment Methods
- Go where no wo/man has deemed necessary: Settings
 - Cust-omize your little heart out
 - Create methods even mad scientists couldnβt
 - Marry whimsy: color themes purr with indulgence
 
Accidental Analytics Dashboard
- Scorn last week, guilt-trip for next: from nanosecond to year
 - See-spend scenario via doughnut dive
 - Payment method squabbles (Bar chart showdown)
 - Dailies take you on the trend train (Line chart)
 - Top dog categories, percentages & flaunting aplenty
 
π API Guff
Endpoints
| Method | Endpoint | Quirky Description | 
|---|---|---|
| GET | / | 
Home sweet home(wrecker) | 
| GET | /expenses | 
Expense expedition | 
| GET/POST | /expense/new | 
New expense enlightenment | 
| GET/POST | /expense/<id>/edit | 
Edit the unavoidable | 
| POST | /expense/<id>/delete | 
PURGE! | 
| GET | /expense/<id>/receipt | 
Picture-perception | 
| GET | /dashboard | 
Analytical nincompoopery | 
| GET | /api/expense_data | 
JSON chateria | 
| GET/POST | /settings | 
Mischief management | 
| POST | /settings/category/add | 
Go rogue - add category | 
| POST | /settings/payment/add | 
Payment etiquette upgrade | 
| GET | /export | 
CSV in Wonderland | 
| GET/POST | /import | 
CSV Carousel | 
| GET | /template | 
CSV preface nobility | 
API Response Satire
GET /api/expense_data?period=month { "categories": { "labels": ["Moving", "Travel", "Housing"], "data": [1250.50, 890.25, 2100.00] }, "payment_methods": { "labels": ["Credit Card", "Cash", "Company Card"], "data": [3500.75, 450.00, 290.00] }, "daily_trend": { "labels": ["2024-01-01", "2024-01-02"], "data": [125.50, 340.25] } }
π οΈ Development - Why Bother?
Tech Stack
- Backend: Flask, spicy SQLAlchemy
 - Frontend: Bootstrap, Chart.js, Font Awesome (a peacock)
 - Database: SQLite: SQLAlchemy Sings
 - File Storage: Database belly storage
 - Deployment: Orchestrations with Docker, Kubernetes & Gunicorn bravado
 
Structure of Madness
pocket-change-showdown/ βββ app.py # App-worthy babel βββ requirements.txt # Dependency lug βββ Dockerfile # Docker concoction βββ docker-compose.yml # Docker squad βββ templates/ # HTML insidiousness β βββ base.html # The totally base β βββ index.html # Page of presents β βββ expenses.html # Expense paradox β βββ expense_form.html # Input vs Reality β βββ dashboard.html # Chase your shame β βββ settings.html # Hangover fixes β βββ import.html # CSV courtship βββ k8s/ # Kubernetes enigma β βββ namespace.yaml β βββ secret.yaml β βββ pvc.yaml β βββ deployment.yaml β βββ service.yaml β βββ ingress.yaml βββ data/ # Runtime ingenuity
Born from Code
# Glayvin! Build me this Docker monstrosity docker build -t pcs-tracker . # Partake in fetching multi-arch wonders docker buildx build \ --platform linux/amd64,linux/arm64,linux/arm/v7 \ -t tebwritescode/pocket-change-showdown:latest \ --push .
The Flat Schema (Non-Skiable)
-- Ground Zero table for expense CREATE TABLE expense ( id INTEGER, title VARCHAR(200), description TEXT, category_id INTEGER, cost FLOAT, payment_method_id INTEGER, date DATE, receipt_image BLOB, receipt_filename VARCHAR(200), location VARCHAR(200), vendor VARCHAR(200), notes TEXT, tags VARCHAR(500), created_at DATETIME, updated_at DATETIME, PRIMARY KEY (id) ); -- Column of categorization CREATE TABLE category ( id INTEGER, name VARCHAR(100), color VARCHAR(7), icon VARCHAR(50), is_default BOOLEAN, PRIMARY KEY (id) ); -- Noteworthy payment table CREATE TABLE payment_method ( id INTEGER, name VARCHAR(100), icon VARCHAR(50), is_default BOOLEAN, PRIMARY KEY (id) ); -- Settings booth CREATE TABLE settings ( id INTEGER, color_scheme VARCHAR(50), default_view VARCHAR(20), PRIMARY KEY (id) );
π License - Go Forth and Conquer!
This project is merrily open source and blissfully up for grabs under the MIT License.
π Cheers & Acknowledgments
- Built under the spell of Flask and Bootstrap
 - Charts magicked by Chart.js
 - Icons with Font Awesome - Awe as your own
 
π Screech for Help
For tirades, discontent, or amusing suggestions:
- Holler on GitHub Issues
 - Vent thoroughly in GitHub Discussions
 
**P**ocket **C**hange **S**howdown - Because tracking every penny is nothing short of glorious insanity!