LinuxDevTyper.Core
1.0.0
See the version list below for details.
dotnet add package LinuxDevTyper.Core --version 1.0.0
NuGet\Install-Package LinuxDevTyper.Core -Version 1.0.0
<PackageReference Include="LinuxDevTyper.Core" Version="1.0.0" />
<PackageVersion Include="LinuxDevTyper.Core" Version="1.0.0" />
<PackageReference Include="LinuxDevTyper.Core" />
paket add LinuxDevTyper.Core --version 1.0.0
#r "nuget: LinuxDevTyper.Core, 1.0.0"
#:package LinuxDevTyper.Core@1.0.0
#addin nuget:?package=LinuxDevTyper.Core&version=1.0.0
#tool nuget:?package=LinuxDevTyper.Core&version=1.0.0
linux-dev-typer
A code-only typing practice app built with Avalonia UI — cross-platform for Linux, macOS, and Windows.
Also available as a native Windows app: dev-op-typer (WinUI 3, Microsoft Store)
NuGet Package
| Package | Description |
|---|---|
LinuxDevTyper.Core |
Portable typing practice engine with Elo rating, adaptive difficulty, weakness heatmaps, fatigue detection, session planning, and micro-drills. Zero UI dependencies. |
The core engine is a standalone library with no Avalonia or platform dependencies. Implement IStorage, IAudioService, and IAssetProvider for your platform and you have a complete typing trainer.
Features
Core Typing Engine
- Per-character feedback: correct (teal), errors (red + underline), untyped (muted)
- Live stats: WPM, accuracy, error count, XP
- Elo-inspired per-language rating system
- Level progression with XP and difficulty ramp
- Completion cards with snippet explanations
- Configurable: font size, whitespace rules, line-ending normalization
Adaptive Learning
- Per-character mistake tracking with symbol classification (10 categories)
- Cross-session weakness profiling with adaptive snippet selection
- Trend tracking: rolling WPM and accuracy trends per language
- Adaptive difficulty with comfort-zone detection and anti-yo-yo protection
- Post-session insights: personal bests, milestones, trend signals
- Fatigue detection with break suggestions
- Hardcore mode: fix each mistake before advancing
Agency & Reflection
- Practice intent picker: tag sessions as Warmup, Drill, Explore, or Challenge
- Session notes and session browser with search/filter
- Welcome-back detection with contextual greetings and automatic difficulty aging
- Override system suggestions: dismiss yo-yo locks, insight types, and fatigue alerts
- Monthly history compression for sessions beyond 200
- Orientation cues: gentle pre-session suggestions based on content
- Plateau detection with reassurance
- Personalization controls: freeze learning, reset preferences
Content System
- User snippet packs: drop JSON into
~/.config/linux-dev-typer/packs/ - Practice profiles: named parameter sets that tune engine behavior
- Import/export
.ldtpackbundles for sharing content - Paste Code, Import File, Import Folder with auto-detected language
- Content-addressed IDs (SHA-256 deduplication)
- Unified canonical pipeline: all content enters as CodeItem with metrics-based difficulty (D1–D7)
Teaching & Community
- Scaffolds: progressive learning context with optional deeper layers
- Variants: alternative implementations shown as equal peers
- Community notes: optional tips and perspectives in
.ldtpackpacks - Community difficulty: display-only signal for crowd-sourced difficulty
- Anonymous by design — imported content is indistinguishable from local
- All teaching and community features are optional and display-only
Structured Practice
- 168 calibration snippets across 5 languages (D1–D7 coverage)
- Session planner: Target (50%) / Review (30%) / Stretch (20%) mix
- Rolling weakness detection with time-decayed window
- Selection transparency: "Why this snippet" explains every pick
- Per-character MistakeHeatmap with confusion pairs
- Weakness trajectories: daily snapshots track improvement
Guided Practice (v1.0)
- Guided Mode: opt-in toggle that allows weakness signals to influence selection
- WeaknessBias: bounded category-level bias (+0 to +3, never changes difficulty band)
- Micro-drills: 5-item focused practice sessions targeting top weakness
- SignalPolicy: feature-flag architecture with master switch and per-feature sub-flags
- Storage hygiene: heatmap capped at 200 chars, confusion pairs at 20, snapshots at 90
- Default OFF — all prior behavior preserved unless explicitly opted in
Audio
- 5 keyboard sound themes (8 variations each)
- 4 ambient soundscape categories (15 tracks total)
- Per-channel volume controls and mute
Accessibility
- Keyboard-first UX with visible focus outlines
- Reduced sensory mode (caps audio volumes)
- High-contrast dark theme
Install & Run
Requirements: .NET SDK 8.x
git clone https://github.com/mcp-tool-shop-org/linux-dev-typer.git
cd linux-dev-typer
dotnet restore
dotnet build -c Release
dotnet run --project src/LinuxDevTyper.App/LinuxDevTyper.App.csproj
Run Tests
dotnet test
817 tests covering all core engine modules.
Project Layout
| Path | Purpose |
|---|---|
src/LinuxDevTyper.Core |
Portable engine (typing, rating, trends, difficulty, profiles, community, pedagogy, calibration, planner, weakness, heatmap, guided mode) |
src/LinuxDevTyper.Core.Tests |
xUnit tests (817 tests) |
src/LinuxDevTyper.App |
Avalonia desktop shell (UI + platform services + import/export) |
assets/snippets |
Built-in JSON snippet packs |
assets/sounds |
WAV files (ambient + keyboard SFX) |
lib/meta-content-system |
Shared content library |
docs/ |
Architecture, schema docs, phase plans, extension guides |
Persistence
State file: ~/.config/linux-dev-typer/state.json (schema v12)
To reset: rm -rf ~/.config/linux-dev-typer
Adding Your Own Code
There are three ways to practice your own code:
Option 1: Paste Code (easiest)
- Open the sidebar (click ⚙)
- Find the Paste Code section
- Paste any code snippet into the text box
- Click Add — the language is auto-detected
- Your code appears in the snippet rotation immediately
Option 2: Import a File or Folder
- Open the sidebar → find Import
- Click Import File to add a single source file, or Import Folder to scan an entire project
- The app auto-detects language from file extensions (
.py,.rs,.js,.cs,.java,.sh) - Imported code is deduplicated by content hash — the same code is never added twice
Option 3: Create a Snippet Pack (JSON)
For curated sets of practice snippets:
Create a JSON file in your packs folder:
~/.config/linux-dev-typer/packs/Name it after the language (e.g.
python.json):{ "language": "python", "snippets": [ { "id": "my_list_comp", "title": "List comprehension", "difficulty": 3, "topics": ["lists", "comprehension"], "code": "squares = [x**2 for x in range(10)]\n" }, { "id": "my_dict_comp", "title": "Dictionary comprehension", "difficulty": 4, "topics": ["dicts", "comprehension"], "code": "counts = {word: len(word) for word in words}\n" } ] }Restart the app — your snippets merge with built-in ones and can be enabled/disabled from the sidebar
Tips:
idmust be unique across all packsdifficultyranges from 1 (easy) to 7 (hard)codeshould end with\n- User packs can be toggled on/off without deleting the file
Sharing Content
Export your custom snippets as a portable .ldtpack bundle:
- Open the sidebar → click Export
- Share the
.ldtpackfile with others - They import it via the sidebar → Import
Only user-authored content travels — never practice history or settings.
Privacy
linux-dev-typer is fully offline. No data is collected, transmitted, or shared.
License
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net8.0
- No dependencies.
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.