Merge: keep remote version of source-notes.md
All checks were successful
Build and deploy docs / deploy (push) Successful in 3s
All checks were successful
Build and deploy docs / deploy (push) Successful in 3s
This commit is contained in:
15
.gitea/workflows/deploy.yml
Normal file → Executable file
15
.gitea/workflows/deploy.yml
Normal file → Executable file
@@ -8,11 +8,16 @@ jobs:
|
|||||||
deploy:
|
deploy:
|
||||||
runs-on: docs-runner # must match the label of your registered act_runner
|
runs-on: docs-runner # must match the label of your registered act_runner
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Load environment
|
||||||
uses: actions/checkout@v4
|
run: |
|
||||||
|
echo "PATH=$HOME/venv/bin:$PATH" >> $GITHUB_ENV
|
||||||
|
|
||||||
|
- name: Checkout repository
|
||||||
|
run: |
|
||||||
|
git clone --depth 1 https://oauth2:${GITHUB_TOKEN}@${GITHUB_SERVER_URL#https://}/${GITHUB_REPOSITORY} .
|
||||||
|
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: pip install --break-system-packages mkdocs-material mkdocs-macros-plugin pyyaml
|
run: pip install mkdocs-material mkdocs-macros-plugin pyyaml pillow mkdocs-glightbox
|
||||||
|
|
||||||
- name: Generate placeholders for missing screenshots
|
- name: Generate placeholders for missing screenshots
|
||||||
run: python3 tools/make_placeholders.py
|
run: python3 tools/make_placeholders.py
|
||||||
@@ -21,4 +26,4 @@ jobs:
|
|||||||
run: mkdocs build --strict
|
run: mkdocs build --strict
|
||||||
|
|
||||||
- name: Publish
|
- name: Publish
|
||||||
run: rsync -a --delete site/ /var/www/bal-docs/
|
run: rsync -a --delete site/ $BAL_DOCS_DEPLOY_DIR
|
||||||
|
|||||||
0
.gitignore
vendored
Normal file → Executable file
0
.gitignore
vendored
Normal file → Executable file
0
internal/README.md
Normal file → Executable file
0
internal/README.md
Normal file → Executable file
0
internal/brand-assets.md
Normal file → Executable file
0
internal/brand-assets.md
Normal file → Executable file
0
internal/design-choices-DRAFT.md
Normal file → Executable file
0
internal/design-choices-DRAFT.md
Normal file → Executable file
105
internal/screenshot-checklist.md
Normal file → Executable file
105
internal/screenshot-checklist.md
Normal file → Executable file
@@ -16,112 +16,27 @@ Placeholders never overwrite a real image.
|
|||||||
## Capture rules — keep these identical everywhere
|
## Capture rules — keep these identical everywhere
|
||||||
|
|
||||||
- **Electrum window only**, not the whole desktop.
|
- **Electrum window only**, not the whole desktop.
|
||||||
- Windows: ++win+shift+s++ (Snipping Tool) or use `grim -g "$(slurp)" shot.png` if you prefer
|
Windows: ++win+shift+s++ · macOS: ++cmd+shift+4++ then ++space++ · Linux: your screenshot tool's window mode.
|
||||||
- macOS: ++cmd+shift+4++ then ++space++ to capture a window
|
- **~1280×800**, system zoom at 100%.
|
||||||
- Linux: `gnome-screenshot -w` or `import -window root shot.png` (ImageMagick)
|
- **One theme** for the entire manual — never mix light and dark shots.
|
||||||
- **1280×720** at system zoom 100%** — this matches Electrum's typical window size when maximized on a laptop.
|
- **PNG** format.
|
||||||
- **Light theme** (default Electrum) for consistency. Never mix light and dark.
|
|
||||||
- **PNG** format, no JPEG.
|
|
||||||
- **Crop tightly** to the Electrum window; include title bar and the relevant tab/dialog.
|
|
||||||
|
|
||||||
## Setting up the test wallet
|
|
||||||
|
|
||||||
Use **testnet** (not mainnet) so no real Bitcoin is at risk. In Electrum:
|
|
||||||
1. Create → New wallet
|
|
||||||
2. Name: `Screenshot_Test` or similar (will show in the title bar)
|
|
||||||
3. Standard wallet → Create new seed
|
|
||||||
4. Write down the seed (you'll need to restore it later)
|
|
||||||
5. Set a simple password like `test` (will be shown in password dialogs)
|
|
||||||
6. In Electrum's Network tab, switch to testnet servers
|
|
||||||
|
|
||||||
Get testnet Bitcoin from a faucet (e.g. testnet-faucet.mempool.space) to populate the wallet so screenshots show real-looking balances.
|
|
||||||
|
|
||||||
## Data hygiene — this is the important part
|
## Data hygiene — this is the important part
|
||||||
|
|
||||||
Screenshots of an inheritance plugin leak real information if you are careless.
|
Screenshots of an inheritance plugin leak real information if you are careless.
|
||||||
|
|
||||||
- Use the **dedicated testnet wallet** set up above.
|
- Use a **dedicated test wallet**, ideally on testnet.
|
||||||
- **Fake heir names** (Jonny, Andrea, Emma — as in the original manual).
|
- **Fake heir names** (Jonny, Andrea — as in the original manual).
|
||||||
- **Round, obviously fake amounts** (0.05 BTC, 0.1 BTC, never suspicious multiples like 0.0314 BTC).
|
- **Round, obviously fake amounts.**
|
||||||
- **No real Bitcoin address** that belongs to you or anyone you know — use generated testnet addresses or Bitcoin StackExchange examples.
|
- **No real Bitcoin address** that belongs to you or anyone you know.
|
||||||
- **Obfuscate file paths**: the title bar will show your wallet filename. Use a generic name like `Screenshot_Test`, not `MyWallet_MainAccount`.
|
- Check the window title bar, the status bar, and any visible file paths — they often
|
||||||
- Check the window title bar, the status bar, tooltips, and any dialogs — they often contain a username or a real wallet filename. Crop or blur them if necessary.
|
contain a username or a real wallet filename.
|
||||||
|
|
||||||
## Annotations
|
## Annotations
|
||||||
|
|
||||||
If you add arrows or highlight boxes, keep one consistent style across the whole manual:
|
If you add arrows or highlight boxes, keep one consistent style across the whole manual:
|
||||||
same colour, same stroke width, same arrowhead. Inconsistent annotation looks worse than none.
|
same colour, same stroke width, same arrowhead. Inconsistent annotation looks worse than none.
|
||||||
|
|
||||||
## The 24 screenshots — what to capture
|
|
||||||
|
|
||||||
All are from the **HEIRS and WILL tabs** or the **startup wizard**. Placeholder images already exist in `docs/img/`; replace them with real shots.
|
|
||||||
|
|
||||||
### Installation & setup (6 images)
|
|
||||||
|
|
||||||
| File | Where | What to show |
|
|
||||||
|---|---|---|
|
|
||||||
| `install-electrum-plugins-menu.png` | Electrum → Tools → Plugins | The "Plugins" dialog with built-in plugins listed. Show the internal plugins, and note the "Add" button for external plugins. |
|
|
||||||
| `install-from-file.png` | Electrum → Tools → Plugins → Add | File selector dialog, pointing to the BAL `.zip` file. |
|
|
||||||
| `install-plugin-enabled.png` | Electrum → Tools → Plugins | Plugin list with "Bitcoin After Life" checked/enabled. |
|
|
||||||
| `overview-tabs.png` | Electrum main window | The Electrum window with HEIRS and WILL tabs visible. Show the tab bar clearly. |
|
|
||||||
| `hardware-wallet-signing.png` | During signing on a hardware wallet | A hardware wallet confirmation screen (Ledger, Trezor, etc.) asking the user to confirm. If you don't have one, skip and update the manual to note it's optional. |
|
|
||||||
| `welist-website.png` | https://welist.bitcoin-after.life/ | The WeList website showing available Will-Executors and their fees. |
|
|
||||||
|
|
||||||
### Wizard — 5 steps (5 images)
|
|
||||||
|
|
||||||
Start the wizard from **HEIRS → Add new heir → (wizard opens)**.
|
|
||||||
|
|
||||||
| File | Wizard step | What to show |
|
|
||||||
|---|---|---|
|
|
||||||
| `wizard-01-start.png` | Welcome screen | The first wizard dialog with the title and brief explanation. |
|
|
||||||
| `wizard-02-heirs.png` | Add heirs | A few heir rows filled in: e.g., Jonny (50%), Andrea (50%), with Bitcoin addresses. |
|
|
||||||
| `wizard-03-delivery-time.png` | Delivery date | The date/time picker. Show either the calendar view or the Raw input field. |
|
|
||||||
| `wizard-04-willexecutors.png` | Select Will-Executors | The list of available Will-Executors from WeList with checkboxes, fees visible. Check a few (e.g., 3–4 servers). |
|
|
||||||
| `wizard-05-summary.png` | Review & sign | The final summary showing all choices: heirs, date, servers, total fee. |
|
|
||||||
|
|
||||||
### HEIRS tab (3 images)
|
|
||||||
|
|
||||||
| File | What to show |
|
|
||||||
|---|---|
|
|
||||||
| `heirs-tab.png` | The HEIRS tab overview with a list of added heirs (if any). |
|
|
||||||
| `heirs-new-heir.png` | The "Add new heir" button or dialog. |
|
|
||||||
| `heirs-export.png` | The export dialog/list (if available in the plugin UI). |
|
|
||||||
|
|
||||||
### WILL tab (3 images)
|
|
||||||
|
|
||||||
| File | What to show |
|
|
||||||
|---|---|
|
|
||||||
| `will-tab.png` | The WILL tab with one or more inheritance transactions listed. Show the columns and status. |
|
|
||||||
| `will-server-column.png` | Zoom in on the "Server" column showing the 5 textual states (OK, pending, awaiting first broadcast, unknown, overdue). |
|
|
||||||
| `will-context-menu.png` | Right-click on a will entry to show the context menu (e.g., "View details", "Copy fee address", etc.). |
|
|
||||||
| `will-details.png` | The details dialog for a single will, showing transaction data, date, servers, status. |
|
|
||||||
|
|
||||||
### Backup & signing (3 images)
|
|
||||||
|
|
||||||
| File | Where | What to show |
|
|
||||||
|---|---|---|
|
|
||||||
| `backup-transaction-save.png` | WILL tab → right-click → Backup transaction | File save dialog, showing the default `.psbt` filename. |
|
|
||||||
| `settings-*.png` (general, auth, advanced) | HEIRS or WILL tab settings | Plugin settings dialogs (if they exist in the UI). Capture the "General", "Authentication", and "Advanced" tabs or panels. |
|
|
||||||
|
|
||||||
### Check Alive (advanced mode) (1 image)
|
|
||||||
|
|
||||||
| File | Where | What to show |
|
|
||||||
|---|---|---|
|
|
||||||
| `check-alive-prompt.png` | Opening the wallet after Check Alive triggers | The dialog asking the user to refresh the will. |
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Workflow to capture all 24
|
|
||||||
|
|
||||||
1. **Set up testnet wallet** (see "Setting up the test wallet" above).
|
|
||||||
2. **Install BAL plugin** in your Electrum instance.
|
|
||||||
3. **Go through the wizard** once to understand the flow, then capture each step.
|
|
||||||
4. **Create a few test wills** (different dates, different heir counts) so you have variety for the WILL tab screenshots.
|
|
||||||
5. **Capture the HEIRS tab** at various states (empty, with heirs, export dialog).
|
|
||||||
6. **Capture the WILL tab** at various states (wills in different states, details dialog, context menus).
|
|
||||||
7. **Save each** as `docs/img/<filename>` using the names from the table above.
|
|
||||||
8. **Run** `python3 tools/make_placeholders.py --list` to verify all 24 are found (should show 0 missing).
|
|
||||||
|
|
||||||
## Adding a new image
|
## Adding a new image
|
||||||
|
|
||||||
1. Add an entry to `screenshots.yml` (`file`, `page`, `shows`).
|
1. Add an entry to `screenshots.yml` (`file`, `page`, `shows`).
|
||||||
|
|||||||
@@ -21,26 +21,13 @@ Compiled July 2026. Keep this updated whenever the manual is revised.
|
|||||||
| "BAL 1.0" | Plugin v0.2.6 |
|
| "BAL 1.0" | Plugin v0.2.6 |
|
||||||
| Manual step-by-step parameter setup | Guided **wizard** since v0.2.0 |
|
| Manual step-by-step parameter setup | Guided **wizard** since v0.2.0 |
|
||||||
| Check Alive is a base parameter | **Advanced mode** only |
|
| Check Alive is a base parameter | **Advanced mode** only |
|
||||||
| ~~9-state colour table for transaction status~~ | **Still correct — this was my error.** Verified 2026-07-27 by sampling pixels from `will-tab.png` (v0.6.1): `#2BC8ED` Signed and `#8AFA6C` Checked match the PDF exactly. Status (9 colour-coded stages, cumulative, dot-joined) and Server (5 textual labels) are **two different columns** that coexist. The PDF documents only Status because Server is newer. |
|
| 9-state colour table for transaction status | **Server column** with 5 textual labels |
|
||||||
| Postponing always requires an on-chain invalidation | Balance/heir changes → will **anticipated by one day and redistributed**, no on-chain fee. On-chain invalidation only for a genuine postponement |
|
| Postponing always requires an on-chain invalidation | Balance/heir changes → will **anticipated by one day and redistributed**, no on-chain fee. On-chain invalidation only for a genuine postponement |
|
||||||
| Will-Executor lists come from BitcoinTalk | **WeList** directory, downloaded by default |
|
| Will-Executor lists come from BitcoinTalk | **WeList** directory, downloaded by default |
|
||||||
| "prepare / sign / broadcast" run automatically on close | Still true, but the plugin **asks** — it never signs on your behalf |
|
| "prepare / sign / broadcast" run automatically on close | Still true, but the plugin **asks** — it never signs on your behalf |
|
||||||
|
|
||||||
## Version bumps log
|
|
||||||
|
|
||||||
| Date | plugin_version | electrum_latest | Note |
|
|
||||||
|---|---|---|---|
|
|
||||||
| 2026-07 (initial) | 0.2.6 | 4.7.2 | Last version explicitly documented in a release ("tested with electrum 4.7.1") |
|
|
||||||
| 2026-07-26 | 0.6.1 | 4.8.0 | Jump from 0.2.6 → 0.6.1: releases v0.5.18/v0.6.0/v0.6.1 mostly cover Tor/onion will-executor support. |
|
|
||||||
| 2026-07-27 | 0.6.1 | 4.8.0 | Confirmed: v0.6.1 tested against Electrum 4.8.0. `electrum_tested` updated from 4.7.1 → 4.8.0; the compatibility table row simplified to a single Electrum version. |
|
|
||||||
|
|
||||||
## To verify with the developers before the next revision
|
## To verify with the developers before the next revision
|
||||||
|
|
||||||
0. ~~Electrum version actually tested for plugin v0.6.1~~ — confirmed 2026-07-27: Electrum 4.8.0.
|
|
||||||
0b. ~~Architecture diagram version label mismatch~~ — fixed 2026-07-26: `docs/img/architecture.svg`
|
|
||||||
now reads "Python · v0.6.1", matching `plugin_version`. Still worth asking the diagram's source
|
|
||||||
(likely a design tool, not this repo) to drop the hardcoded version label so it doesn't need a
|
|
||||||
manual edit at every future release.
|
|
||||||
1. **Exact execution tolerance.** The manual states "~1 hour after the set time, due to the
|
1. **Exact execution tolerance.** The manual states "~1 hour after the set time, due to the
|
||||||
11-block median". Confirm this still holds.
|
11-block median". Confirm this still holds.
|
||||||
2. **Relative (Raw) date syntax.** The PDF documents `d` and `y` suffixes. Confirm which
|
2. **Relative (Raw) date syntax.** The PDF documents `d` and `y` suffixes. Confirm which
|
||||||
@@ -52,21 +39,6 @@ Compiled July 2026. Keep this updated whenever the manual is revised.
|
|||||||
5. **Fee range currently charged** by Will-Executors on the network (for the recruitment article).
|
5. **Fee range currently charged** by Will-Executors on the network (for the recruitment article).
|
||||||
6. **Minimum system requirements** for a Will-Executor node, stated concretely.
|
6. **Minimum system requirements** for a Will-Executor node, stated concretely.
|
||||||
7. **BIP 128 critique** — see `design-choices-DRAFT.md`. The single most exposed point.
|
7. **BIP 128 critique** — see `design-choices-DRAFT.md`. The single most exposed point.
|
||||||
9. **`docs/comparison.md` (new, 2026-07-28) — competitor comparison, needs review.** Facts on
|
|
||||||
Nunchuk (Iron Hand ~$120/yr, Honey Badger ~$480/yr, no-KYC/email only, accepts BTC or card,
|
|
||||||
collaborative custody = 1 platform key; Nunchuk 2.0 added on-chain timelock+Miniscript
|
|
||||||
inheritance, Nov 2025) and Liana (free/open-source, Miniscript relative timelocks, self-hosted
|
|
||||||
or Liana Connect hosted backend) were pulled from public web sources mid-2026. **Prices change.**
|
|
||||||
Corrected the user's original premise: Nunchuk is NOT KYC — the honest BAL differentiator is
|
|
||||||
"no recurring subscription + no third-party-held key", not "no credit card". Cross-check with
|
|
||||||
`design-choices-DRAFT.md` editorial rules (no "investment/yield", no disparagement) before
|
|
||||||
publishing. Page carries a draft warning.
|
|
||||||
8. **`docs/examples.md` (new, 2026-07-28) — needs a full accuracy pass.** Written from
|
|
||||||
`updating.md`/`delivery-time.md` rather than tested behaviour; user flagged it as containing
|
|
||||||
"parecchie imprecisioni" without specifying which. Marked with a draft warning on the page
|
|
||||||
itself. Re-check in particular: whether ordinary balance/heir changes really re-anticipate for
|
|
||||||
free every time (vs. some limit or condition), and whether postponing to hold a rolling 5-year
|
|
||||||
horizon really costs only "a small miner fee" as stated.
|
|
||||||
|
|
||||||
## Deliberately left out of the published manual
|
## Deliberately left out of the published manual
|
||||||
|
|
||||||
|
|||||||
80
tools/make_placeholders.py
Executable file
80
tools/make_placeholders.py
Executable file
@@ -0,0 +1,80 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
"""Generate a visible placeholder for every screenshot listed in screenshots.yml
|
||||||
|
that does not yet exist in docs/img/.
|
||||||
|
|
||||||
|
Real screenshots are never overwritten: drop the real PNG in docs/img/ with the
|
||||||
|
manifest filename and this script will simply skip it.
|
||||||
|
|
||||||
|
Usage:
|
||||||
|
python3 tools/make_placeholders.py # fill in what's missing
|
||||||
|
python3 tools/make_placeholders.py --list # show what is still missing
|
||||||
|
python3 tools/make_placeholders.py --force # redraw ALL placeholders
|
||||||
|
# (never touches real screenshots
|
||||||
|
# unless they are placeholders)
|
||||||
|
"""
|
||||||
|
import sys
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
try:
|
||||||
|
import yaml
|
||||||
|
except ImportError:
|
||||||
|
sys.exit("Missing dependency: pip install pyyaml")
|
||||||
|
from PIL import Image, ImageDraw
|
||||||
|
|
||||||
|
ROOT = Path(__file__).resolve().parent.parent
|
||||||
|
MANIFEST = ROOT / "screenshots.yml"
|
||||||
|
IMG_DIR = ROOT / "docs" / "img"
|
||||||
|
W, H = 1280, 720
|
||||||
|
BG = (238, 241, 244) # --bal-bg #eef1f4
|
||||||
|
FG = (91, 102, 114) # --bal-muted #5b6672
|
||||||
|
ACCENT = (45, 108, 223) # --bal-accent #2d6cdf
|
||||||
|
# Backgrounds ever used by this script — lets --force recognise its own output
|
||||||
|
# (including older revisions) without ever touching a real screenshot.
|
||||||
|
KNOWN_PLACEHOLDER_BGS = {BG, (241, 243, 245)}
|
||||||
|
|
||||||
|
|
||||||
|
def draw_placeholder(path: Path, name: str, shows: str) -> None:
|
||||||
|
img = Image.new("RGB", (W, H), BG)
|
||||||
|
d = ImageDraw.Draw(img)
|
||||||
|
d.rectangle([8, 8, W - 8, H - 8], outline=ACCENT, width=4)
|
||||||
|
d.text((48, H // 2 - 60), "SCREENSHOT NEEDED", fill=ACCENT)
|
||||||
|
d.text((48, H // 2 - 20), f"file: docs/img/{name}", fill=FG)
|
||||||
|
d.text((48, H // 2 + 10), f"shows: {shows}", fill=FG)
|
||||||
|
d.text((48, H - 60), "Replace this file with the real screenshot (same filename).", fill=FG)
|
||||||
|
img.save(path)
|
||||||
|
|
||||||
|
|
||||||
|
def is_placeholder(path: Path) -> bool:
|
||||||
|
"""A placeholder is exactly W x H with our flat background colour."""
|
||||||
|
try:
|
||||||
|
with Image.open(path) as im:
|
||||||
|
return im.size == (W, H) and im.convert("RGB").getpixel((2, 2)) in KNOWN_PLACEHOLDER_BGS
|
||||||
|
except Exception:
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
def main() -> None:
|
||||||
|
manifest = yaml.safe_load(MANIFEST.read_text(encoding="utf-8"))
|
||||||
|
IMG_DIR.mkdir(parents=True, exist_ok=True)
|
||||||
|
missing, created = [], 0
|
||||||
|
for item in manifest["screenshots"]:
|
||||||
|
target = IMG_DIR / item["file"]
|
||||||
|
if target.exists() and not ("--force" in sys.argv and is_placeholder(target)):
|
||||||
|
continue
|
||||||
|
missing.append(item)
|
||||||
|
if "--list" not in sys.argv:
|
||||||
|
draw_placeholder(target, item["file"], item.get("shows", ""))
|
||||||
|
created += 1
|
||||||
|
if "--list" in sys.argv:
|
||||||
|
if not missing:
|
||||||
|
print("All screenshots present.")
|
||||||
|
else:
|
||||||
|
print(f"{len(missing)} screenshot(s) still missing:")
|
||||||
|
for m in missing:
|
||||||
|
print(f" - {m['file']:38s} ({m.get('page','')}) — {m.get('shows','')}")
|
||||||
|
else:
|
||||||
|
print(f"{created} placeholder(s) generated, {len(manifest['screenshots']) - created} real image(s) already in place.")
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
Reference in New Issue
Block a user