The checks engine, the path and the cards: me-web? 0.1 reads the connection

MeWeb.Core runs seven checks concurrently and reports each as it settles:
online or behind a login page, this connection, the public IPv4 and IPv6
seen from v4./v6.meweb, the provider from a built-in map, the router
(UPnP IGD, NAT-PMP and PCP, read-only), address sharing (router WAN
against the echo, TTL hops only as a hint), and the history kept on the
device. The app draws the path from this device to the internet and lights
it node by node, with a card per check and a sheet listing every host it
contacts.

The provider map is iptoasn's table compressed to 2.1 MB by
tools/knowledge.cs and built before every app release; eleven Italian
provider profiles carry each fact with who said it, the source and the
month. The server gains a download page (en, it) and /download/{platform}
from the latest Gitea release.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012CzABvBkbcFqoHdmi8b9WB
This commit is contained in:
thepraandClaude Opus 5.5 committed 2026-10-15 04:39:03 +02:00
1 parent 16a1cecaae
commit 0dffbc27d6
61 files changed
+3750 -149

No files matched your search

+19 -6
View File
@@ -1,5 +1,8 @@
using MeWeb.App.Services;
using MeWeb.App.ViewModels;
using MeWeb.Core.Checks;
using MeWeb.Core.History;
using MeWeb.Core.Knowledge;
using MeWeb.Core.Net;
using MeWeb.Shared;
using Microsoft.Extensions.DependencyInjection;
@@ -8,14 +11,24 @@ namespace MeWeb.App;
public static class AppServices
{
public static IServiceCollection AddMeWebApp(this IServiceCollection services)
public const string Secure = "secure";
public const string Plain = "plain";
public static IServiceCollection AddMeWebApp(this IServiceCollection services, IPlatform platform)
{
services.AddHttpClient(ServerClient.Name, http =>
var agent = $"me-web/{BuildInfo.Version}";
services.AddHttpClient(Secure, http => http.DefaultRequestHeaders.UserAgent.ParseAdd(agent));
services.AddHttpClient(Plain, http => http.DefaultRequestHeaders.UserAgent.ParseAdd(agent))
.ConfigurePrimaryHttpMessageHandler(() => new SocketsHttpHandler { AllowAutoRedirect = false });
services.AddSingleton(platform);
services.AddSingleton(sp =>
{
http.BaseAddress = new Uri(Endpoints.Base);
http.DefaultRequestHeaders.UserAgent.ParseAdd($"me-web/{BuildInfo.Version}");
var factory = sp.GetRequiredService<IHttpClientFactory>();
return new ServerProbe(factory.CreateClient(Secure), factory.CreateClient(Plain));
});
services.AddSingleton<ServerClient>();
services.AddSingleton<KnowledgeBase>();
services.AddSingleton(new HistoryStore(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "MeWeb")));
services.AddSingleton<CheckRunner>();
services.AddTransient<MainViewModel>();
return services;
}