Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
99 changes: 99 additions & 0 deletions .github/ISSUE_TEMPLATE/bug_report.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
name: Bug report
description: Report a reproducible problem in Deckard (0.0.1-alpha).
title: "[bug]: "
labels: ["bug", "triage"]
body:
- type: markdown
attributes:
value: |
Thanks for taking the time to file a bug.

**Deckard is `0.0.1-alpha` — experimental, pre-1.0 software.** It is not production-ready,
has not had a third-party security audit, and must only be used with **testnet / throwaway
keys — never real funds or real mainnet keys.**

> **Stop:** if this is a *security vulnerability* (anything that could expose a key, seed,
> passphrase, or signed transaction), do **not** open a public issue. Report it privately —
> see [`SECURITY.md`](https://github.com/hellno/deckard/blob/main/SECURITY.md). Public disclosure puts other users at risk.

- type: checkboxes
id: acknowledgements
attributes:
label: Acknowledgements
description: Please confirm all of the following before filing.
options:
- label: "I am **NOT** reporting a security vulnerability (those go to `SECURITY.md`, privately)."
required: true
- label: "I am using **testnet / throwaway keys, not real funds**."
required: true
- label: "I searched existing issues and this is not a duplicate."
required: true

- type: textarea
id: what-happened
attributes:
label: What happened?
description: A clear, concise description of the actual behavior. Include any error output or screenshots (redact any key/seed/address you would rather not share).
placeholder: When I ..., Deckard did ...
validations:
required: true

- type: textarea
id: expected
attributes:
label: What did you expect to happen?
description: A clear, concise description of the expected behavior.
placeholder: I expected Deckard to ...
validations:
required: true

- type: textarea
id: steps
attributes:
label: Steps to reproduce
description: The exact sequence to reliably reproduce the problem.
placeholder: |
1. Run `just run`
2. Complete onboarding with a throwaway seed
3. Click '...'
4. See error
validations:
required: true

- type: dropdown
id: os
attributes:
label: Operating system
options:
- macOS
- Linux
validations:
required: true

- type: input
id: os-version
attributes:
label: OS version
description: e.g. "macOS 15.5 (Apple Silicon)" or "Ubuntu 24.04 / Fedora 40".
placeholder: macOS 15.5 (Apple Silicon)
validations:
required: true

- type: input
id: app-version
attributes:
label: Deckard version
description: The current pre-release is `0.0.1-alpha`. If you built from a specific commit, paste the short SHA.
placeholder: 0.0.1-alpha (commit abc1234)
value: "0.0.1-alpha"
validations:
required: true

- type: textarea
id: logs
attributes:
label: Relevant logs or context
description: Paste any relevant terminal output. **Never paste a seed phrase, private key, or passphrase** — they are not needed to triage a bug.
render: shell
validations:
required: false
12 changes: 12 additions & 0 deletions .github/ISSUE_TEMPLATE/config.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
blank_issues_enabled: false
contact_links:
- name: Report a security vulnerability (private)
url: https://github.com/hellno/deckard/blob/main/SECURITY.md
about: >-
Do NOT open a public issue for security problems. Deckard holds private keys, seed phrases,
and an encrypted keystore. Follow the private disclosure process in SECURITY.md.
- name: Questions & discussion
url: https://github.com/hellno/deckard/discussions
about: >-
Have a general question, idea, or want to talk through an approach? Use GitHub Discussions
instead of opening an issue.
49 changes: 49 additions & 0 deletions .github/ISSUE_TEMPLATE/feature_request.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
name: Feature request
description: Suggest an idea or improvement for Deckard.
title: "[feature]: "
labels: ["enhancement", "triage"]
body:
- type: markdown
attributes:
value: |
Thanks for the idea. Deckard is `0.0.1-alpha` — experimental, pre-1.0 software — so the
roadmap is still forming. A clear problem statement helps far more than a fully-specified
solution.

> Not a feature request? For security reports see [`SECURITY.md`](https://github.com/hellno/deckard/blob/main/SECURITY.md);
> for open-ended questions use [Discussions](https://github.com/hellno/deckard/discussions).

- type: textarea
id: problem
attributes:
label: Problem / motivation
description: What problem are you trying to solve? What is the use case, and who is affected? Describe the situation, not just the fix.
placeholder: I'm always frustrated when ... / Today there is no way to ...
validations:
required: true

- type: textarea
id: solution
attributes:
label: Proposed solution
description: What would you like to happen? Describe the behavior or capability you have in mind.
placeholder: Deckard could ...
validations:
required: true

- type: textarea
id: alternatives
attributes:
label: Alternatives considered
description: What other approaches or workarounds have you considered, and why are they insufficient?
placeholder: I considered ..., but ...
validations:
required: false

- type: textarea
id: context
attributes:
label: Additional context
description: Anything else — mockups, links, prior art, or how this fits the self-custodial / privacy-by-default direction.
validations:
required: false
52 changes: 52 additions & 0 deletions .github/PULL_REQUEST_TEMPLATE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
<!--
Deckard is 0.0.1-alpha, security-sensitive software (it holds private keys, BIP-39 seeds,
and an encrypted keystore). Please complete every section. PRs that leave the Definition of
Done checklist unverified will not be merged.
-->

## Summary

<!-- What does this PR change, and why? Keep it focused. -->

## Linked issue

<!-- e.g. "Closes #123". If there is no issue, briefly explain the motivation here. -->

Closes #

## Definition of Done

All of the following must hold before this PR can merge. **Paste the command output as evidence —
do not check a box you have not verified.**

- [ ] `cargo fmt --all --check` is clean
- [ ] `just check` is green — clippy `-D warnings` on **both** the default config **and** `--features tray`
- [ ] `cargo test --workspace` is green
- [ ] No new or changed dependencies in `Cargo.toml` / `Cargo.lock` (unless explicitly approved in this PR;
the git GPUI stack is bumped only via `just bump-gpui`, never hand-edited)
- [ ] Any visual/UI change follows `DESIGN.md` (amber = human, cyan = agent; sidebar/contextual-views IA;
clear-signing / seed-reveal trust affordances)
- [ ] Secrets (seed / key / passphrase) stay in `Zeroizing` and are never logged or `Debug`-printed

<details>
<summary>Evidence (paste command output here)</summary>

```text
$ cargo fmt --all --check
# (output)

$ just check
# (output)

$ cargo test --workspace
# (output)
```

</details>

## Notes for reviewers

<!--
Anything that helps review: security-relevant trade-offs, areas that need a careful look,
follow-ups deliberately left out of scope, or test caveats (e.g. #[ignore] network tests).
-->
116 changes: 116 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,116 @@
# Changelog

All notable changes to **Deckard** — a native, self-custodial Ethereum wallet
(GPUI + Rust; macOS + Linux) — are documented in this file.

The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

> **Pre-1.0 alpha.** Deckard is experimental software under active development. While
> pre-1.0, the public surface (APIs, the frozen wire contract, on-disk keystore format,
> CLI/commands) may change between releases without a major-version bump, per semver's
> `0.y.z` rules. **Do not use Deckard with real funds or real mainnet keys** — testnet
> or throwaway keys only. No third-party security audit has been performed.

## [Unreleased]

### Added

### Changed

### Fixed

## [0.0.1-alpha] - 2026-06-10

First tagged alpha. This is a security-sensitive, experimental wallet: the core
trust mechanisms are built and de-risked, but the end-to-end demo flow is not yet
wired together. See [`STATUS.md`](STATUS.md) for the authoritative, beat-by-beat
state of the build, and [`DESIGN.md`](DESIGN.md) for the design system.

Licensed under **AGPL-3.0-or-later** (see [`LICENSE`](LICENSE) and [`NOTICE`](NOTICE)).
Forked from the [`deck`](https://github.com/hellno/deck) GPUI starter (0BSD, which
permits relicensing), now its own project.

Workspace layout (a virtual Cargo workspace, all crates under `crates/`):

- **`deckard-app`** — the GPUI application (binary `deckard`).
- **`deckard-core`** — the headless engine: provider / verified reads, balances,
HD keys, keystore, and the key-less shield builder.
- **`deckard-contract`** — the frozen wire contract (`Intent` / `Decision` /
`Policy` / RPC / `ReadStatus`).
- **`deckard-signerd`** — the process-isolated signer daemon.

### Added

- **Encrypted BIP-39 keystore + onboarding.** Self-custodial seed-vault flow that
generates or imports a BIP-39 seed and stores it encrypted at rest.
- **Live on-chain balances.** Real balances over an `alloy` provider, batched through
Multicall3.
- **Helios-verified reads.** Reads are verified against a Helios light client — **no
third-party RPC is trusted by default** — with a `ReadStatus` badge surfaced in the
app.
- **Receive.** Your address plus a QR code.
- **Command palette.** Keyboard-first navigation across the app.
- **Design system (`DESIGN.md`).** The amber-on-near-black visual language, including
the two-signal actor model (amber = human, cyan = agent), wired into onboarding,
portfolio, receive, palette, and settings.
- **Process-isolated signer daemon (`deckard-signerd`).** A separate process holds the
key and gates every write over a Unix domain socket, with a policy gate, a
`propose → Decision → execute` flow, and a STOP control that zeroizes the in-memory
secret. The app talks to it through a socket signer client.
- **The shield hero (auto-private via Railgun).** The auto-shield mechanism — the
`deckard-core` key-less shield builder plus daemon broadcast — is **wired and
black-box tested on an anvil fork.** (See *Known limitations* for what is not yet
reachable from the app or an agent.)
- **Agentic-engineering policy.** A workspace-wide lint / CI / supply-chain policy
that denies `todo!`, `dbg!`, and ignored `Result`s, with a documented Definition of
Done (see *Notes*).

### Security

- **Process isolation.** The signing key lives only inside `deckard-signerd`, a
separate process reached over a Unix domain socket; the GUI never holds it.
- **Verified reads by default.** Chain reads are checked against a Helios light client
rather than trusting any single third-party RPC.
- **Keystore at rest.** The seed is sealed in an Argon2id + XChaCha20-Poly1305
envelope.
- **Secrets in `Zeroizing`.** Seeds, keys, and passphrases are held in zeroizing
buffers and are never logged or `Debug`-printed.
- **`#![forbid(unsafe_code)]` in `deckard-core`** (the trust core); the app crate sets
`unsafe_code = "deny"`.

### Notes

- **Definition of Done** (all must hold for a change to be considered done):
1. `cargo fmt --all --check` is clean.
2. `just check` is green — clippy `-D warnings` on **both** the default and
`--features tray` configurations.
3. `cargo test --workspace` is green.
4. No new or changed dependencies in `Cargo.toml` / `Cargo.lock` unless explicitly
approved.
- **Commands:** `just run` (build signerd + run the app), `just core` (the fast engine
inner loop), `just check` (lint both configs), `cargo test --workspace`, and
`just bundle` (build a macOS `.app`). The toolchain is pinned in
`rust-toolchain.toml`.

### Known limitations

This is an **alpha**. It is **not** production-ready and **not** safe for real funds —
use testnet or throwaway keys only, and never a real mainnet key. No third-party
security audit has been done.

- **Send UI is gated** — marked "next release"; not available in this build.
- **Swap is a TODO** — the button is disabled.
- **No agent / MCP surface** — `deckard-mcp` is **not built**; only the wire contract
and the daemon socket exist for it to build on.
- **Receive-watcher auto-detect is a TODO** — inbound funds are not auto-detected and
the shield is **not** yet triggerable from the app or an agent. The shield hero is
reachable only from the test/manual path, not on-screen.
- **Some tests are `#[ignore]`** — the network-dependent suites (notably
`signerd/shield_e2e`) need a local `anvil` plus an archive RPC and are not run by
default `cargo test`; the default-on `anvil_e2e` silently skips if `anvil` is
missing, and some unit tests exercise mocked transports / a fake recording daemon
rather than a live chain. See the test caveats in [`STATUS.md`](STATUS.md).

[Unreleased]: https://github.com/hellno/deckard/compare/v0.0.1-alpha...HEAD
[0.0.1-alpha]: https://github.com/hellno/deckard/releases/tag/v0.0.1-alpha
Loading
Loading