dotnetcore/WTM
Use WTM to write .netcore app fast !!!
Stale — last commit 2y ago
worst of 4 axeslast commit was 2y ago; top contributor handles 99% of recent commits…
Has a license, tests, and CI — clean foundation to fork and modify.
Documented and popular — useful reference codebase to read through.
last commit was 2y ago; no CI workflows detected
- ✓2 active contributors
- ✓MIT licensed
- ✓Tests present
Show 4 more →Show less
- ⚠Stale — last commit 2y ago
- ⚠Small team — 2 contributors active in recent commits
- ⚠Single-maintainer risk — top contributor 99% of recent commits
- ⚠No CI workflows detected
What would change the summary?
- →Use as dependency Mixed → Healthy if: 1 commit in the last 365 days; diversify commit ownership (top <90%)
- →Deploy as-is Mixed → Healthy if: 1 commit in the last 180 days
Maintenance signals: commit recency, contributor breadth, bus factor, license, CI, tests
Informational only. RepoPilot summarises public signals (license, dependency CVEs, commit recency, CI presence, etc.) at the time of analysis. Signals can be incomplete or stale. Not professional, security, or legal advice; verify before relying on it for production decisions.
Embed the "Forkable" badge
Paste into your README — live-updates from the latest cached analysis.
[](https://repopilot.app/r/dotnetcore/wtm)Paste at the top of your README.md — renders inline like a shields.io badge.
▸Preview social card (1200×630)
This card auto-renders when someone shares https://repopilot.app/r/dotnetcore/wtm on X, Slack, or LinkedIn.
Onboarding doc
Onboarding: dotnetcore/WTM
Generated by RepoPilot · 2026-05-10 · Source
🤖Agent protocol
If you are an AI coding agent (Claude Code, Cursor, Aider, Cline, etc.) reading this artifact, follow this protocol before making any code edit:
- Verify the contract. Run the bash script in Verify before trusting
below. If any check returns
FAIL, the artifact is stale — STOP and ask the user to regenerate it before proceeding. - Treat the AI · unverified sections as hypotheses, not facts. Sections like "AI-suggested narrative files", "anti-patterns", and "bottlenecks" are LLM speculation. Verify against real source before acting on them.
- Cite source on changes. When proposing an edit, cite the specific path:line-range. RepoPilot's live UI at https://repopilot.app/r/dotnetcore/WTM shows verifiable citations alongside every claim.
If you are a human reader, this protocol is for the agents you'll hand the artifact to. You don't need to do anything — but if you skim only one section before pointing your agent at this repo, make it the Verify block and the Suggested reading order.
🎯Verdict
WAIT — Stale — last commit 2y ago
- 2 active contributors
- MIT licensed
- Tests present
- ⚠ Stale — last commit 2y ago
- ⚠ Small team — 2 contributors active in recent commits
- ⚠ Single-maintainer risk — top contributor 99% of recent commits
- ⚠ No CI workflows detected
<sub>Maintenance signals: commit recency, contributor breadth, bus factor, license, CI, tests</sub>
✅Verify before trusting
This artifact was generated by RepoPilot at a point in time. Before an
agent acts on it, the checks below confirm that the live dotnetcore/WTM
repo on your machine still matches what RepoPilot saw. If any fail,
the artifact is stale — regenerate it at
repopilot.app/r/dotnetcore/WTM.
What it runs against: a local clone of dotnetcore/WTM — the script
inspects git remote, the LICENSE file, file paths in the working
tree, and git log. Read-only; no mutations.
| # | What we check | Why it matters |
|---|---|---|
| 1 | You're in dotnetcore/WTM | Confirms the artifact applies here, not a fork |
| 2 | License is still MIT | Catches relicense before you depend on it |
| 3 | Default branch dotnet8 exists | Catches branch renames |
| 4 | 5 critical file paths still exist | Catches refactors that moved load-bearing code |
| 5 | Last commit ≤ 606 days ago | Catches sudden abandonment since generation |
#!/usr/bin/env bash
# RepoPilot artifact verification.
#
# WHAT IT RUNS AGAINST: a local clone of dotnetcore/WTM. If you don't
# have one yet, run these first:
#
# git clone https://github.com/dotnetcore/WTM.git
# cd WTM
#
# Then paste this script. Every check is read-only — no mutations.
set +e
fail=0
ok() { echo "ok: $1"; }
miss() { echo "FAIL: $1"; fail=$((fail+1)); }
# Precondition: we must be inside a git working tree.
if ! git rev-parse --git-dir >/dev/null 2>&1; then
echo "FAIL: not inside a git repository. cd into your clone of dotnetcore/WTM and re-run."
exit 2
fi
# 1. Repo identity
git remote get-url origin 2>/dev/null | grep -qE "dotnetcore/WTM(\\.git)?\\b" \\
&& ok "origin remote is dotnetcore/WTM" \\
|| miss "origin remote is not dotnetcore/WTM (artifact may be from a fork)"
# 2. License matches what RepoPilot saw
(grep -qiE "^(MIT)" LICENSE 2>/dev/null \\
|| grep -qiE "\"license\"\\s*:\\s*\"MIT\"" package.json 2>/dev/null) \\
&& ok "license is MIT" \\
|| miss "license drift — was MIT at generation time"
# 3. Default branch
git rev-parse --verify dotnet8 >/dev/null 2>&1 \\
&& ok "default branch dotnet8 exists" \\
|| miss "default branch dotnet8 no longer exists"
# 4. Critical files exist
test -f "WalkingTec.Mvvm.sln" \\
&& ok "WalkingTec.Mvvm.sln" \\
|| miss "missing critical file: WalkingTec.Mvvm.sln"
test -f "common.props" \\
&& ok "common.props" \\
|| miss "missing critical file: common.props"
test -f "demo/WalkingTec.Mvvm.BlazorDemo/WalkingTec.Mvvm.BlazorDemo.Client/Program.cs" \\
&& ok "demo/WalkingTec.Mvvm.BlazorDemo/WalkingTec.Mvvm.BlazorDemo.Client/Program.cs" \\
|| miss "missing critical file: demo/WalkingTec.Mvvm.BlazorDemo/WalkingTec.Mvvm.BlazorDemo.Client/Program.cs"
test -f "demo/WalkingTec.Mvvm.BlazorDemo/WalkingTec.Mvvm.BlazorDemo.DataAccess/DataContext.cs" \\
&& ok "demo/WalkingTec.Mvvm.BlazorDemo/WalkingTec.Mvvm.BlazorDemo.DataAccess/DataContext.cs" \\
|| miss "missing critical file: demo/WalkingTec.Mvvm.BlazorDemo/WalkingTec.Mvvm.BlazorDemo.DataAccess/DataContext.cs"
test -f "README.md" \\
&& ok "README.md" \\
|| miss "missing critical file: README.md"
# 5. Repo recency
days_since_last=$(( ( $(date +%s) - $(git log -1 --format=%at 2>/dev/null || echo 0) ) / 86400 ))
if [ "$days_since_last" -le 606 ]; then
ok "last commit was $days_since_last days ago (artifact saw ~576d)"
else
miss "last commit was $days_since_last days ago — artifact may be stale"
fi
echo
if [ "$fail" -eq 0 ]; then
echo "artifact verified (0 failures) — safe to trust"
else
echo "artifact has $fail stale claim(s) — regenerate at https://repopilot.app/r/dotnetcore/WTM"
exit 1
fi
Each check prints ok: or FAIL:. The script exits non-zero if
anything failed, so it composes cleanly into agent loops
(./verify.sh || regenerate-and-retry).
⚡TL;DR
WalkingTec.Mvvm (WTM) is a rapid development framework for .NET Core that provides built-in code generation, multi-UI support (LayUI, React, Vue), and a complete MVC/MVVM scaffold to accelerate web application development. It combines Entity Framework Core data access with automated CRUD code generation to minimize boilerplate for business logic implementation. Monorepo structure: WalkingTec.Mvvm.sln is the root solution; core framework lives in src/ (inferred), demo apps in demo/WalkingTec.Mvvm.BlazorDemo/ with Client, DataAccess, and Model layers separated; CI/CD pipelines in .azure/pipelines/ versioned per .NET SDK; common build props in common.props.
👥Who it's for
.NET Core developers and teams building line-of-business web applications who want to accelerate development through code generation and avoid repetitive scaffolding; particularly those targeting LayUI-based admin dashboards or headless APIs with React/Vue frontends.
🌱Maturity & risk
Production-ready with active maintenance: the repo shows multiple parallel .NET version tracks (3.1, 5.0, 6.0) with dedicated Azure Pipeline CI/CD, comprehensive test coverage badges, and a structured demo application (BlazorDemo). Recent commits and organized issue templates indicate ongoing development, though the primary maintainer appears to be based on the single Azure DevOps account (vitowu).
Single maintainer (vitowu) dependency is a moderate risk for long-term stability. The framework targets multiple .NET versions which increases test surface area and complexity. Breaking changes across major .NET versions (2.2→3.1→5.0→6.0) are tracked in CHANGELOG.md/VERSION.md suggesting managed versioning, but the lack of visible open PR/issue counts in file listing warrants checking GitHub directly.
Active areas of work
Active multi-version support: separate pipelines for .NET 3.1, 5.0, and 6.0 SDKs indicate ongoing backport maintenance. Dockerfile and alpine.Dockerfile suggest containerization work. BlazorDemo includes PWA (service-worker.js, manifest.json) and MVVM binding patterns being actively refined.
🚀Get running
git clone https://github.com/dotnetcore/WTM.git && cd WTM && dotnet restore WalkingTec.Mvvm.sln && dotnet build WalkingTec.Mvvm.sln
Daily commands: dotnet run --project demo/WalkingTec.Mvvm.BlazorDemo/WalkingTec.Mvvm.BlazorDemo.Client/ (for Blazor client) or appropriate Server project; exact startup commands depend on which demo you target—check demo/WalkingTec.Mvvm.BlazorDemo/*/Properties/launchSettings.json for URLs.
🗺️Map of the codebase
WalkingTec.Mvvm.sln— Solution file orchestrating all core framework projects; essential entry point for understanding project structure and dependenciescommon.props— Shared build properties and version management across all projects; controls framework-wide versioning and compilation settingsdemo/WalkingTec.Mvvm.BlazorDemo/WalkingTec.Mvvm.BlazorDemo.Client/Program.cs— Blazor client application entry point demonstrating how to initialize and configure WTM framework for frontend applicationsdemo/WalkingTec.Mvvm.BlazorDemo/WalkingTec.Mvvm.BlazorDemo.DataAccess/DataContext.cs— Core data access layer showing Entity Framework integration pattern; critical for understanding ORM configuration in WTMREADME.md— Primary documentation explaining WTM's purpose, supported UI frameworks (LayUI, React, Vue), and code generation capabilitiesVERSION.md— Version history and changelog management; tracks framework evolution and breaking changes across releases.azure/pipelines/ci.yml— Main CI/CD pipeline configuration; reveals build, test, and deployment automation strategy for the framework
🛠️How to make changes
Add a new CRUD entity with generated UI pages
- Create a new entity model class in demo/WalkingTec.Mvvm.BlazorDemo/WalkingTec.Mvvm.BlazorDemo.Model/ with properties and data annotations (
demo/WalkingTec.Mvvm.BlazorDemo/WalkingTec.Mvvm.BlazorDemo.Model/Student.cs) - Add DbSet<YourEntity> property to DataContext class in DataAccess layer to register entity mapping (
demo/WalkingTec.Mvvm.BlazorDemo/WalkingTec.Mvvm.BlazorDemo.DataAccess/DataContext.cs) - Create folder structure in Pages matching entity module (e.g., Pages/BasicData/YourEntity/) and generate Index.razor from City/Index.razor template (
demo/WalkingTec.Mvvm.BlazorDemo/WalkingTec.Mvvm.BlazorDemo.Shared/Pages/BasicData/City/Index.razor) - Generate Create.razor, Edit.razor, Details.razor pages by copying from City module and adapting bindings to new entity properties (
demo/WalkingTec.Mvvm.BlazorDemo/WalkingTec.Mvvm.BlazorDemo.Shared/Pages/BasicData/City/Create.razor) - Use WTM code generator tool to automatically scaffold remaining pages, validation, and API endpoints from the entity definition
Add a bulk import feature for an existing entity
- Copy Import.razor template from existing entity module (e.g., City) to target entity folder (
demo/WalkingTec.Mvvm.BlazorDemo/WalkingTec.Mvvm.BlazorDemo.Shared/Pages/BasicData/City/Import.razor) - Update file upload handler and entity binding to match target entity properties and validation rules (
demo/WalkingTec.Mvvm.BlazorDemo/WalkingTec.Mvvm.BlazorDemo.Shared/Pages/BasicData/School/Import.razor) - Configure Excel/CSV column mapping in backend service to parse uploaded files and validate batch records (
demo/WalkingTec.Mvvm.BlazorDemo/WalkingTec.Mvvm.BlazorDemo.DataAccess/DataContext.cs) - Add Import menu item to Index.razor navigation referencing newly created Import.razor component (
demo/WalkingTec.Mvvm.BlazorDemo/WalkingTec.Mvvm.BlazorDemo.Shared/Pages/BasicData/School/Index.razor)
Configure multi-UI framework support (React/Vue/LayUI alongside Blazor)
- Review README.md for supported UI framework options and framework selection rationale (
README.md) - Create parallel UI project structure for chosen framework (e.g., WalkingTec.Mvvm.VueDemo) sharing the same DataAccess and Model layers (
demo/WalkingTec.Mvvm.BlazorDemo/WalkingTec.Mvvm.BlazorDemo.DataAccess/WalkingTec.Mvvm.BlazorDemo.DataAccess.csproj) - Use WTM code generator to automatically generate CRUD components, API contracts, and routing for selected UI framework (
demo/WalkingTec.Mvvm.BlazorDemo/WalkingTec.Mvvm.BlazorDemo.Shared/Pages/BasicData/City/Index.razor) - Update solution file and CI/CD pipelines to include multi-framework builds and testing (
WalkingTec.Mvvm.sln)
🪤Traps & gotchas
Code generation engine behavior and output paths not visible in file listing—check documentation or source for code-gen configuration location. Multiple .NET versions require corresponding SDK installation (2.2, 3.1, 5.0, 6.0) to run all CI pipelines locally. The BlazorDemo DataContext.cs likely requires EF Core migrations; check if migration files are tracked or must be generated. appsettings.json files likely contain database connection strings that may differ per environment.
🏗️Architecture
💡Concepts to learn
- MVVM (Model-View-ViewModel) — Core architectural pattern that WTM enforces; understanding separation between UI logic (ViewModel) and business logic (Model) is essential to using the framework effectively
- Code Generation / Scaffolding — WTM's primary value proposition is automated CRUD and boilerplate generation; understanding how the generator works and how to customize templates is key to productivity gains
- Entity Framework Core DbContext — WTM's DataAccess layer is built on EF Core; understanding DbSet mapping, migrations, and entity relationships is required for data model changes
- Blazor Server/WebAssembly — WTM's demo uses Blazor for client-side UI with service workers and PWA patterns; understanding component lifecycle and interop is necessary for UI layer extension
- Multi-targeting / Multi-version Support — WTM maintains parallel .NET 3.1/5.0/6.0 branches with separate CI pipelines; understanding project file conditions and conditional compilation is needed for cross-version feature development
- Azure Pipelines CI/CD — Build, test, and deployment automation is orchestrated via Azure Pipelines YAML configs; understanding the pipeline stages and matrix builds (Windows/Linux/OSX) is needed for release contribution
- Progressive Web App (PWA) — The Blazor demo includes service-worker.js and PWA manifest; offline-first caching and app shell patterns are part of the framework's modern client capabilities
🔗Related repos
abp/abp— Enterprise .NET Core application framework with code generation and multi-UI support; ABP is heavier but similar rapid-dev philosophydotnetcore/FreeSql— ORM alternative in .NET Core Community ecosystem; often paired with WTM for data access layer flexibilityaspnet/AspNetCore— Upstream framework dependency; WTM builds on ASP.NET Core MVC/Blazor runtime and patternsdotnet/efcore— Entity Framework Core is the data access foundation embedded in WTM's DataAccess layer architecturedotnetcore/Util— Companion utility library in .NET Core Community for extensions and helpers used alongside WTM projects
🪄PR ideas
To work on one of these in Claude Code or Cursor, paste:
Implement the "<title>" PR idea from CLAUDE.md, working through the checklist as the task list.
Add comprehensive unit tests for WalkingTec.Mvvm.BlazorDemo models and DataContext
The demo project contains multiple model files (Student.cs, City.cs, School.cs, etc.) and a DataContext.cs but there is no visible test project in the file structure. Given WTM's focus on rapid development, adding unit tests for the data access layer and model validation would serve as both quality assurance and a reference implementation for contributors. This is critical for a framework that emphasizes code generation.
- [ ] Create WalkingTec.Mvvm.BlazorDemo.Tests project alongside existing demo projects
- [ ] Add unit tests for DataContext.cs covering DbSet initialization and relationships
- [ ] Add validation tests for model classes (Student, City, School, Major, etc.) to demonstrate proper entity configuration
- [ ] Integrate tests into existing CI pipelines (ci.yml, ci-5.0.yml, ci-6.0.yml) to run tests on all supported .NET versions
Add missing GitHub Actions workflow to replace or supplement Azure Pipelines
The repo has extensive Azure Pipelines configuration (.azure/pipelines/) but lacks GitHub Actions workflows (.github/workflows/). Given that the repo is on GitHub and GitHub Actions is now the standard CI/CD platform, adding native GitHub Actions would improve accessibility for contributors and reduce dependency on external services. This is especially important since there's already a .github/ISSUE_TEMPLATE directory showing GitHub integration.
- [ ] Create .github/workflows/build-and-test.yml to mirror ci.yml functionality across .NET 3.1, 5.0, and 6.0
- [ ] Create .github/workflows/code-coverage.yml to publish coverage reports (currently using coveralls.io)
- [ ] Create .github/workflows/release.yml to automate NuGet package publishing based on VERSION.md
- [ ] Add workflow badges to README.md and ensure they pass before merging
Document Blazor WASM PWA configuration and add integration tests for service-worker functionality
The demo includes PWA configuration files (service-worker.js, service-worker.published.js, manifest.json, pwaicon.png) but there's no documented testing strategy or integration tests for offline functionality. Adding tests and documentation for the PWA capabilities would provide valuable guidance for contributors building offline-capable applications, which is a key modern web feature that WTM should highlight.
- [ ] Create docs/PWA-CONFIGURATION.md documenting service worker setup, manifest.json configuration, and caching strategies used in BlazorDemo
- [ ] Add integration tests in BlazorDemo.Client to verify service-worker.js registration and fetch event handling
- [ ] Create example test file (e.g., wwwroot/service-worker.test.js or C# integration tests) demonstrating offline scenario testing
- [ ] Update README.md with a PWA features section referencing the new documentation
🌿Good first issues
- Add unit test coverage for the code generation engine logic (currently no test projects visible in file listing; create Tests/WalkingTec.Mvvm.Core.Tests/ following xUnit conventions)
- Document the MVVM binding patterns used in demo/WalkingTec.Mvvm.BlazorDemo.Client/ with code examples and add a PATTERNS.md guide for new contributors on how to extend reactive bindings
- Create a .NET 7.0 support branch and associated ci-7.0.yml pipeline following the pattern of existing versioned pipelines (ci-3.1.yml, ci-5.0.yml, ci-6.0.yml)
📝Recent commits
Click to expand
Recent commits
f397e29— 8.1.12 (liuliang-wt)7267a40— 8.1.11 (liuliang-wt)c4de570— fix vue3 hidden menu bug (liuliang-wt)87c1ee5— prepare 8.1.0 (liuliang-wt)a0f1708— fix layui export bug; fix blazor generator bug (liuliang-wt)9939105— test set connection programly (liuliang-wt)ff97b2b— prepare 8.0.9 (liuliang-wt)0521ca8— update approve activity (liuliang-wt)c086da2— update vue sub table (liuliang-wt)4ec1855— prepare 8.0.8 (liuliang-wt)
🔒Security observations
The WTM codebase shows a moderate security posture with several concerning issues. The most critical vulnerability is the use of an EOL .NET Core 3.1 runtime and SDK, which no longer
- High · Outdated .NET Core SDK in Dockerfile —
Dockerfile (lines 1, 11). The Dockerfile uses .NET Core 3.1 SDK and runtime, which reached end-of-life on December 13, 2022. This version no longer receives security updates and patches for newly discovered vulnerabilities. Fix: Update to a currently supported .NET version (6.0 LTS or 8.0 LTS). Replace 'mcr.microsoft.com/dotnet/core/sdk:3.1' with 'mcr.microsoft.com/dotnet/sdk:8.0' and 'mcr.microsoft.com/dotnet/core/aspnet:3.1' with 'mcr.microsoft.com/dotnet/aspnet:8.0' - High · Missing HEALTHCHECK in Dockerfile —
Dockerfile. The Dockerfile lacks a HEALTHCHECK instruction. Without health checks, orchestration platforms cannot detect unhealthy containers, potentially leading to traffic being routed to failed instances. Fix: Add a HEALTHCHECK instruction. Example: HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 CMD curl -f http://localhost/health || exit 1 - Medium · Permissive APT package installation —
Dockerfile (line 16). The Dockerfile uses '--allow-unauthenticated' flag when installing packages, which bypasses GPG signature verification. This could allow installation of tampered or malicious packages. Fix: Remove the '--allow-unauthenticated' flag and ensure proper package authentication. Update package lists: 'apt-get update && apt-get install -y libgdiplus libc6-dev' without the unauthenticated flag - Medium · Running container as root —
Dockerfile. The Dockerfile does not specify a non-root USER. Containers run as root by default, which increases the blast radius if the application is compromised. Fix: Add a USER directive before ENTRYPOINT to run the application with reduced privileges. Example: 'RUN useradd -m -u 1000 appuser' and 'USER appuser' - Medium · Missing EXPOSE instruction —
Dockerfile. While the application listens on port 80 (via ASPNETCORE_URLS), there is no explicit EXPOSE instruction. This could lead to confusion about which ports the container uses. Fix: Add 'EXPOSE 80' after the FROM runtime statement to document the exposed port - Low · No base image digest pinning —
Dockerfile (lines 1, 11). Dockerfile uses base image tags (e.g., ':3.1') rather than immutable digests. This can lead to non-deterministic builds if the tag is re-pushed with different content. Fix: Pin base images to specific digests: 'mcr.microsoft.com/dotnet/core/sdk:3.1@sha256:...' to ensure reproducible builds - Low · Dependency file not provided for analysis —
Project root (*.csproj files, NuGet.Config). No NuGet package lock file (packages.lock.json) or detailed csproj dependency list was provided for vulnerability scanning. This limits the ability to detect vulnerable NuGet dependencies. Fix: Provide a complete package manifest or use tools like 'dotnet list package --vulnerable' and OWASP Dependency-Check to audit NuGet dependencies. Regularly update packages and monitor CVE databases. - Low · No explicit ENTRYPOINT error handling —
Dockerfile (line 21). The ENTRYPOINT does not include error handling. If the application fails to start, the container will exit without clear diagnostics. Fix: Consider adding a shell wrapper script that logs startup errors or use environment variable logging: ENTRYPOINT ['sh', '-c', 'dotnet WalkingTec.Mvvm.Demo.dll']
LLM-derived; treat as a starting point, not a security audit.
👉Where to read next
- Open issues — current backlog
- Recent PRs — what's actively shipping
- Source on GitHub
Generated by RepoPilot. Verdict based on maintenance signals — see the live page for receipts. Re-run on a new commit to refresh.