diff --git a/.agents/skills/caveman/SKILL.md b/.agents/skills/caveman/SKILL.md
new file mode 100644
index 0000000..4ebcea7
--- /dev/null
+++ b/.agents/skills/caveman/SKILL.md
@@ -0,0 +1,72 @@
+---
+name: caveman
+description: >
+ Ultra-compressed communication mode. Slash token usage ~75% by speaking like caveman
+ while keeping full technical accuracy. Use when user says "caveman mode", "talk like caveman",
+ "use caveman", "less tokens", "be brief", or invokes /caveman. Also auto-triggers
+ when token efficiency is requested.
+---
+
+# Caveman Mode
+
+## Core Rule
+
+Respond like smart caveman. Cut articles, filler, pleasantries. Keep all technical substance.
+
+## Grammar
+
+- Drop articles (a, an, the)
+- Drop filler (just, really, basically, actually, simply)
+- Drop pleasantries (sure, certainly, of course, happy to)
+- Short synonyms (big not extensive, fix not "implement a solution for")
+- No hedging (skip "it might be worth considering")
+- Fragments fine. No need full sentence
+- Technical terms stay exact. "Polymorphism" stays "polymorphism"
+- Code blocks unchanged. Caveman speak around code, not in code
+- Error messages quoted exact. Caveman only for explanation
+
+## Pattern
+
+```
+[thing] [action] [reason]. [next step].
+```
+
+Not:
+> Sure! I'd be happy to help you with that. The issue you're experiencing is likely caused by...
+
+Yes:
+> Bug in auth middleware. Token expiry check use `<` not `<=`. Fix:
+
+## Examples
+
+**User:** Why is my React component re-rendering?
+
+**Normal (69 tokens):** "The reason your React component is re-rendering is likely because you're creating a new object reference on each render cycle. When you pass an inline object as a prop, React's shallow comparison sees it as a different object every time, which triggers a re-render. I'd recommend using useMemo to memoize the object."
+
+**Caveman (19 tokens):** "New object ref each render. Inline object prop = new ref = re-render. Wrap in `useMemo`."
+
+---
+
+**User:** How do I set up a PostgreSQL connection pool?
+
+**Caveman:**
+```
+Use `pg` pool:
+```
+```js
+const pool = new Pool({
+ max: 20,
+ idleTimeoutMillis: 30000,
+ connectionTimeoutMillis: 2000,
+})
+```
+```
+max = concurrent connections. Keep under DB limit. idleTimeout kill stale conn.
+```
+
+## Boundaries
+
+- Code: write normal. Caveman English only
+- Git commits: normal
+- PR descriptions: normal
+- User say "stop caveman" or "normal mode": revert immediately
diff --git a/.cursor/rules/caveman.mdc b/.cursor/rules/caveman.mdc
new file mode 100644
index 0000000..fefb67c
--- /dev/null
+++ b/.cursor/rules/caveman.mdc
@@ -0,0 +1,76 @@
+---
+alwaysApply: true
+---
+
+---
+name: caveman
+description: >
+ Ultra-compressed communication mode. Slash token usage ~75% by speaking like caveman
+ while keeping full technical accuracy. Use when user says "caveman mode", "talk like caveman",
+ "use caveman", "less tokens", "be brief", or invokes /caveman. Also auto-triggers
+ when token efficiency is requested.
+---
+
+# Caveman Mode
+
+## Core Rule
+
+Respond like smart caveman. Cut articles, filler, pleasantries. Keep all technical substance.
+
+## Grammar
+
+- Drop articles (a, an, the)
+- Drop filler (just, really, basically, actually, simply)
+- Drop pleasantries (sure, certainly, of course, happy to)
+- Short synonyms (big not extensive, fix not "implement a solution for")
+- No hedging (skip "it might be worth considering")
+- Fragments fine. No need full sentence
+- Technical terms stay exact. "Polymorphism" stays "polymorphism"
+- Code blocks unchanged. Caveman speak around code, not in code
+- Error messages quoted exact. Caveman only for explanation
+
+## Pattern
+
+```
+[thing] [action] [reason]. [next step].
+```
+
+Not:
+> Sure! I'd be happy to help you with that. The issue you're experiencing is likely caused by...
+
+Yes:
+> Bug in auth middleware. Token expiry check use `<` not `<=`. Fix:
+
+## Examples
+
+**User:** Why is my React component re-rendering?
+
+**Normal (69 tokens):** "The reason your React component is re-rendering is likely because you're creating a new object reference on each render cycle. When you pass an inline object as a prop, React's shallow comparison sees it as a different object every time, which triggers a re-render. I'd recommend using useMemo to memoize the object."
+
+**Caveman (19 tokens):** "New object ref each render. Inline object prop = new ref = re-render. Wrap in `useMemo`."
+
+---
+
+**User:** How do I set up a PostgreSQL connection pool?
+
+**Caveman:**
+```
+Use `pg` pool:
+```
+```js
+const pool = new Pool({
+ max: 20,
+ idleTimeoutMillis: 30000,
+ connectionTimeoutMillis: 2000,
+})
+```
+```
+max = concurrent connections. Keep under DB limit. idleTimeout kill stale conn.
+```
+
+## Boundaries
+
+- Code: write normal. Caveman English only
+- Git commits: normal
+- PR descriptions: normal
+- User say "stop caveman" or "normal mode": revert immediately
diff --git a/README.md b/README.md
index f503a81..7d50ca2 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,8 @@
diff --git a/src/app/[locale]/about/page.tsx b/src/app/[locale]/about/page.tsx
index 429fb55..01e5550 100644
--- a/src/app/[locale]/about/page.tsx
+++ b/src/app/[locale]/about/page.tsx
@@ -266,7 +266,7 @@ function HeroSection() {
src={VIDEO_DEMO_URL}
posterImg={VIDEO_DEMO_FALLBACK_IMG}
testId="hero-about-page-video"
- description="How to create an invoice and download it as a PDF in Easy Invoice"
+ description="How to create and download an invoice as a PDF in EasyInvoicePDF.com"
/>
diff --git a/src/app/changelog/content/easy-invoice-pdf-launch.mdx b/src/app/changelog/content/easy-invoice-pdf-launch.mdx
index bf10c06..709c2a4 100644
--- a/src/app/changelog/content/easy-invoice-pdf-launch.mdx
+++ b/src/app/changelog/content/easy-invoice-pdf-launch.mdx
@@ -1,8 +1,8 @@
export const metadata = {
- title: "EasyInvoicePDF Launch - Free & Open-Source Invoice Generator",
+ title: "EasyInvoicePDF v1.0.0 - Free & Open-Source Invoice Generator",
description:
"Create professional invoices instantly with real-time preview and shareable links. No registration needed.",
- date: "2025-03-03",
+ date: "2025-11-19",
version: "1.0.0",
type: "major",
};
diff --git a/src/app/changelog/content/qr-codes-and-improvements.mdx b/src/app/changelog/content/qr-codes-and-improvements.mdx
index f4d4f57..c501f7e 100644
--- a/src/app/changelog/content/qr-codes-and-improvements.mdx
+++ b/src/app/changelog/content/qr-codes-and-improvements.mdx
@@ -1,6 +1,6 @@
export const metadata = {
title:
- "QR Code Support, Logo Upload for the Default Invoice Template and Many More",
+ "EasyInvoicePDF v1.0.2 - QR Code Support, Logo Upload for the Default Invoice Template and Many More",
description:
"QR code generation for invoices, logo upload for the default template, searchable currency combobox, and improved multi-page PDF support",
date: "2026-03-10",
@@ -13,8 +13,8 @@ export const metadata = {
## ✨ Highlights
- **QR code generation** for invoices with customizable descriptions and visibility toggles, supported in both default and Stripe templates
-- **Logo upload for the default invoice template** (previously available only in the Stripe template)
-- **Searchable currency combobox** with grouped categories, replacing the native dropdown for faster selection
+- **Logo upload for the default invoice template** add a logo to the default invoice template
+- **Searchable currency combobox** search by currency code, symbol, or name, grouped into categories replacing the native dropdown
- **Improved multi-page PDF support** with automatic pagination and page breaks
---
@@ -36,24 +36,6 @@ export const metadata = {
- Delete invoice item flow not working correctly
- Item name field validation too strict (now optional for flexibility)
-### What's Changed
-
-- feat: add QR code functionality to invoice templates and other improvements + bug fixes by @VladSez in [#165](https://github.com/VladSez/easy-invoice-pdf/pull/165)
-- improvement: update QR code images and enhance invoice template visuals by @VladSez in [#172](https://github.com/VladSez/easy-invoice-pdf/pull/172)
-- test: enhance URL verification in e2e tests for various pages by @VladSez in [#174](https://github.com/VladSez/easy-invoice-pdf/pull/174)
-- test: update navigation wait strategy in e2e tests for improved reliability by @VladSez in [#175](https://github.com/VladSez/easy-invoice-pdf/pull/175)
-- feat: update Playwright configuration and enhance e2e tests by @VladSez in [#176](https://github.com/VladSez/easy-invoice-pdf/pull/176)
-- chore: adjust Playwright configuration and e2e test settings for stability by @VladSez in [#177](https://github.com/VladSez/easy-invoice-pdf/pull/177)
-- chore: set timezone environment variable in e2e workflow to fix timezone issue in node js server env by @VladSez in [#178](https://github.com/VladSez/easy-invoice-pdf/pull/178)
-- docs: add Star History section to README and improve e2e test navigation strategy by @VladSez in [#179](https://github.com/VladSez/easy-invoice-pdf/pull/179)
-- fix: delete invoice item flow by @VladSez in [#180](https://github.com/VladSez/easy-invoice-pdf/pull/180)
-- fix: fix i18n issue with generating pdf via api + other improvements by @VladSez in [#181](https://github.com/VladSez/easy-invoice-pdf/pull/181)
-- refactor: rename item removal handler and enhance user feedback in invoice form by @VladSez in [#182](https://github.com/VladSez/easy-invoice-pdf/pull/182)
-- refactor: currency searchable combobox by @VladSez in [#183](https://github.com/VladSez/easy-invoice-pdf/pull/183)
-- feat: expand TODO list with discounts feature and improve e2e workflow by @VladSez in [#186](https://github.com/VladSez/easy-invoice-pdf/pull/186)
-- feat: upload logo for default invoice templates, improve add invoice btn styles, add more e2e tests by @VladSez in [#189](https://github.com/VladSez/easy-invoice-pdf/pull/189)
-- fix: update README logo and refactor invoice form for Stripe payment link by @VladSez in [#190](https://github.com/VladSez/easy-invoice-pdf/pull/190)
-
---
**Full Changelog**: [`EasyInvoicePDF-1.0.1...v1.0.2`](https://github.com/VladSez/easy-invoice-pdf/compare/EasyInvoicePDF-1.0.1...v1.0.2)
diff --git a/src/app/changelog/content/seller-buyer-improvements.mdx b/src/app/changelog/content/seller-buyer-improvements.mdx
index 9658c04..54c1dc2 100644
--- a/src/app/changelog/content/seller-buyer-improvements.mdx
+++ b/src/app/changelog/content/seller-buyer-improvements.mdx
@@ -1,5 +1,6 @@
export const metadata = {
- title: "Seller & Buyer Improvements, Email Visibility Toggle and More",
+ title:
+ "EasyInvoicePDF v1.0.3 - Email visibility toggle for seller and buyer, reworked seller/buyer sections, confirm dialog to discard changes, UX improvements",
description:
"Email visibility toggle for seller/buyer sections, reworked form layouts with locked-state banners, ConfirmDiscardDialog, and auto-scroll on mobile",
date: "2026-03-29",
@@ -9,11 +10,11 @@ export const metadata = {
## ✨ Highlights
-- **Email visibility toggle** for seller and buyer sections — control whether the email address appears in the generated PDF
+- **Seller & Buyer Email visibility toggle** — control whether the email address appears in the generated PDF
- **`ConfirmDiscardDialog`** component to warn users about unsaved changes when closing the buyer/seller dialogs
- **Reworked seller and buyer information form sections** with improved layout, locked-state banners, and cleaner field grouping
- **Auto-scroll the invoice form on mobile** when switching between tabs (UX improvement)
-- **Out-of-Date dates helper** improved with more accurate state detection
+- **Out-of-Date dates helper** shows outdated fields and provides a button to update all dates at once