Build / Desktop, server and tools (push) Successful in 33s
The language list comes from CLDR (official in a UN member state, plus the six UN languages), with autonyms and text direction supplied for the 21 that ICU does not know. Strings move from resx to one JSON file per language, looked up by code, so a language unknown to ICU or MSBuild still loads; tools/strings.cs checks keys and placeholders in CI. Arabic, Hindi and Chinese drafts prove right-to-left and system-font fallback. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012CzABvBkbcFqoHdmi8b9WB
3.2 KiB
3.2 KiB
CLAUDE.md — MeWeb quick reference
Read AGENT.md first and cite PATTERNS.md for code rules. This file holds commands, the map and the pitfalls.
Commands
dotnet build src/MeWeb.Desktop/MeWeb.Desktop.csproj
dotnet run --project src/MeWeb.Desktop
dotnet run --project src/MeWeb.Server # ASPNETCORE_URLS=http://127.0.0.1:5481
dotnet run tools/setup.cs -- --group jdk # pinned JDK 21 into tools/jdk
dotnet run tools/setup.cs -- --group packaging # pinned nfpm into tools/packaging
dotnet build src/MeWeb.Android/MeWeb.Android.csproj \
-p:JavaSdkDirectory=$PWD/tools/jdk/linux-x64/jdk-21.0.12+8 -p:AndroidSdkDirectory=$HOME/Android/Sdk
dotnet run --project tools/Screenshots -- dist/screenshots [en,it,...]
dotnet run tools/strings.cs -- check # every language against English
dotnet run tools/strings.cs -- set Key values.json # one key, every language at once
dotnet run tools/languages.cs # regenerate data/languages.json from CLDR
dotnet publish src/MeWeb.Desktop -c Release -r win-x64 --self-contained -p:PublishSingleFile=true \
-p:IncludeNativeLibrariesForSelfExtract=true -p:EnableCompressionInSingleFile=true
dotnet publish src/MeWeb.Desktop -c Release -r osx-arm64 --self-contained
The Android workload installs into the user SDK (dotnet workload install android); the system SDK in /opt/dotnet
is root-owned, so CI uses the runner user's own ~/.dotnet (passolo's tools/release.sh pattern).
Map
| Path | What |
|---|---|
src/MeWeb.Shared |
Endpoints.cs (routes and hosts), wire contracts, MeWebJsonContext, generated BuildInfo |
src/MeWeb.App |
Avalonia views and view models, Services/Localizer.cs (+ {s:Tr Key}), Strings/<code>.json, Resources/Colors.axaml |
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 |
data/languages.json |
113 languages: code, autonym, English name, rtl, reviewed or draft |
tools/setup.cs + setup.json |
pinned build tools |
tools/Screenshots |
headless renders of every view in every language |
branding/ |
the icon (SVG source, PNG, ICO) |
Pitfalls
- Avalonia 12 Android head:
[Application] MainApplication : AvaloniaAndroidApplication<App>plus a non-genericAvaloniaMainActivity; the main view comes throughIActivityApplicationLifetime.MainViewFactory, checked beforeISingleViewApplicationLifetime. ApplicationVersionmust be an integer: computed fromVersionthrough separateVersionMajor/Minor/Patchproperties; one nested property function left it unevaluated (XA0003).- A headless Avalonia session does not end on its own while the pulse animation runs: the screenshot tool calls
Environment.Exit(0)after dispatching. - The macOS apphost is ad-hoc signed by the .NET 10 SDK even on Linux (
LC_CODE_SIGNATUREpresent); Apple Silicon refuses unsigned arm64 code, so never strip it. - The Windows single-file publish drops native
.pdbfiles beside the exe; onlymeweb.exeships.