"me-web?" 0.14.0: the first three cards, drawn again
Build / Desktop, server and tools (push) Successful in 1m15s
Release / Every platform, the server, the release (push) Successful in 10m13s

- The three pictures at the top are new: a small planet at dusk under twinkling stars, with town lights on its night
  side, drifting clouds, smoke from the chimney and trees that sway.
- The house and the block of flats now have lit walls, a tiled roof, glowing windows and soft shadows.
- The photo now flies like a little print and the visitor is a letter, because a letter needs an address. Each flies
  along its route with a glowing trail. At the house the door lights up green; at the block of flats the letter stops
  at the main door while the windows light up one by one, and a question mark appears.
- The path from your device to the internet glows in each step's colour. While a step is checked, an arc circles it
  and small lights travel along the wires, and a ring spreads out when its answer arrives.
- In right-to-left languages the small picture badge stays in its corner instead of covering the drawing.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
thepraandClaude Opus 5.5 committed 2026-10-17 01:49:41 +02:00
1 parent 91c92c80e9
commit 3d6315fe1e
8 files changed
+1200 -318

No files matched your search

+9 -2
View File
@@ -62,7 +62,7 @@ The Android release key: alias `meweb`, certificate SHA-256
|---|---|
| `src/MeWeb.Shared` | `Endpoints.cs` (routes and hosts), wire contracts, `MeWebJsonContext`, generated `BuildInfo` |
| `src/MeWeb.Core` | the checks, no UI: `Net/` (address kinds, local network, TTL route, STUN, the probe's `Answerer`, DNS, speed, the device), `Router/` (UPnP IGD, NAT-PMP, PCP; `PortMapper` opens and removes mappings, `Leftovers` remembers them across a crash), `Mail/` (port 25, reverse name, blocklists through the user's resolver), `Knowledge/` (provider map and profiles), `History/` (checks, shared submissions), `Checks/` (`CheckRunner`, `Verdicts`, `Reach`, `Uses`, `ServerProbe`, `SharePayload`) |
| `src/MeWeb.App` | Avalonia views and view models, `Services/Localizer.cs` (+ `{s:Tr Key}`), `Strings/<code>.json`, `Resources/Colors.axaml`; `Resources/Icons.axaml` (Lucide, 24 units, for cards and lists) and `Resources/Art.axaml` (the path's drawings, 48 units: `Art<Name>Base`, up to three `Beat`s that pulse in turn while the step is checked and take its verdict colour, and a `Spin` for the globe). The path is a vertical zig-zag of `PathNodeViewModel`s, and the same nodes carry the result cards (`Cards`, regrouped by `MainViewModel.Home`), so a step in the path and its group of cards are one object |
| `src/MeWeb.App` | Avalonia views and view models, `Services/Localizer.cs` (+ `{s:Tr Key}`), `Strings/<code>.json`, `Resources/Colors.axaml`; `Resources/Icons.axaml` (Lucide, 24 units, for cards and lists) and `Resources/Art.axaml` (the path's drawings, 48 units: `Art<Name>Base`, up to three `Beat`s that pulse in turn while the step is checked and take its verdict colour, and a `Spin` for the globe; then the intro planet's still pieces as `DrawingImage`s with a fixed `Viewbox`: `ArtHouse`, `ArtBlock`, `ArtPine`, `ArtOak`, `ArtPhoto`, `ArtLetter`, `ArtServer`). The path is a vertical zig-zag of `PathNodeViewModel`s, and the same nodes carry the result cards (`Cards`, regrouped by `MainViewModel.Home`), so a step in the path and its group of cards are one object |
| `src/MeWeb.Desktop` | desktop head (`meweb` executable), Windows manifest |
| `src/MeWeb.Android` | Android head (`software.arasaka.meweb`), resources, manifest |
| `src/MeWeb.Server` | `meweb.arasaka.software`: `/api/info`, `/api/ip`, the download page `/` and `/privacy` (en, it), `/download/{platform}` from the latest Gitea release, the probe (`/api/probe/ticket`, `/api/probe/{id}`) and shared findings (`/api/share`, files under `/var/lib/meweb/shares`, swept after `KeepDays`) |
@@ -205,7 +205,12 @@ The Android release key: alias `meweb`, certificate SHA-256
`Views/IntroScene` is one small planet in three `Step`s: 0, a phone far away sends a photo into the house and on to
the parents' tablet (heart); 1, a house with its own number and a small always-on computer in a callout lets a
visitor in (green door, tick); 2, that house next to a block of flats with one number for all, where the visitor
stops at the main door (question mark). The third card asks whether the reader's home has an address of its own and
stops at the main door (question mark). The visitor is a letter, because a letter needs an address; it and the photo
fly along the dotted routes with a comet trail (a gradient stroke whose ends are set each frame in
`RelativeUnit.Absolute`), and the world around them keeps moving (stars, town lights on the night side, clouds,
chimney smoke, swaying trees). The still drawings are `DrawingImage`s in `Art.axaml`; only what moves is a control,
and it moves through its `RenderTransform` (scale, rotate, translate), never `Canvas.SetLeft`, so a frame does not
lay the canvas out again. The third card asks whether the reader's home has an address of its own and
offers two answers: "Yes, let's find out" runs the check, "Not for me" shows `Goodbye` for two seconds and closes the
app (`IPlatform.Quit`, the desktop lifetime's `Shutdown`). The six uses follow as chips, the QR codes wait folded
at the bottom.
@@ -216,6 +221,8 @@ The Android release key: alias `meweb`, certificate SHA-256
is the frame loop the scenes share; `Resting` parks a scene that is folded or off screen, so it starts again from the
beginning when it comes back. The screenshot tool calls `Hold()` to draw each at its `Poster` moment, because the
headless clock is real time.
- **A `Button` clips its content to its own bounds.** The path's node buttons (`Button.hop`) turn `ClipToBounds` off
on the button and its `ContentPresenter`, or the verdict aura and the running pulse are cut into a 90-pixel square.
- **Nothing that is being checked is left empty.** From the moment a check starts, every use has a card with its
title, a "Checking" chip, two skeleton lines and a sweeping glint (`UseViewModel` with no finding), and every
running check card shows the same; the verdicts replace them as they arrive. While a check runs, the share card sits