This update introduces comprehensive OpenID Connect (OIDC) Single Sign-On support with dynamic configuration via the database and full frontend/backend integration. Key additions include: - OIDC SSO login via external providers (e.g., Google, Keycloak), with automatic user provisioning and session linking. - Admin settings UI for enabling/disabling SSO and managing provider credentials. - Provider-branded SSO buttons with dynamic labels, icons, and styles. - Exact warranty expiration date support alongside duration-based input, with full validation and UI enhancements. - Full UI responsiveness for warranty field updates, tag creation, and note editing. - Memory usage optimization for low-resource deployments via configurable modes (optimized, ultra-light, performance). - Numerous fixes for SSO authentication flow, UI sync issues, database constraints, and modal interactions. - Upgraded dependencies for security, performance, and compatibility (Flask 3.0.3, Gunicorn 23.0.0, etc.). - Frontend improvements: Chart.js loading fix, tooltips for long product names, and dark/light mode-compatible footer. This release significantly improves authentication flexibility, performance, and user experience across all major components.
Warracker
Open-source warranty tracker for individuals and teams.
The easiest way to organize product warranties, monitor expiration dates, and store receipts or related documents.
🌟Overview
Warracker is a web-based application that simplifies the management of product warranties. It allows users to organize warranty information, monitor expiration dates, and securely store related documents.
Features
- Centralized Management: Track all your product warranties in one place.
- Detailed Records: Store purchase dates, durations, and notes.
- Document Storage: Upload receipts, invoices, and manuals.
- Proactive Alerts: Receive notifications for upcoming expirations.
- Quick Search and Filter: Find warranties by product name, serial number, vendor, tags, or notes.
- Multi-User Support: Create multiple user accounts with admin controls.
- Data Export/Import: Export to CSV or import from CSV files.
- Email Notifications: Get timely reminders about expirations.
- Customizable Settings: Adjust currency symbols and date formats.
- Tagging: Organize warranties with flexible tags.
- Password Reset: Secure, token-based account recovery.
Project Status
Warracker is in active beta. The essential features are reliable and ready for everyday use. Development is ongoing, with regular updates and improvements.
- ✅ Stable core for tracking, notification , and managing warranty documents, files
- ✅ Full support for self-hosted deployments
- ⚒️ Advanced enhancements are still being worked on
- ✍️ Your feedback and bug reports help shape the future of the app
Screenshots
Home Page
Status Dashboard
Technology Stack
- Frontend: HTML, CSS, JavaScript
- Backend: Python with Flask
- Database: PostgreSQL
- Containerization: Docker and Docker Compose
- Web Server: Nginx
Roadmap
- ✅ User Authentication
- ✅ Settings Page
- ✅ Status Page
- ✅ Customizable Reminders
- ✅ Email Notifications
- ✅ Warranty Categories via Tags
- ✅ CSV Import/Export
- Warranty Claim Tracking
- Calendar Integration
- OIDC SSO Functionality
- Advanced User/Admin Controls
- Localization Support
Setup
Prerequisites
- Docker and Docker Compose installed on your system.
- Git (for cloning the repository).
Fresh Installation
- Clone the repository:
git clone https://github.com/sassanix/Warracker.git - Navigate to the project directory:
cd Warracker - Start the application using Docker:
docker compose up
Updating from a Previous Version
-
Pull the latest changes:
git pull origin main -
Rebuild and restart the containers:
docker compose down docker compose up --build -
Access the Application:
Open your browser and navigate to
http://localhost:8005.
🐋Pull Docker
services:
warracker:
image: ghcr.io/sassanix/warracker/main:latest
ports:
- "8005:80"
volumes:
- warracker_uploads:/data/uploads
environment:
- DB_HOST=warrackerdb
- DB_NAME=warranty_db
- DB_USER=warranty_user
- DB_PASSWORD=${DB_PASSWORD:-warranty_password}
- SMTP_HOST=smtp.email.com
- SMTP_PORT=465
- SMTP_USERNAME=youremail@email.com
- SMTP_PASSWORD=password
- SECRET_KEY=${APP_SECRET_KEY:-your_strong_default_secret_key_here}
- MAX_UPLOAD_MB=32 # Example: Set max upload size to 32MB
- NGINX_MAX_BODY_SIZE_VALUE=32M # For Nginx, ensure this matches MAX_UPLOAD_MB in concept (e.g., 32M)
# - FLASK_DEBUG=0
depends_on:
warrackerdb:
condition: service_healthy
restart: unless-stopped
warrackerdb:
image: postgres:15-alpine
volumes:
- postgres_data:/var/lib/postgresql/data
environment:
- POSTGRES_DB=warranty_db
- POSTGRES_USER=warranty_user
- POSTGRES_PASSWORD=${DB_PASSWORD:-warranty_password}
restart: unless-stopped
healthcheck:
test: ["CMD-SHELL", "pg_isready -U $$POSTGRES_USER -d $$POSTGRES_DB"]
interval: 5s
timeout: 5s
retries: 5
volumes:
postgres_data:
warracker_uploads:
To get the docker compose file please go here
Usage
Adding a Warranty
- Fill in the product details by clicking on add warranty.
- Enter the purchase date and warranty duration.
- Optionally upload receipt/documentation.
- Click the "Add Warranty" button.
Managing Warranties
- Use the search box to filter warranties.
- Click the edit icon to modify warranty details.
- Click the delete icon to remove a warranty.
Product Information Entry Requirements for CSV import
| Field Name | Format / Example | Required? | Notes |
|---|---|---|---|
| ProductName | Text | ✅ Yes | Provide the name of the product. |
| PurchaseDate | Date (YYYY-MM-DD, e.g., 2024-05-21) |
✅ Yes | Use ISO format only. |
| WarrantyDurationYears | Whole Number (0, 1, 5) |
✅ Yes, if IsLifetime is FALSE and Months/Days are 0/blank. At least one duration field (Years, Months, Days) must be non-zero if not lifetime. |
Represents the years part of the warranty. Can be combined with Months and Days. |
| WarrantyDurationMonths | Whole Number (0, 6, 18) |
✅ Yes, if IsLifetime is FALSE and Years/Days are 0/blank. At least one duration field (Years, Months, Days) must be non-zero if not lifetime. |
Represents the months part of the warranty. Can be combined with Years and Days. Max 11 if Years also provided. |
| WarrantyDurationDays | Whole Number (0, 15, 90) |
✅ Yes, if IsLifetime is FALSE and Years/Months are 0/blank. At least one duration field (Years, Months, Days) must be non-zero if not lifetime. |
Represents the days part of the warranty. Can be combined with Years and Months. Max 29/30 if Months also provided. |
| IsLifetime | TRUE or FALSE (case-insensitive) |
❌ No (Optional) | If omitted, defaults to FALSE. If TRUE, duration fields are ignored. |
| PurchasePrice | Number (199.99, 50) |
❌ No (Optional) | Cannot be negative if provided. |
| SerialNumber | Text (SN123, SN123,SN456) |
❌ No (Optional) | For multiple values, separate with commas. |
| ProductURL | Text (URL format) | ❌ No (Optional) | Full URL to product page (optional field). https://producturl.com |
| Vendor | Text | ❌ No (Optional) | Name of the vendor or seller where the product was purchased. |
| Tags | Text (tag1,tag2) |
❌ No (Optional) | Use comma-separated values for multiple tags. |
Development
Local Development Environment
-
Clone the repository.
-
Make your changes.
-
Build and run with Docker Compose:
docker-compose build docker-compose up -d
Why I Built This
Warracker was born from personal frustration with warranty confusion. When my father’s dishwasher broke, we had the invoice and assumed it was under warranty, only to find out we were referencing the wrong one, and the warranty had ended by a couple of months.
That experience, along with others like it, made me realize how common and avoidable these issues are. So I built Warracker, a simple, organized way to track purchases, receipts, and warranties. It has already saved me money by reminding me to get car repairs done before my warranty expired.
Inspired by Wallos, I wanted to bring the same clarity to warranties that it brought to subscriptions and share it with anyone who's ever been burned by missed coverage.
Contributing
We welcome contributions and appreciate your interest in improving this project! To get started, please follow these steps:
How to Contribute
- Fork the repository.
- Create a branch for your changes:
git checkout -b feature/amazing-feature - Commit your changes:
git commit -m "Add: amazing feature" - Push to your forked repository:
git push origin feature/amazing-feature - Open a Pull Request with a clear explanation of your changes.
Contribution Guidelines
- Start with an issue: Before submitting a Pull Request, ensure the change has been discussed in an issue.
- Help is welcome: Check the issues for open discussions or areas where help is needed.
- Keep it focused: Each Pull Request should focus on a single change or feature.
- Follow project style: Match the project's code style and naming conventions.
- Be respectful: We value inclusive and constructive collaboration.
🤝 Contributors:
❤️ Supporters:
License
This project is licensed under the GNU Affero General Public License v3.0 - see the LICENSE file for details.
Acknowledgements
- Flask
- PostgreSQL
- Docker
