logoSharoon S.

  • Home
  • Projects
  • Case Studies
  • About
  • ⌘ K or /
© 2026 - Made with by Sharoon.

Cool Care

Personal invoicing and business management app for an electrical and AC repair shop

Role

Solo Developer

Timeline

April 2026 – Present

Type

Full-stack Web Application

Status

Production

Technical Stack

frontend
SvelteKit 5
TypeScript
TypeScript
Tailwind CSS
Tailwind CSS
Shadcn Svelte
tailwind-variants
layerchart
backend
SvelteKit Form Actions
Drizzle ORM
database
Neon PostgreSQL
services
better-auth
Vercel
Vercel

Personal project — codebase not public

Cool Care
01 // Vision

Project Vision

Cool Care is a full invoicing and business management platform I built for my family's electrical and AC repair business in Islamabad. It covers the complete workflow — quotations, invoices, payments, customer tracking, and a customer portal. The dashboard surfaces business-critical KPIs like outstanding AR, overdue amounts, collected revenue, and quote conversion rates alongside a revenue chart and payment method breakdown. Customers receive a unique link on their receipt to view their own invoices and download PDFs without any login.

02 // Problem

The Friction

The business was managing invoices and customer records on paper or ad-hoc phone messages. There was no way to know who owed what, which invoices were overdue, or how much revenue had come in during a given period without manually flipping through paper. Customers had to call to check their invoice status. Payment methods like JazzCash and EasyPaisa (which the business actually uses) were not supported by typical invoicing software.

03 // Solution

The Strategy

A centralized full-stack platform built with SvelteKit 5, Drizzle ORM, and Neon PostgreSQL. The dashboard shows real-time KPIs — outstanding AR, overdue amounts, collected this month, and quote conversion rate — alongside a revenue chart and payment method breakdown. Invoices support partial payments and status progression (pending, partial, paid, overdue). Payments can be recorded as cash, JazzCash, EasyPaisa, or bank transfer. A customer portal provides token-based access so clients can view their invoices and download PDFs without any account setup.

04 // Features

Core Features

1

Dashboard with KPI grid covering outstanding AR, overdue amounts, collected this month, and quote conversion rate

2

Revenue chart with configurable time ranges (7d, 30d, 6m, custom) built with layerchart AreaChart

3

Payment method breakdown pie chart built with layerchart PieChart with interactive legend

4

Full invoice lifecycle: draft, pending, partial, paid, overdue, with status progression dialog

5

Multi-payment support per invoice with automatic balance tracking and status updates

6

Payment methods aligned with local usage: cash, JazzCash, EasyPaisa, bank transfer, custom

7

Sequential invoice numbering with zero-padded counters (001, 002…) stored in its own DB table with atomic upserts

8

Quotation management with one-click conversion to invoice

9

Customer management with active/inactive toggle and per-row loading states

10

Customer portal with token-based access — no login required, unique URL printed on each receipt

11

Callout component with 5 variants (info, success, warning, error, note) for contextual messaging

12

Reusable UI component library built with tailwind-variants: buttons, badges, dialogs, selects, inputs, tables, date pickers, skeleton loaders

13

Brutalist design system with fat borders (border-2), heavy shadows (brutal-shadow), and rounded corners (rounded-2xl/3xl)

05 // Hurdles

Hurdles & Breakthroughs

#1   Advance payment tracking using magic string matching

Resolution_Strategy

The original code identified advance payments by checking if payment notes contained specific text. I replaced this pattern with a proper isAdvance boolean column on the payments table, making queries explicit and eliminating the fragile string-matching logic across create, update, and convert routes.

#2   Sequential invoice numbering from random IDs

Resolution_Strategy

Invoices initially used random CUID2 IDs which looked unprofessional on printed receipts. I implemented a DB counter table with atomic upserts to generate sequential zero-padded numbers (001, 002…) so printed invoices look legitimate and are easy to reference.

#3   Customer portal without authentication

Resolution_Strategy

The portal needed to be accessible enough that a shop customer with minimal tech comfort could open a link and see their invoices. I used token-based access with a unique URL printed on their physical receipt instead of requiring login credentials. A data availability callout informs customers that invoices before the system cutover date are not available.

#4   Payment method alignment with local business needs

Resolution_Strategy

Most SaaS invoicing templates assume Stripe or credit card as payment methods. This business actually gets paid via JazzCash, EasyPaisa, cash, and bank transfer. I replaced the default 'online' method with these real options in the payment form, validation schema, and all queries.

06 // Impact

Final Outcome

Actively used for daily business operations. The platform replaced paper-based invoicing and ad-hoc phone communication for tracking customer dues. The dashboard gives the business owner immediate visibility into outstanding revenue, overdue accounts, and monthly collections without manual work.

07 // Reflection

Key Learnings

"Building something your own family uses daily is a different kind of pressure — you can't hand-wave edge cases because someone you know will hit them. The advance payment string-matching bug was a concrete lesson in why you should never encode business logic in human-readable text fields. SvelteKit 5's runes ($state, $derived, $props) are genuinely pleasant once you understand the mental model. The brutalist theme developed naturally from wanting every component to feel deliberate rather than default."
Contents
Got an idea? Let's turn it into something real
ssharoon166@gmail.com
Github
LinkedIn
Let's Talk