F-Droid page: screenshots, a banner and a fuller description
Build / Desktop, server and tools (push) Successful in 1m5s

The app's page in F-Droid had a stretched icon across the top, no pictures and two lines of text. It now shows six
screenshots in English and Italian (the opening screen, what you can host, the path from the phone to the internet,
one finding explained, a check under way and exactly what sharing would send), a banner, the icon at full size and
a description of what the app checks and what stays on the phone.

The screenshots are drawn from an invented connection, not the computer that makes them: documentation addresses,
a made-up provider, nothing that belongs to anyone. One command redraws them after a change to the screens:
dotnet run --project tools/Screenshots -- --store. The listing is in the layout Google Play uses, so the same files
will serve there.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01W4YtEKqxKjKyHkFzuRVMNA
This commit is contained in:
thepraandClaude Opus 5.5 committed 2026-11-08 20:53:50 +01:00
1 parent 8c079e43c9
commit 5b2210a8a7
26 files changed
+214 -18

No files matched your search

+112
View File
@@ -0,0 +1,112 @@
using MeWeb.Core.Checks;
using MeWeb.Core.History;
using MeWeb.Core.Knowledge;
using MeWeb.Core.Mail;
using MeWeb.Core.Net;
using MeWeb.Core.Router;
using MeWeb.Shared;
namespace MeWeb.Screenshots;
public class StorePhone : SystemPlatform
{
public override DeviceKind Device => DeviceKind.Phone;
public override string Name => "android";
}
public static class StoreRun
{
const string PhoneAddress = "192.168.1.23";
const string PhoneAddressV6 = "2001:db8:4d2:1a00:5c3e:9bff:fe12:3456";
const string RouterInside = "192.168.1.1";
const string RouterOutside = "100.64.12.34";
const string SharedExit = "203.0.113.45";
const uint ExampleAsn = 64500;
const string ExampleProvider = "Example Net";
public static RunReport Finished(KnowledgeBase knowledge)
{
var run = new RunReport
{
StartedAt = new DateTimeOffset(2026, 11, 2, 18, 30, 0, TimeSpan.Zero),
Device = DeviceKind.Phone,
Online = new OnlineReport { State = OnlineState.Online },
Local = new LocalSnapshot
{
Interfaces = [new LocalInterface { Name = "wlan0", Kind = LinkKind.Wifi, SpeedMbps = 866, Addresses = [PhoneAddress, PhoneAddressV6], Gateways = [RouterInside, "fe80::1"] }],
Dns = [RouterInside],
},
PublicV4 = SharedExit,
PublicV6 = PhoneAddressV6,
NetworkV4 = new AsnEntry { Number = ExampleAsn, Name = ExampleProvider },
NetworkV6 = new AsnEntry { Number = ExampleAsn, Name = ExampleProvider },
BlockV4 = new RegistryBlock { Name = "EXAMPLENET-HOME", Status = BlockStatus.Assigned },
BlockV6 = new RegistryBlock { Name = "EXAMPLENET-HOME", Status = BlockStatus.Assigned },
Router = new RouterReport { Gateway = RouterInside, Upnp = Answer.Answered, UpnpVersion = 2, WanAddress = RouterOutside },
Hops =
[
new Hop { Distance = 1, Address = RouterInside, Kind = AddressKind.Private },
new Hop { Distance = 2, Address = "100.64.0.1", Kind = AddressKind.Shared },
new Hop { Distance = 3, Address = "198.51.100.17", Kind = AddressKind.Public },
new Hop { Distance = 4, Address = "198.51.100.90", Kind = AddressKind.Public },
new Hop { Distance = 5, Address = "192.0.2.80", Kind = AddressKind.Public, IsDestination = true },
],
Stun = new StunReport
{
LocalPort = 49731,
FirstServer = $"{Endpoints.SecondStunHost}:{Endpoints.SecondStunPort}",
FirstMapped = $"{SharedExit}:40071",
SecondServer = $"{Endpoints.StunHost}:{Endpoints.StunPort}",
SecondMapped = $"{SharedExit}:40071",
Behaviour = NatBehaviour.Easy,
Ports = new PortReport { Pattern = PortPattern.Block, Low = 40071, High = 40086, BlockLow = 38912, BlockSize = 2048, Hairpin = false, LifetimeDone = true, KeptAtLeast = 120 },
},
Mail = new MailReport
{
Port25 = PortState.Blocked,
ReverseName = "203-0-113-45.home.example.net",
ReverseLooksDynamic = true,
ReverseConfirmed = true,
Listings =
[
new Listing { List = "Spamhaus ZEN", State = ListingState.Listed, Residential = true, Code = "127.0.0.10" },
new Listing { List = "SpamCop", State = ListingState.Clean },
new Listing { List = "Barracuda", State = ListingState.Clean },
],
},
Dns = new DnsReport { Resolvers = [RouterInside], Validates = true, Hijacks = false, Ipv6Names = true },
DeviceReport = new DeviceReport { Kind = DeviceKind.Phone, System = "Android 15 (API 35, Arm64)", Cores = 8, MemoryMb = 7680, FreeDiskGb = 64, OnBattery = true },
Speed = new SpeedReport { DownMbps = 312.4, UpMbps = 48.7, DownBytes = 12 * 1024 * 1024, UpBytes = 4 * 1024 * 1024, RoundTripMs = 21 },
History = new HistorySummary { Checks = 3, Since = new DateTimeOffset(2026, 10, 19, 9, 0, 0, TimeSpan.Zero), AddressesSeen = 1, Changes = 0 },
};
var (nat, kind) = Verdicts.Nat(run.Local, run.Router, run.PublicV4, run.PublicV6, run.Hops);
run.Nat = kind;
run.Findings =
[
Verdicts.Online(run.Online, run.Local),
Verdicts.Connection(run.Local, null, knowledge),
Verdicts.Addresses(run.PublicV4, run.PublicV6, run.Local, run.Router),
Verdicts.Provider(knowledge, run.NetworkV4, run.NetworkV6, run.BlockV4, run.BlockV6, true, false, run),
Verdicts.Router(run.Router, run.Local),
nat,
Verdicts.Behaviour(run.Stun, run.Nat, false),
Verdicts.Mail(run.Mail, true),
Verdicts.Dns(run.Dns),
Verdicts.Speed(run.Speed),
Verdicts.Device(run.DeviceReport),
Verdicts.History(run.History),
];
run.Uses = Uses.Decide(run);
return run;
}
public static RunReport Early(RunReport finished) => new()
{
StartedAt = finished.StartedAt,
Device = finished.Device,
Local = finished.Local,
DeviceReport = finished.DeviceReport,
Findings = [.. finished.Findings.Where(f => f.Id is CheckId.Connection or CheckId.Device)],
};
}