This major update introduces several significant new features, critical bug fixes, and key enhancements across the application, focusing on user customization, administration, and system stability. New Features Currency Position Control: Allows users to choose whether the currency symbol appears on the left or right of numbers. This setting is applied universally across the app, including warranty cards and forms, and is saved per-user. Super-Admin (Owner) Role: Implements an immutable Owner role for the primary administrator, who cannot be deleted or demoted. A secure ownership transfer process has been added to the admin settings. OIDC-Only Login Mode: Adds a site-wide setting to enforce OIDC-only authentication, which hides the traditional username/password login form to streamline SSO environments. Product Age Tracking & Sorting: Displays the age of a product (e.g., "2 years, 3 months") on warranty cards and adds a new "Sort by Age" option to organize items by their purchase date. Global View Photo Access: Permits users to view product photos on warranties shared in global view, while ensuring other sensitive documents like invoices remain private to the owner. Persistent View Scope: The application now remembers the user's last selected view (Global or Personal) and automatically loads the appropriate data on page refresh for a seamless experience. Export Debug Tools: Introduces a comprehensive debugging system, including a new debug page and API endpoint, to help administrators troubleshoot and verify warranty exports. Key Enhancements About Page Redesign: A complete visual overhaul of the "About" page with a modern, card-based layout, prominent community links, and improved branding. Flexible Apprise Notifications: Admins can now configure Apprise notifications to be a single global summary or sent as per-user messages. Additionally, the scope can be set to include warranties from all users or only the admin's warranties. Larger Product Photo Thumbnails: Increased the size of product photo thumbnails in all views (grid, list, and table) for better product visibility. Smart Currency Default: The "Add Warranty" form now intelligently defaults to the user's preferred currency setting, rather than always using USD. Bug Fixes Critical OIDC & Proxy Fixes: Resolved two major OIDC issues: a RecursionError with gevent workers and incorrect http:// callback URLs when behind an HTTPS reverse proxy, enabling reliable OIDC login. Critical User Preferences Persistence: Fixed a bug where user settings for currency symbol and date format were not being saved correctly to the database. Apprise & Notification Settings: Corrected an issue preventing user notification channel and Apprise timing settings from saving. The Apprise message format is now standardized, and the admin UI has been cleaned up. CSV Import Currency: Ensured that warranties imported via CSV correctly use the user's preferred currency instead of defaulting to USD. Maintenance & Refactoring Authentication System Refactoring: Migrated all authentication-related routes from app.py into a dedicated Flask Blueprint (auth_routes.py) to improve code organization and maintainability. Legacy Code Cleanup: Removed over 290 lines of orphaned and commented-out legacy OIDC code from the main application file.
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, notes, and product photos with thumbnail previews.
- Document Storage: Upload receipts, invoices, and manuals securely.
- Proactive Alerts: Receive configurable notifications for upcoming expirations via email and/or 100+ push notification services (e.g., Discord, Slack, Telegram) powered by Apprise integration.
- Quick Search and Filter: Find warranties by product name, serial number, vendor, tags, warranty type, or notes with case-insensitive filtering and real-time sorting.
- Multiple serial numbers: Add multiple serial numbers on one product.
- Global Warranty View: All authenticated users can now view warranties across the entire user base with appropriate read-only or edit permissions; admins retain full control.
- Multi-User Support: Create multiple user accounts with advanced admin controls, including toggles for site-wide global view access.
- Data Export/Import: Export to CSV or import from CSV files for easy data portability.
- Customizable Settings: Adjust currency symbols, date formats, and notification preferences including notification timing and branding.
- Tagging: Organize warranties flexibly with tags for easy categorization.
- Password Reset: Secure, token-based account recovery system.
- OIDC Single Sign-On (SSO): Seamlessly log in using identity providers like Google, GitHub, or Keycloak.
- Status Dashboard with Global View: Monitor warranty statistics and analytics for your account or all users (for eligible roles), with charts and detailed tables.
- Responsive and Enhanced UI: Modern, mobile-friendly interfaces with improved tooltips, admin controls.
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
- ✅ OIDC SSO Functionality
- Warranty Claim Tracking
- Calendar Integration
- Advanced User/Admin Controls
- Localization Support
🚀Setup
Prerequisites
- Docker and Docker Compose installed on your system.
🐋Pull Docker
services:
warracker:
image: ghcr.io/sassanix/warracker/main:latest
ports:
- "8005:80"
volumes:
- warracker_uploads:/data/uploads
env_file:
- .env
depends_on:
warrackerdb:
condition: service_healthy
restart: unless-stopped
warrackerdb:
image: postgres:15-alpine
volumes:
- postgres_data:/var/lib/postgresql/data
env_file:
- .env
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 with environemts and .env example for warracker and the warrackerdb 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. |
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:
Join Our Community
Want to discuss the project or need help? Join our Discord community!
📜License
This project is licensed under the GNU Affero General Public License v3.0 - see the LICENSE file for details.
🙏Acknowledgements
- Flask
- PostgreSQL
- Docker
- Chart.js
- Apprise
