Skip to content
Merged
Show file tree
Hide file tree
Changes from 117 commits
Commits
Show all changes
118 commits
Select commit Hold shift + click to select a range
25763f2
docs: LS-QMSR verification — disprove properness, confirm bounded loss
tvolk131 Apr 16, 2026
12e9605
feat: on-chain market seeder script and relay-cache discovery fix
dmnyc Apr 16, 2026
17d0a00
docs: move wallet entropy doc to architecture folder
dmnyc Apr 16, 2026
b1300af
fix: cat loader for market fetch, remove unused nav and help UI
dmnyc Apr 16, 2026
14a9987
fix: auto-sync wallet every 15s while unlocked
dmnyc Apr 16, 2026
58cd376
docs: market grouping spec for multi-outcome events
dmnyc Apr 16, 2026
9206295
feat: toast notifications for wallet transactions
dmnyc Apr 16, 2026
f2647d4
feat: wallet badge and unconfirmed transaction indicators
dmnyc Apr 16, 2026
bfb2eda
fix: relay cache replacement and empty-response guard
dmnyc Apr 16, 2026
47127dd
fix: chain tip for time remaining and human-readable chart axis
dmnyc Apr 16, 2026
89a79b1
feat: trading panel UX — insufficient funds, friendly errors, lock state
dmnyc Apr 16, 2026
f1d8c10
fix: wallet badge only triggers on incoming funds
dmnyc Apr 16, 2026
e68cda8
feat: expanded market seeder with UTXO retry and docs
dmnyc Apr 16, 2026
81344d9
style: formatting fixes for biome and cargo fmt
dmnyc Apr 16, 2026
9dba933
feat: password-protect nsec reveal, clickable market cards
dmnyc Apr 16, 2026
41b3807
fix: replace LazyLock with once_cell::Lazy for MSRV 1.77 compat
dmnyc Apr 16, 2026
101f034
fix: restore liquid receive QR code when switching tabs
dmnyc Apr 16, 2026
c385e6d
feat: send confirmation flow, max drain, and friendly errors
dmnyc Apr 16, 2026
31f3b51
refactor: shared useLockScroll hook for all modals
dmnyc Apr 16, 2026
03606b4
fix: skeleton loading state replaces splash/empty-state race condition
dmnyc Apr 16, 2026
ec67a59
docs: update AGENTS.md and add CLAUDE.md with CI checks and conventions
dmnyc Apr 16, 2026
d048641
fix: onboarding restore flow focus and password persistence bugs (#77)
dmnyc Apr 16, 2026
c00da61
perf: non-blocking startup — serve cached data instantly
dmnyc Apr 16, 2026
3f67aef
perf: persist relay market cache to disk for instant cold start
dmnyc Apr 16, 2026
6fb0cbd
feat: add checkmark icon for Resolved category tab
dmnyc Apr 16, 2026
fbb537d
feat: category icons on all pages, reorder tabs, shorten Ending Soon
dmnyc Apr 16, 2026
649af22
fix: unlock body scroll when profile modal is closed
dmnyc Apr 17, 2026
9efdc80
feat: embed macOS traffic lights via transparent title bar
dmnyc Apr 17, 2026
7797861
fix: switch title bar to Overlay + reserve space for traffic lights
dmnyc Apr 17, 2026
cb245b4
feat: full-width drag, inline search at all widths, smaller logo
dmnyc Apr 17, 2026
9f9b4ae
fix: improve keyboard interactions across dialogs
dmnyc Apr 17, 2026
54fd3bb
Settings version footer + scrollbar and traffic-light polish (#82)
dmnyc Apr 19, 2026
5a5bd09
fix: logo click resets category to Trending
dmnyc Apr 19, 2026
6fe959b
Feat/preview charts (#83)
Uty-re Apr 21, 2026
2fc7009
fix: avoiding repeated syncs during fee-convergence
sergey3bv Apr 16, 2026
ab36bf5
feat: Polymarket-style probability chart with Yes/No toggles (#84)
Uty-re Apr 21, 2026
a9abe98
fix: split preview vs commit for Nostr identity to stop onboarding fr…
dmnyc Apr 21, 2026
d475718
feat: Polymarket-inspired detail page UX refresh (#87)
Uty-re Apr 22, 2026
18618dd
refactor: introduce NostrSigner trait abstraction for NIP-46 remote s…
claude Apr 16, 2026
56c6886
feat: add NIP-46 remote signing commands (connect, disconnect, status)
claude Apr 16, 2026
b56ac08
feat: add bunker login UI for NIP-46 remote signing
claude Apr 16, 2026
d9366d1
feat: show NIP-46 signer status in settings, guard nsec UI
claude Apr 16, 2026
3b25bd0
docs: add NIP-46 remaining work spec for post-testing polish
claude Apr 16, 2026
6b6cd70
fix: resolve compilation errors from rebase onto current master
dmnyc Apr 16, 2026
271b1cc
fix: resolve test compilation errors from signer trait refactor
dmnyc Apr 16, 2026
2473ebc
feat: nostrconnect QR code for app-initiated NIP-46 flow
dmnyc Apr 16, 2026
dda212c
fix: replace nsec.app references with Amber and Primal
dmnyc Apr 16, 2026
d54239a
fix: password minimum label and validation consistent at 8 characters
dmnyc Apr 16, 2026
cb05449
fix: NIP-46 aware logout and consistent password validation
dmnyc Apr 16, 2026
0f274b2
feat: user menu UX — Nostr ID badge, reorder items, NIP-46 disconnect…
dmnyc Apr 16, 2026
bb6633d
feat: show NIP-05 with verified badge under name in profile editor
dmnyc Apr 16, 2026
59c6871
style: NIP-05 badge — purple star with checkmark, better spacing
dmnyc Apr 16, 2026
4c64a8e
style: use verified-symbol SVG for NIP-05 badge in purple
dmnyc Apr 16, 2026
35b8891
style: darken npub text below NIP-05 in profile editor
dmnyc Apr 16, 2026
02e4b6b
fix: preserve Tahoe drag strip over overlays
dmnyc Apr 17, 2026
56a561d
fix: full-viewport Settings modal on Tahoe
dmnyc Apr 18, 2026
29beb60
copy: update Nostr identity description in Settings
dmnyc Apr 18, 2026
dc53df6
feat: NIP-46 remote signing — Primal + Amber compatible, unified flows
dmnyc Apr 22, 2026
a2f0349
feat: NIP-22 market comments backend (#89)
dmnyc Apr 23, 2026
74cd3b6
feat: NIP-22 market comments UI
dmnyc Apr 23, 2026
0985d5e
feat: Bitcoin Connect + NIP-57 zaps (#91)
dmnyc Apr 23, 2026
fa422f4
feat: NWC secret storage, onboarding overhaul, NIP-46 polish (#93)
dmnyc Apr 23, 2026
af98944
feat: zap aggregation + detail polish + footer + onboarding fixes
dmnyc Apr 23, 2026
1072451
docs: Nostr social features roadmap
dmnyc Apr 24, 2026
4c0a413
fix: zap UX + identity hygiene + copy standardization
dmnyc Apr 24, 2026
c4f1924
docs: NIP-78 prefs + logout purge plan
dmnyc Apr 24, 2026
820af0e
feat(reactions): NIP-25 per-comment reactions
dmnyc Apr 24, 2026
c53ccb3
feat(comments): one-level threaded replies + Reddit-style tombstones
dmnyc Apr 24, 2026
570f259
feat: multi-outcome binary market groups (Polymarket-style) (#92)
Uty-re Apr 24, 2026
64ac699
feat: notifications bell + full emoji picker (#100)
dmnyc Apr 24, 2026
3da3908
feat: trending carousel slide animation + manual-nav pause (#101)
dmnyc Apr 24, 2026
59c0994
fix(wallet): post-delete hygiene + post-unlock sync + syncing pulse (…
dmnyc Apr 24, 2026
6810234
feat: follow/mute + NIP-05 verification (NIP-02 + NIP-51) (#103)
dmnyc Apr 24, 2026
9ff8ab0
chore(ui): switch block explorer links to liquid.network (#105)
dmnyc Apr 24, 2026
879a4f4
feat: store nostr identity key in OS keychain (#104)
dmnyc Apr 24, 2026
e170561
feat: scope notifications to deadcat-authored content + topshell poli…
dmnyc Apr 25, 2026
a58bb06
fix(nip46): publish kind:0 + create NIP-98 auth via signer trait
dmnyc Apr 27, 2026
914748d
feat(detail): sticky minimized market header for both market types
dmnyc Apr 27, 2026
ce17b92
fix(modals): tie body-scroll lock to open state
dmnyc Apr 27, 2026
437637f
chore(deps): patch dependabot-flagged dev tooling
dmnyc Apr 28, 2026
66b83f8
feat(home): tighten right-sidebar sections
dmnyc Apr 30, 2026
505e4de
fix(carousel): reverse slide direction on prev arrow
dmnyc Apr 30, 2026
e8f84f0
docs: multi-outcome market pivots to 2N-token design; add shared prin…
tvolk131 Apr 16, 2026
d33d3cf
docs: land AMM pool design decisions — binary LMSR only, Option C for…
tvolk131 Apr 17, 2026
77a0270
docs(core): Stage 1 — introduce multi-outcome core types
tvolk131 Apr 17, 2026
7e7cbd5
docs(core): Stage 2 — view types and restructured API surface
tvolk131 Apr 17, 2026
752a799
docs(core): Stage 3 — behavior, interpretation, and multi-contract pa…
tvolk131 Apr 18, 2026
b4ac002
docs(core): outcome-scoped store relationship queries + routing doc pass
tvolk131 Apr 18, 2026
c1127cd
docs(multi-outcome): generic solvency-preservation spend path
tvolk131 Apr 18, 2026
0c6448e
docs(core): align with generic solvency-preservation spend path
tvolk131 Apr 18, 2026
3f15280
docs: clarify script uniqueness guarantee and collapse stale staging …
tvolk131 Apr 18, 2026
c321140
docs: add System Invariants section and covenant self-enforcement pri…
tvolk131 Apr 18, 2026
6e8f34d
docs(recovery): add Integration Contract section
tvolk131 Apr 18, 2026
87e13a6
docs: unify denomination — primary param base_payout, cp = base_payou…
tvolk131 Apr 18, 2026
7d0ce8e
docs: defer cross-outcome arb API to v2, reserve surface for future d…
tvolk131 Apr 18, 2026
ce6a6d5
docs: land B3 codegen strategy — MiniJinja generator, N={3,4} for v1
tvolk131 Apr 18, 2026
958cf87
docs: land B1 LMSR F-value computation — bignum runtime, 1-2-5 pool d…
tvolk131 Apr 18, 2026
419ee69
docs: add deadcat-core implementation plan
tvolk131 Apr 18, 2026
8f0577f
docs: add smplx testing infrastructure section to implementation plan
tvolk131 Apr 18, 2026
24fe00f
docs: sprint 1 pre-implementation review updates
tvolk131 Apr 20, 2026
c851cce
docs(core): sprint 2 type and error refactor
tvolk131 Apr 20, 2026
8bd4f16
docs(core): sprint 3 new sections and rustdoc pass
tvolk131 Apr 20, 2026
cf5d3eb
docs: sprint 4 capture remaining review context
tvolk131 Apr 20, 2026
592cd2a
docs: expand rationale for allowing post-resolution pool trading
tvolk131 Apr 20, 2026
c961e1f
docs: sprint 5 resolve review drift across recovery, derive, and hints
tvolk131 Apr 21, 2026
9f7cc27
docs: fix sprint 5 review findings
tvolk131 Apr 21, 2026
ada58ce
docs: resolve deadcat-core cluster 1 spec contradictions
tvolk131 Apr 21, 2026
b92b982
docs: clarify LMSR bootstrap defaults and runtime model
tvolk131 Apr 22, 2026
877c490
docs: specify assisted pool trade composition
tvolk131 Apr 22, 2026
ac0638b
:wq
tvolk131 Apr 22, 2026
c0aac3b
docs: canonicalize recovery hints and LMSR math
tvolk131 Apr 22, 2026
245c903
docs: clarify implementation targets and legacy deltas
tvolk131 Apr 22, 2026
86ea01c
docs: clarify strict-canonical ingestion
tvolk131 Apr 23, 2026
39b0565
docs: add deadcat-core normative map
tvolk131 Apr 26, 2026
c676be9
docs: align deadcat-core implementation guidance
tvolk131 Apr 26, 2026
d8058bc
docs: resolve trade pset pre-blinding API
tvolk131 Apr 26, 2026
f56d689
ci: enable Rust tests in CI, migrate to nextest, fix broken tests
tvolk131 May 6, 2026
6e8b174
Merge master into docs
tvolk131 May 6, 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
29 changes: 15 additions & 14 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,18 @@ on:

jobs:
check:
runs-on: ubuntu-large
runs-on: blacksmith-8vcpu-ubuntu-2404
steps:
- uses: actions/checkout@v4

- uses: DeterminateSystems/nix-installer-action@main

- name: Rust cache
uses: swatinem/rust-cache@v2
with:
cmd-format: "nix develop .#default --command {0}"
workspaces: ./src-tauri -> target

- name: Install dependencies
run: nix develop --command just install

Expand All @@ -29,8 +35,8 @@ jobs:
- name: Rust clippy
run: nix develop --command just cargo-clippy

# - name: Rust tests
# run: nix develop --command just cargo-test
- name: Rust tests
run: nix develop --command just cargo-test

build:
if: github.event_name == 'push' && github.ref == 'refs/heads/master'
Expand All @@ -39,13 +45,10 @@ jobs:
fail-fast: false
matrix:
include:
- platform: macos-26
- platform: blacksmith-6vcpu-macos-latest
args: --target aarch64-apple-darwin
arch: aarch64
- platform: macos-26
args: --target x86_64-apple-darwin
arch: x86_64
- platform: ubuntu-22.04
- platform: blacksmith-8vcpu-ubuntu-2404
args: ""
arch: x86_64-linux

Expand All @@ -54,7 +57,7 @@ jobs:
- uses: actions/checkout@v4

- name: Install Linux dependencies
if: matrix.platform == 'ubuntu-22.04'
if: contains(matrix.platform, 'ubuntu')
run: |
sudo apt-get update
sudo apt-get install -y \
Expand All @@ -76,8 +79,6 @@ jobs:

- name: Install Rust stable
uses: dtolnay/rust-toolchain@stable
with:
targets: ${{ startsWith(matrix.platform, 'macos') && 'aarch64-apple-darwin,x86_64-apple-darwin' || '' }}

- name: Rust cache
uses: swatinem/rust-cache@v2
Expand All @@ -101,14 +102,14 @@ jobs:
args: ${{ matrix.args }}

- name: Upload DMG artifact
if: startsWith(matrix.platform, 'macos')
if: contains(matrix.platform, 'macos')
uses: actions/upload-artifact@v4
with:
name: dmg-${{ matrix.arch }}
path: src-tauri/target/${{ matrix.arch }}-apple-darwin/release/bundle/dmg/*.dmg

- name: Upload Linux artifacts
if: matrix.platform == 'ubuntu-22.04'
if: contains(matrix.platform, 'ubuntu')
uses: actions/upload-artifact@v4
with:
name: linux-${{ matrix.arch }}
Expand All @@ -120,7 +121,7 @@ jobs:
release:
if: github.event_name == 'push'
needs: [build]
runs-on: ubuntu-latest
runs-on: blacksmith-8vcpu-ubuntu-2404
permissions:
contents: write
steps:
Expand Down
64 changes: 46 additions & 18 deletions AGENTS.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,25 @@
# Agents

## Mandatory CI Checks

All agents MUST pass these checks before committing or creating PRs. Do NOT push code that fails any of these.

```bash
# TypeScript type checking
npx tsc --noEmit

# Biome lint + format (must pass with zero errors)
npx @biomejs/biome check --error-on-warnings .

# Rust formatting
cd src-tauri && cargo fmt --all -- --check

# Rust compilation
cd src-tauri && cargo check
```

Fix any issues before committing. Formatting fixes should be a separate `style:` commit.

## Build & Development Commands

**All commands must be run through the Nix dev shell:**
Expand All @@ -10,42 +30,50 @@ nix develop --command just {command}
- Install dependencies: `nix develop --command just install`
- Dev server: `nix develop --command just dev`
- Frontend only: `pnpm dev` (runs on localhost:1420)
- Build frontend: `pnpm run build`
- Build native app: `cargo tauri build`
- TypeScript check: `nix develop --command just tsc`
- Lint: `nix develop --command just biome-lint`
- Format: `nix develop --command just biome-format`
- Auto-fix: `nix develop --command just biome-fix`
- Screenshot tests: `nix develop --command just screenshots`
- Update screenshots: `nix develop --command just screenshots-update`
- Rust format check: `nix develop --command just cargo-fmt`
- Rust clippy: `nix develop --command just cargo-clippy`
- Rust tests: `nix develop --command just cargo-test`

## Code Style & Conventions

- **Language**: TypeScript (frontend), Rust (backend/Tauri)
- **Frontend**: Vanilla TypeScript with DOM manipulation (no framework — single `render()` function rebuilds the DOM on state change)
- **Styling**: Tailwind CSS with custom design tokens (golden-ratio spacing, custom typography scale) defined in `src/style.css`
- **Formatting/Linting**: Biome (not Prettier/ESLint)
- **Types**: All type definitions live at the top of `src/main.ts`
- **State**: Global `state` object; mutate state then call `render()` to update UI
- **Event handling**: Single event delegation on `#app` element using `data-*` attributes for actions
- **Naming**: camelCase for variables/functions, PascalCase for types, UPPER_SNAKE_CASE for constants
- **Rust**: Edition 2021, minimum rustc 1.77.2; Tauri commands in `src-tauri/src/lib.rs`
- **Frontend**: React with Zustand state management, TanStack Query for data fetching
- **Styling**: Tailwind CSS with custom design tokens defined in `src/style.css`
- **Formatting/Linting**: Biome v2.x — use `npx @biomejs/biome` (NOT `npx biome`, which resolves to old 0.3.3)
- **Types**: Type definitions in `src/types.ts`, store slices in `src/store/index.ts`
- **Naming**: camelCase for variables/functions, PascalCase for types/components, UPPER_SNAKE_CASE for constants
- **Rust**: Edition 2021, minimum rustc 1.77.2 (do not use `std::sync::LazyLock` — use `once_cell::sync::Lazy`)
- **Error handling**: Rust commands return `Result<T, String>`; frontend uses try/catch with `invoke()`

## Commit Conventions

- Use conventional commit prefixes: `feat:`, `fix:`, `refactor:`, `style:`, `docs:`
- Commit messages should include a descriptive body when the title alone does not preserve intent, scope, user-visible behavior, or important tradeoffs for future maintainers
- Do NOT add Claude as co-author or contributor
- Do NOT commit or push without explicit user permission
- Do NOT push to master/main without explicit permission
- Do not use nostr.band (defunct)

## Architecture
- **Frontend entry**: `src/main.ts` — single-file app containing all state, types, rendering, and event handling
- **Backend entry**: `src-tauri/src/lib.rs` — Tauri command handlers for wallet operations (LWK)

- **Tauri v2** desktop app: TypeScript frontend + Rust backend
- **Frontend entry**: `src/App.tsx` — React app with component tree
- **Backend entry**: `src-tauri/src/lib.rs` — Tauri command handlers
- **SDK**: `src-tauri/crates/deadcat-sdk/` — Liquid wallet (LWK 0.14), Nostr discovery, prediction market covenants
- **Store**: `src-tauri/crates/deadcat-sdk/deadcat-store/` — SQLite persistence via Diesel
- **IPC**: Frontend calls Rust backend via `@tauri-apps/api/core` `invoke()`
- **Wallet**: LWK (`lwk_signer`, `lwk_wollet`) for Liquid Network wallet/signer management
- **Data**: Market data is currently mock data embedded in `main.ts`
- **Blockchain**: Blockstream esplora API for chain tip queries
- **Nostr**: Kind 30078 (NIP-78) for market announcements, orders, pools, attestations
- **Blockchain**: Blockstream esplora API for chain tip, Electrum for wallet sync

## Key Types

- `Market`: Core prediction market with covenant state, asset IDs, prices, UTXOs
- `CovenantState`: 0–3 representing settlement stages
- `CovenantState`: 0=Dormant, 1=Unresolved, 2=ResolvedYes, 3=ResolvedNo, 4=Expired
- `Side`: "yes" | "no" outcome tokens
- `OrderType`: "market" | "limit"
- `ActionTab`: "trade" | "issue" | "redeem" | "cancel"
- `WalletNetwork`: "liquid" | "liquid-testnet" | "liquid-regtest"
14 changes: 14 additions & 0 deletions CLAUDE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
# Claude Code Instructions

Follow all instructions in [AGENTS.md](AGENTS.md) — especially the mandatory CI checks.

## Additional Claude-Specific Rules

- Do NOT add Claude as co-author or contributor in any commits or git metadata
- Do NOT commit or push without explicit user permission
- Do NOT push to master/main without explicit permission
- `.DS_Store` files are always untracked and gitignored — never stage or commit them
- Do NOT use nostr.band (defunct)
- Use `npx @biomejs/biome` (NOT `npx biome` which resolves to old 0.3.3)
- Rust MSRV is 1.77.2 — do NOT use `std::sync::LazyLock` (requires 1.80). Use `once_cell::sync::Lazy`
- Use `src/utils-react/friendly-error.ts` `friendlyError()` for all user-facing errors — never show raw SDK error strings
Loading