Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
92 commits
Select commit Hold shift + click to select a range
114f1c1
feat(updater): accurate download progress with rolling-window speed
Apr 25, 2026
1b7d4b9
feat(updater): route toast Download to Settings, show speed/ETA
Apr 25, 2026
d1807f4
fix(updater): auto-check timer survives StrictMode double-invoke
Apr 25, 2026
2866642
feat(updater): expand release notes into a modal
Apr 25, 2026
d197e3c
feat(updater): cancel an in-flight download
Apr 25, 2026
b2d1823
linted and tested
Apr 25, 2026
3f48aa2
lock file updated
Apr 25, 2026
879eb98
Merge pull request #128 from logical-mechanism/feature/update-toast-d…
logicalmechanism Apr 25, 2026
0c26980
feat(activity): add backend /api/chain/activity/:pkh endpoint
Apr 25, 2026
97e0345
feat(activity): add send/receive transaction types to history
Apr 25, 2026
d126bf1
feat(activity): merge wallet activity into the History tab
Apr 25, 2026
ca462d3
fix(activity): include wallet activity in the manual refresh path
Apr 25, 2026
d882c73
fix(activity,dev): bundle:be on run.sh startup; don't cache empty res…
Apr 25, 2026
a01382d
fix(history,activity): read tx_timestamp from Koios /tx_info
Apr 25, 2026
836f78e
fix(history): refresh existing record fields from on-chain on reconcile
Apr 25, 2026
ebc7b67
feat(history): scroll-to-top button for the inner virtualized list
Apr 25, 2026
c212cc3
Merge pull request #129 from logical-mechanism/feature/wallet-activit…
logicalmechanism Apr 26, 2026
8073027
feat(history): add salesToCSV and purchasesToCSV exporters
Apr 26, 2026
a5b63ab
feat(my-sales): export CSV button for sales tax records
Apr 26, 2026
a48641d
feat(my-purchases): export CSV button for purchase tax records
Apr 26, 2026
969361e
test(my-sales,my-purchases): cover CSV export button rendering and click
Apr 26, 2026
d59c45a
feat(my-purchases): export historical purchases via re-encryption UTxOs
Apr 26, 2026
efbef24
feat(tax): unified re-encryption history export (chain-sourced)
Apr 26, 2026
dc04b7e
diag(tax): robust input matching + skip-reason logs for empty exports
Apr 26, 2026
061be23
fix(tax): source re-encryption events from asset history + signed txs
Apr 26, 2026
8013561
diag(tax): chunk tx_info batches + surface backend error detail
Apr 26, 2026
bf77423
diag(tax): return candidate-scan meta + lowercase-normalize PKH match
Apr 26, 2026
2969404
fix(tax): output-based seller PKH detection + emit rows without seller
Apr 26, 2026
b73bada
fix(tax): backfill stripped datums via /utxo_info + use Koios tx_index
Apr 26, 2026
b901a5d
linted and tested
Apr 26, 2026
f41c8b5
Merge pull request #130 from logical-mechanism/feature/sales-purchase…
logicalmechanism Apr 26, 2026
ed272f5
feat(ui): atmospheric empty state with spotlight + gentle float
Apr 26, 2026
c4815ac
feat(marketplace): unify toolbar with docked filter chips and panel
Apr 26, 2026
9be1fd4
feat(marketplace): card hierarchy with price hero and quiet footer
Apr 26, 2026
2304155
fix(marketplace): equal-height cards in grid via flex column + footer…
Apr 26, 2026
b0d4fff
feat(library): unify toolbar with framed container
Apr 27, 2026
cb5bc4c
feat(library): drop \"No description\" placeholder
Apr 27, 2026
9a8df3f
feat(library): collapse storage summary into a single quiet banner
Apr 27, 2026
3abe657
feat(library): card hierarchy with image banner, hero, and quiet footer
Apr 27, 2026
31ad724
feat(wallet): atmospheric backdrop on the unlock screen
Apr 27, 2026
fab6527
refactor(wallet): use btn-base + btn-primary/tertiary/secondary classes
Apr 27, 2026
7a08054
feat(wallet): treat the recovery phrase grid as precious
Apr 27, 2026
91e65be
feat(wallet): welcome screen treatment for the mode chooser
Apr 27, 2026
e528636
feat(ui): SkeletonCard shape-matches the new card layout
Apr 27, 2026
36e7f2f
feat(dashboard): tighter status pill row, equal-height stat cards
Apr 27, 2026
b109d13
feat(modals): drop borders on PlaceBid info banners
Apr 27, 2026
32659ec
feat(modals): drop borders on CreateListing soft info banners
Apr 27, 2026
da5bcac
feat(modals): align DecryptModal radius to --radius-xl for consistency
Apr 27, 2026
4a924a2
feat(my-sales): SalesListingCard hierarchy + equal heights
Apr 27, 2026
1bc049b
feat(my-purchases): MyPurchaseBidCard hierarchy + equal heights
Apr 27, 2026
119c220
fix(wallet): tone down splash backdrop brightness
Apr 27, 2026
336b197
fix(cards): scrim wrapper on image overlays + relocate NSFW to top-right
Apr 27, 2026
bd78e9f
feat(cards): slight extra breathing room above content in grid cards
Apr 27, 2026
0cda1a3
fix(cards): move overlays out of image, lock price + ADA on one line
Apr 27, 2026
2ed6a1e
fix(cards): lock bid count and storage chip on one line too
Apr 27, 2026
3fbdcdf
feat(dashboard): collapse healthy status pills into one with hover ex…
Apr 27, 2026
9403280
feat(marketplace): group filter panel into Filter / Sort / Display se…
Apr 27, 2026
cabf03c
fix(dashboard): tab badges only clear as listings are individually vi…
Apr 27, 2026
40260d4
feat(decrypt): collapse 'How it works' to a disclosure after first de…
Apr 27, 2026
1747760
feat(ui): add subtle delayed spinner above SkeletonGrid
Apr 27, 2026
c9d4e55
feat(place-bid): consolidate quick-action buttons into a segmented co…
Apr 27, 2026
f3ed1b1
feat(marketplace): suggest fuzzy near-match when search yields no res…
Apr 27, 2026
4159cbe
fix(ui): drop redundant Systems Ready tooltip; align InfoTooltip with…
Apr 27, 2026
edbbfca
fix(place-bid): more breathing room above the bid hint paragraph
Apr 27, 2026
d363102
lots of changes that claude didnt want to commmit for some reason
Apr 27, 2026
029663c
feat(ui): Dusk palette — three-color system (lilac / mint / sand)
Apr 27, 2026
7d0a904
fix(ui): tone the palette — bolder lilac, drop mint, white for values
Apr 27, 2026
8a8a718
chore(ui): activate type scale + spread .field-invalid + theme polish
May 5, 2026
350dae6
fix(library): equal-height grid cards regardless of imageLink
May 5, 2026
5f31dc6
feat(dashboard): stats cards — match hover lift, stagger entrance, di…
May 5, 2026
70587f6
fix(a11y): EncryptionCard description — real button instead of role=b…
May 5, 2026
af5a94c
docs(ui): expand --text-* token role docs with three-tier example pat…
May 5, 2026
6ef347d
feat(wallet): celebration toast on first wallet creation
May 5, 2026
9406328
Merge pull request #131 from logical-mechanism/feature/frontend-polis…
logicalmechanism May 5, 2026
e283fdb
feat(i18n): backfill EN keys for polish-pass defaultValue strings
May 5, 2026
c8a588b
feat(i18n): translate Dashboard tab badge aria-labels
May 5, 2026
3177f01
feat(i18n): lint guard + backfill 5 hardcoded a11y attribute strings
May 5, 2026
fe42985
feat(i18n): locale-aware formatAda, formatDate, formatRelativeTime
May 5, 2026
4e73527
Merge pull request #132 from logical-mechanism/feature/i18n-backfill-…
logicalmechanism May 5, 2026
a565cc5
feat(i18n): add formatWithCommas/stripCommas helpers
May 5, 2026
85785bd
feat(gui): comma-format PlaceBidModal currency inputs (D16)
May 5, 2026
7aa903d
feat(gui): comma-format UpdateBidModal currency inputs (D16)
May 5, 2026
0996e83
feat(gui): comma-format UpdatePriceModal price input (D16)
May 5, 2026
2d21cfb
refactor(gui): centralize CreateListingModal price formatter (D16)
May 5, 2026
cef1978
refactor(gui): centralize ImportListingModal price formatter (D16)
May 5, 2026
36cdd60
fix(gui): scale card price font with card width via container queries
May 5, 2026
9851821
fix(gui): stack price + storage badge on narrow MySales cards
May 5, 2026
2befd29
Merge pull request #133 from logical-mechanism/feature/d16-currency-i…
logicalmechanism May 5, 2026
ec78efb
feat(gui): install Bricolage Grotesque display face for hero text
May 5, 2026
be61451
chore(gui): track Inter + JetBrains Mono via @fontsource-variable
May 5, 2026
116add0
Merge pull request #134 from logical-mechanism/feature/install-bricol…
logicalmechanism May 5, 2026
07dfe89
chore(release): bump to 0.5.3
May 5, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .claude/settings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"enabledPlugins": {
"frontend-design@claude-plugins-official": true
}
}
21 changes: 21 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,27 @@ All notable changes to the PEACE Protocol are documented in this file.

