Skip to content

Reference

The core engine ships as a standalone NuGet package: LinuxDevTyper.Core. It contains all typing, rating, trend, difficulty, weakness, and guided-mode logic with zero UI dependencies. You can embed it in your own .NET application, build a different frontend, or use it for automated typing analysis.

The package targets .NET 8 and has no external dependencies beyond the BCL.

The project includes 817 xUnit tests organized across multiple test classes:

Test areaWhat it covers
RatingEngineTestsElo adjustment math, edge cases, profile-tuned constants.
TrendEngineTestsWindow splitting, trend classification, plateau detection, consecutive decline filtering.
FatigueDetectorTestsSitting boundary detection, break triggers, accuracy drop calculation.
InsightEngineTestsPriority ordering, dismissal, intent-awareness, milestone detection.
SnippetSelectorTestsDifficulty matching, weakness boost, focus categories, edge pools.
SessionPlannerTestsMix distribution, yo-yo lock, manual lock, comfort zone establishment.
PlannerInvariantTestsStructural invariants that must hold across all planner states.
PlannerEdgeCaseTestsEmpty pools, single-snippet pools, extreme ratings.
PlannerProfileTestsProfile-tuned planner behavior.
PlannerPerformanceTestsSelection latency under large snippet pools.
MistakeAggregatorTestsCategory aggregation, top-weakness extraction.
SymbolClassifierTestsCharacter-to-category mapping for all 10 categories.
WeaknessDetectorTestsRolling window, fallback to lifetime profile, cold start.
WeaknessWindowTestsTime decay, event recording, category extraction.
WeaknessInvariantTestsStructural guarantees on weakness data.
DifficultyMemoryTestsComfort zone, yo-yo detection, outlier filtering, difficulty aging.
SchemaMigratorTestsEvery migration path from v1 through v12.
MigrationAuditTestsCross-version migration with data preservation verification.
PackValidatorTestsPack format validation, invalid pack rejection.
PortableBundleTestsImport/export, merge behavior, format versioning.
ContentIntegrationTestsEnd-to-end content pipeline from ingestion to selection.
CalibrationPackTestsBuilt-in snippet integrity and difficulty derivation.
PracticeProfileTestsParameter clamping, diff comparison, default immutability.
XpEngineTestsXP calculation, repeat decay, sloppy penalty.
SummaryStatsEngineTestsMonthly summary aggregation.
ExplanationBuilderTestsSelection reason formatting.
ReasonFormatterTestsWeakness context appending.

Run the full suite:

Terminal window
dotnet test src/LinuxDevTyper.Core.Tests/ -c Release

All user data is stored in a single state.json file. The current schema is version 12, with automatic migration from any previous version.

FieldTypePurpose
SchemaVersionintCurrent: 12. Triggers migration on load.
ProfileProfileUser identity and per-language ratings.
SettingsAppSettingsUI preferences, audio settings, feature flags.
RecentResultsList<Result>Last 200 session results. Older results roll into monthly summaries.
MistakeProfileMistakeProfileCumulative per-category mistake counts (lifetime).
MistakeHeatmapMistakeHeatmapPer-character hit/miss tracking for fine-grained analysis.
WeaknessWindowWeaknessWindowTime-decayed rolling mistake data.
WeaknessSnapshotsListDaily snapshots of weakness state, capped at 90 entries.
DifficultyMemoryDifficultyMemoryPer-language, per-difficulty performance records and yo-yo state.
PersonalDefaultsPersonalDefaultsUser’s preferred starting configuration.
SessionSummaryByMonthDictionaryAggregated stats for months whose sessions rolled off the 200-cap.
PracticeProfilesDictionaryNamed practice profiles with tuning overrides.
PackRegistryList<PackMetadata>Discovered user packs with enabled/disabled state.

The 200-result cap keeps the file small. When results roll off, they are summarized into SessionSummaryByMonth so historical stats are preserved without unbounded growth.

The SchemaMigrator applies incremental migrations from any previous version to v12. Each migration step is idempotent. The migration audit test suite verifies every path from v1 through v12 preserves data integrity.

Five keyboard themes ship with the app, each containing a set of WAV samples for keypress feedback:

  1. AlpsCream — vintage Alps-style switches.
  2. Mechanical — classic mechanical keyboard.
  3. Membrane — soft membrane keyboard.
  4. SoftTouch — quiet, dampened keys.
  5. Topre — electrostatic capacitive switches.

Four ambient categories provide background atmosphere:

  1. Ocean — waves and coastal sounds.
  2. Rain — rainfall and gentle thunder.
  3. Wind — breezy outdoor ambience.
  4. Zen — calm, meditative tones.

Volume controls, mute toggle, and a shuffle button for random ambient selection are available in the settings sidebar. Audio is powered by MiniAudio through the MiniAudioService. A StubAudioService is available for headless/test environments.

  • Keyboard-first navigation — every function is reachable without a mouse.
  • Reduced sensory mode — disable ambient sounds and minimize visual effects.
  • High contrast support — respects system high-contrast settings via Avalonia’s theme system.
  • No time pressure — there is no countdown timer or penalty for typing slowly. WPM is tracked but never gates access to content.

Linux Dev Typer is a fully offline desktop application with a minimal security surface:

  • No network access — the app makes zero HTTP requests. No telemetry, no analytics, no update checks.
  • No accounts — no registration, no login, no authentication.
  • Local-only persistencestate.json lives in the user’s config directory. No cloud sync.
  • No shell execution — the app never spawns child processes or executes shell commands.
  • User-scoped file access — reads and writes only within ~/.config/linux-dev-typer/ and the application directory.
  • Import validation — all imported content (packs, bundles, files) is validated before entering the engine. Invalid data is rejected, not silently accepted.