[Unreleased]
Fixed
- Hardened PR CI by restricting token permissions and disabling persisted checkout credentials before running repository scripts.
- Prevented config-only commits from failing when lint-staged passed unsupported Markdown and YAML files to Biome.
Added
- Automatic PR reviews in the opencode workflow (runs on PR open/update, reviews with Kimi k3).
- Add opencode GitHub workflow for automated PR reviews and
/oc commands (Kimi k3).
- Centralized QueryClient defaults and query key factories.
- CI workflows: PR (type-check, lint, test) and main build.
- Optional
NEXT_PUBLIC_QUOTE_MOCK_ADDRESS to enable pre-connection quotes.
- Footer layout refreshed: dedicated footer button styles, consistent heights, tightened spacing, and Docs moved next to GitHub.
Changed
- Updated Next.js, Supabase, Zustand, Biome, bundle analyzer, and Knip to current stable releases.
- Updated Next.js, Supabase, Biome, testing types/tooling, and Vite to current stable releases; refreshed transitive security overrides for brace-expansion, nanoid, and js-yaml.
- Updated Supabase, Biome, React/Node type definitions, Knip, lint-staged, and the Vite security override to their current stable releases.
- Refreshed the dependency stack, enabled Next.js's TypeScript CLI integration for TypeScript 7, kept Jest config loading compatible across supported Node versions, patched transitive Lodash and brace-expansion advisories, and moved Dependabot to grouped Bun and GitHub Actions updates.
- Upgraded GitHub Actions checkout steps to v7.
- Replace opencode review workflow with the official comment-triggered opencode workflow.
- Updated all direct runtime and development dependencies to their latest compatible releases, including Next.js 16.2, React 19.2, Zod 4, Recharts 3, Jest 30, Biome 2.5, and the supported TypeScript 7/6 compatibility pairing.
- Updated the Bun runtime pin and CI actions, simplified the changelog gate around
Unreleased, and prevented already-tagged releases from being republished on ordinary changelog merges.
- Refreshed transitive security overrides, including Sharp 0.35, to the latest patched releases available through the current dependency graph.
- Replaced stale machine-specific agent-instruction symlinks with portable repository-local pointers.
- Added
knip v6 dead-code checks with a repo-specific knip.json and wired bun run knip into the canonical ai-check pipeline.
- Replaced the umbrella
satsterminal-sdk dependency with the swaps-only @satsterminal-sdk/swaps package and aligned it to 1.6.31.
- Hard-cutover navigation to canonical routes (
/swap, /borrow, /runes-info, /your-txs, /portfolio) and made / redirect to /swap.
- Removed legacy tab query/event plumbing (
/?tab=..., tabChange custom events, and tab state URL syncing via pushState).
- Added architecture guardrails (
lint:architecture) and enforced them in CI to block barrel imports, tab-event patterns, and oversized modules without waivers.
- Added App Router fault boundaries (
app/error.tsx, app/global-error.tsx, app/not-found.tsx) and aligned route patterns with current Next.js guidance.
- Refactored swap quote/execution orchestration into smaller helper modules and standardized query key usage through the shared
queryKeys factory.
- Enforced Zod validation and standardized
ok/fail across APIs; set dynamic = 'force-static' on static GETs.
- Strict Mode effect cleanups (timers/listeners) for predictable behavior.
- Re-enabled build-time linting.
- Simplified Husky hooks to use lint-staged in pre-commit and checks in pre-push.
- Migrated linting/formatting from ESLint + Prettier + Stylelint to Biome with a single repo-wide config.
- Migrated package management and project scripts from pnpm to Bun, including CI and Git hooks.
- Standardized Husky validation by running the canonical
bun run ai-check pipeline on pre-push.
- Reduced unnecessary quote requests and improved swap percentage helpers.
- Upgraded Next.js and eslint-config-next to 15.5.18, ignored generated next-env.d.ts output in ESLint, and updated vulnerable dependency paths including Vite, Axios, Rollup, Fast URI, and Handlebars.
- Upgraded Next.js and related ESLint config to 15.2.6.
- Upgraded dependency set to supersede Dependabot PRs for
react-markdown, @commitlint/cli, @commitlint/config-conventional, typescript, jsdom, @types/jsdom, and prettier.
- Upgraded
next, eslint-config-next, @next/eslint-plugin-next, and @next/bundle-analyzer to 15.5.10.
- Upgraded to Next.js
16.1.6 and aligned core frontend/tooling packages to latest compatible releases (react, react-dom, @types/react, @types/react-dom, @types/node, @supabase/supabase-js, @tanstack/react-query, @headlessui/react, zustand, ordiscan, satsterminal-sdk, lint-staged, and others).
- Removed deprecated
eslint config from next.config.ts for Next.js 16 compatibility.
- Upgraded
@omnisat/lasereyes to 0.0.163.
Fixed
- Updated the transitive Nano ID override to 3.3.18 to resolve its custom-generator infinite-loop advisory.
- Restricted the main-build workflow token to read-only repository access and disabled persisted checkout credentials.
- Routed CoinGecko Pro keys to the Pro API host, handled repeated swap rune parameters safely, and made the changelog gate require an actual new
Unreleased bullet.
- Made the architecture lint self-contained so it also runs on CI hosts without ripgrep installed.
- Added fallback rune search providers when SatsTerminal's search endpoint is unavailable, while preserving the existing
/api/sats-terminal/search contract.
- Moved BTC/USD price fetching behind a server-side proxy route to avoid brittle browser-side CoinGecko requests.
- Corrected stale README guidance after the dead-code cleanup removed
src/lib/env.ts.
- Removed dead files, duplicate exports, stale test/helpers, and outdated package/config surface found by knip while preserving current app behavior.
- Removed unused legacy Liquidium loan/collateral type declarations caught by the upgraded dead-code checks.
- Eliminated runtime dependency on legacy tab events and query-driven tab selection after route cutover.
- Removed lint and type regressions introduced during the cleanup extraction pass (
swapExecution helper typing and Biome compliance).
- Logging consistency: replaced stray
console.* with logger in APIs; reduced noisy logs.
- Enforced Zod response validation in
src/app/api/ordiscan/btc-balance/route.ts.
- Replaced ad-hoc query checks with Zod-based validation in
src/app/api/ordiscan/rune-info-by-id/route.ts.
- Removed unsafe assertions in
src/hooks/useSwapExecution.ts by introducing PsbtApiResponse and a type guard; deduplicated SwapConfirmationResult; fixed finally-block to avoid stale state success re-dispatch.
- Preserved swap error state in
useSwapExecution so failures remain visible instead of resetting to idle.
- Prevented swap quote fetch from getting stuck in loading when no wallet address is available by validating before starting the request.
- Restored default read-only quote address so disconnected users still receive quotes when
NEXT_PUBLIC_QUOTE_MOCK_ADDRESS is unset.
- Kept
/api/ordiscan/list-runes dynamic so new/updated runes stay fresh without redeploys.
- PSBT creation now respects the client-provided fee rate with an optional
SATS_TERMINAL_FORCED_FEE_RATE override for emergencies.
- Quote display formatting now stays in Big.js to avoid precision loss; BTC balance display uses Big-based formatter.
- PSBT confirmation error handling uses typed guards and proper 4xx responses instead of ad-hoc Response casting.
- CI now installs dependencies with Bun (
bun ci) for lockfile-consistent builds.
- Security patch: pinned transitive
diff to 4.0.4 via top-level overrides to resolve the outstanding Dependabot alert.
- Security hardening: added top-level
overrides for transitive axios, esbuild, lodash, valibot, and vite to pull patched releases.
- Updated
AssetSelectorDropdown to satisfy Headless UI v2.2.9 Listbox typing when no selection exists.
- Updated Jest config to map
@omnisat/lasereyes to a local test mock so the ESM-only LaserEyes build works with the current Jest runtime.
- Added a Node-version-aware Next build wrapper that sets a valid
--localstorage-file path when supported to prevent noisy build-time warnings.
- Removed deprecated
legacyBehavior usage from next/link in the app footer for Next.js 16 compatibility.
[0.2.8] - 2025-12-29
Fixed
- Swap quote errors for missing orders/liquidity now resolve to friendly messages without crashing the UI.
- API client now throws when a success response is missing expected data.
[0.2.7] - 2025-12-29
Added
- Added a Jest mock for the LaserEyes SDK to keep tests stable with ESM packages.
Changed
- Updated dependency toolchain/testing packages (eslint, @eslint/eslintrc, @commitlint/config-conventional, jest/@types/jest, jest-environment-jsdom) and @omnisat/lasereyes.
- Adjusted LaserEyes typings usage across swap/borrow flows to align with updated SDK types.
- Updated Jest config to handle LaserEyes with pnpm-aware transform rules.
Removed
- Removed ts-jest (no Jest 30-compatible release).
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog,
and this project adheres to Semantic Versioning.
[0.2.6] - 2025-08-28
Changed
- Refactored
useSearchWithPopular hook to use React Query for search and popular rune flows with debounced input.
- Updated tests to wrap hook consumers with
QueryClientProvider.
Fixed
- useSearchWithPopular: prefer fetched popular results over
initialItems when available; correct isLoading/error derivation; sync cache only when initialItems change.
[0.2.5] - 2025-08-28
Added
- Reusable
useRuneBalances hook for fetching rune balances and refactored Borrow and Swap tabs to use it.
- Centralized helper for retrieving and validating Liquidium JWTs used by borrow routes.
- Centralized SatsTerminal error handler and wrapped PSBT endpoints with
withApiHandler.
- Helper to generate rune icon URLs and refactor existing hard-coded links.
- Generic
useSearchWithPopular hook for debounced search with optional popular-item caching.
- Centralized
usePopularRunes hook and refactored hooks/components to consume it.
- Helper
fetchRuneEndpoint for Ordiscan rune endpoints with accompanying tests.
Changed
- Centralized rune route validation with shared helper.
- Refactored
FormattedRuneName to use the useRuneInfo hook.
useAssetSearch and useRunesSearch now leverage useSearchWithPopular.
- Replace console statements with logger utilities.
- Made
useFeeRates accept optional React Query config and reused it in swap execution.
- Refactored popular rune mapping into a generic utility.
- Consolidated rune data fetching hooks with new
useRuneDataQuery wrapper.
- Updated changelog workflow to automatically trigger @claude when changelog validation fails, enabling automated changelog generation.
- Enhanced Claude workflow permissions to allow contents and pull-requests write access for committing changelog updates.
[0.2.3] - 2025-08-24
Added
- Changelog page at
/changelog that renders CHANGELOG content without the preamble and link reference block (shows only versions, dates, and changes).
- Footer "Changelog" button next to "Docs" for quick access.
[0.2.2] - 2025-08-23
Added
- CI: Auto-create/update GitHub Releases from the top CHANGELOG section on merges to
main.
- CI: PR validation to ensure CHANGELOG top version matches
package.json and is not [Unreleased].
[0.2.1] - 2025-08-23
Added
- Enforce changelog updates via GitHub Actions workflow.
- Claude PR assistant and automated code review workflows.
- Popular runes normalizer (id/name/icon) with centralized mapping and de-duplication.
- Fee selector with mempool.space rates and improved fee/UX handling.
- Comprehensive test coverage for core hooks and APIs (e.g., useSwapExecution, useRunesSearch, useBorrowQuotes).
Changed
- Major performance and infrastructure optimizations; organized codebase and consolidated API infrastructure.
- Extracted repeated logic into shared hooks/utilities; switched to absolute
@/ imports.
- Centralized Liquidium API handling and aligned server routes with generated SDK types.
- Adopted Big.js for precise financial calculations across swap/borrow flows.
- Improved error handling and validation across API routes and UI.
- Enabled Next Image optimizations and refined image remote patterns.
- Tightened TypeScript strictness and stabilized Jest/jsdom test environment.
Fixed
- Resolved borrow quotes infinite loop and memory issues in tests.
- Handled Ordiscan 404 responses; corrected Liquidium API domain.
- Improved collateral amount precision handling and validation.
- Prevented stale selections in popular runes; preserved swap error states.
- Addressed SSR and import issues (Suspense wrap, case-sensitive paths, Loading component imports).
- Reduced local rate-limit hits to SatsTerminal; standardized quote response format.
Removed
- Removed legacy
TBA_API_URL usage and 98.css remnants.
- Removed obsolete scripts and miscellaneous unused configuration.
Security
- Restricted error log details in production API responses.
[0.2.0] - 2025-05-20
Added
- Borrow functionality and Liquidium OpenAPI context; portfolio and repay flow.
- Improved error handling and caching layers.
- Test scaffolding and initial test suites.
- Project tooling: ESLint, Prettier, Husky, lint-staged, Stylelint.
Changed
- Updated Liquidium auth to respect proper RLS policies.
- UI/UX refinements: layout tweaks, chart formatting, and consistency.
Fixed
- Addressed multiple review feedback items and refined LTV display/formatting.
- Ensured ES2020 compatibility for BigInt usage.
- Enabled retry of loan process after cancellation in Xverse wallet.
[0.1.5] - 2025-04-26
Changed
- Removed alpha disclaimer; updated styles.
- Added percentage shortcuts for balance input in SwapTab.
[0.1.4] - 2025-04-23
Added
- Updated logo and basic SEO improvements.
- Price chart updates (sats display and more accurate data).
Changed
- Addressed review nitpicks; refined layout and responsiveness.
- Updated to SatsTerminal 1.6.7; improved
.env.example guidance.
Removed
- Removed redundant files and unused cursor rules.
[0.1.3] - 2025-04-23
Added
- Debug logging for validatedParams in quote API route.
Changed
- Prevented race conditions in quote fetching; ensure state updates only for latest request.
- Layout/styling updates for AppInterface and overall responsiveness.
[0.1.2] - 2025-04-23
Changed
- Enhanced PriceChart: forward-fill missing hourly data; improved type-safety and performance.
[0.1.1] - 2025-04-23
Fixed
- Fixed LaserEyes wallet unmount behavior; updated cursor rules.
[0.1.0] - 2025-04-23
Added
- Initial release: swap interface, price chart, core API routes and foundational UI.