The format is based on [Keep a Changelog](https://keepachangelog.com/).

## [0.5.3] - 2026-05-04

### Added
- Updater: accurate download progress with rolling-window speed and ETA, route toast Download to Settings, expand release notes into a modal, cancel an in-flight download (#128)
- Activity: wallet send/receive transactions in the History tab, sourced from a new `/api/chain/activity/:pkh` backend endpoint with scroll-to-top button on the virtualized list (#129)
- History: CSV export of historical sales and purchases for tax records, sourced from on-chain re-encryption events (#130)
- UI: Dusk three-color palette (lilac / mint / sand), marketplace and library card hierarchy with image banner / hero / quiet footer, tighter dashboard status pills, equal-height stat and listing cards, atmospheric empty state, welcome treatment for the wallet mode chooser, celebration toast on first wallet creation, type scale and `--text-*` token roles (#131)
- Marketplace: fuzzy near-match suggestion when a search yields no results, segmented control for Place Bid quick actions, Decrypt "How it works" collapses to a disclosure after first decrypt (#131)
- i18n: locale-aware `formatAda` / `formatDate` / `formatRelativeTime` helpers, lint guard against hardcoded a11y attribute strings, EN-key backfill for polish-pass strings, translated Dashboard tab badge aria-labels (#132)
- Inputs: thousands-separator comma formatting on Place Bid, Update Bid, and Update Price currency inputs, with a centralized `formatWithCommas` / `stripCommas` helper (D16) (#133)
- Typography: Bricolage Grotesque display face for hero text, with Inter and JetBrains Mono tracked via `@fontsource-variable` (#134)

### Fixed
- Updater: auto-check timer survives StrictMode double-invoke (#128)
- History: `reconcileWithOnChain` now refreshes existing records' fields from on-chain instead of insert-only, and reads `tx_timestamp` from Koios `/tx_info` (closes a long-silent stale-field bug) (#129)
- Activity: include wallet activity in the manual refresh path; `bundle:be` runs on `run.sh` startup so backend changes are not stale at runtime (#129)
- A11y: EncryptionCard description uses a real button instead of a `role=button` wrapper (#131)
- Library: equal-height grid cards regardless of imageLink presence (#131)
- Cards: scrim wrapper on image overlays, NSFW badge relocated to top-right, price + ADA and bid count + storage chips locked on one line (#131)
- MySales: stack price and storage badge on narrow cards; card price font scales with card width via container queries (#133)

## [0.5.2] - 2026-04-22

### Added
Expand Down
2 changes: 1 addition & 1 deletion CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ All active product development happens here. The full architecture reference liv

- **App name:** "Veiled" (single word — spaces produce awkward binary names).
- **Identifier:** `com.peace-protocol.veiled-desktop` (kept stable for app data dir compatibility).
- **Backend requires explicit build.** Tauri runs `node dist/index.js`, *not* `tsx src/index.ts`. Every change in `app/gui/be/src/` needs `cd app/gui/be && npm run build` before restarting Tauri. The frontend hot-reloads via Vite; the backend does not. `run.sh` starts a `tsc --watch` automatically — if you run `tauri dev` manually, you have to handle this yourself.
- **Backend requires explicit build AND re-bundle.** Tauri runs `node dist/index.js`, *not* `tsx src/index.ts`. Worse, it loads from a *bundled* copy at `app/gui/src-tauri/resources/be/dist/`, not from `app/gui/be/dist/`. So a backend change needs `cd app/gui/be && npm run build` *and* `cd app/gui && npm run bundle:be` (copies `be/dist/` into `src-tauri/resources/be/dist/`) before restarting Tauri. `run.sh` runs both on startup, but the `tsc --watch` it leaves running only updates `be/dist/` — the bundled copy stays stale until you re-run `bundle:be` and restart. The frontend hot-reloads via Vite; the backend does not.
- **127.0.0.1 not localhost.** WebKitGTK on Linux has DNS resolution issues; all local URLs use `127.0.0.1`.
- **No CLAUDE.md duplication.** This file deliberately stays out of GUI internals — see `app/gui/CLAUDE.md` for context boundaries, modal patterns, IPC commands, and other GUI-specific conventions.

Expand Down
2 changes: 1 addition & 1 deletion app/contracts/aiken.toml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
name = "logical-mechanism/peace-protocol"
version = "0.5.2"
version = "0.5.3"
compiler = "v1.1.21"
plutus = "v3"
license = "GPL-3.0-only"
Expand Down
2 changes: 1 addition & 1 deletion app/gui/be/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "veiled-be",
"version": "0.5.2",
"version": "0.5.3",
"description": "Veiled Backend API",
"engines": {
"node": ">=20.19.0",
Expand Down
14 changes: 12 additions & 2 deletions app/gui/be/src/middleware/timeout.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,19 @@ import { logger } from '../services/logger.js';

const DEFAULT_TIMEOUT_MS = 30_000;

// Routes that involve multiple sequential Koios round-trips (asset_txs
// per-token + credential_txs + chunked tx_info) and legitimately need
// more headroom. Keyed on path suffix so the same handler under both
// `/reencryption-history` and `/api/chain/reencryption-history` matches.
const LONG_RUNNING_ROUTES: Array<{ pattern: RegExp; timeoutMs: number }> = [
{ pattern: /\/reencryption-history\//, timeoutMs: 120_000 },
];

export function requestTimeout(timeoutMs: number = DEFAULT_TIMEOUT_MS) {
return (req: Request, res: Response, next: NextFunction): void => {
let timedOut = false;
const override = LONG_RUNNING_ROUTES.find((r) => r.pattern.test(req.path));
const effectiveTimeoutMs = override?.timeoutMs ?? timeoutMs;

// Abort controller for cancelling in-flight fetch operations on timeout.
// Route handlers can pass res.locals.abortSignal to service calls.
Expand All @@ -32,7 +42,7 @@ export function requestTimeout(timeoutMs: number = DEFAULT_TIMEOUT_MS) {
requestId: req.requestId,
method: req.method,
path: req.path,
timeoutMs,
timeoutMs: effectiveTimeoutMs,
});
// Send 504 before setting timedOut — origJson internally calls
// the patched res.send, which must pass through for this response.
Expand All @@ -49,7 +59,7 @@ export function requestTimeout(timeoutMs: number = DEFAULT_TIMEOUT_MS) {
res.locals.timedOut = true;
abortController.abort();
}
}, timeoutMs);
}, effectiveTimeoutMs);

res.on('finish', () => clearTimeout(timer));
res.on('close', () => clearTimeout(timer));
Expand Down
Loading
Loading