This document outlines the planned features, improvements, and direction for LowlandTech.TinyTools.
Philosophy: TinyTools stays tiny by design. We prioritize simplicity, performance, and zero dependencies over feature bloat.
Status: ? Stable
Released: January 2026
- ? Simple string interpolation (
{PropertyName}) - ? Template engine with control flow (
@if,@foreach) - ? Variable interpolation (
${Context.xxx}) - ? Null coalescing (
${expr ?? "default"}) - ? Pipe helpers (string, date, number, collection)
- ? Hierarchical execution context
- ? Template services (extensibility)
- ? IoC/DI integration support
- ? .NET 8, 9, 10 support
Theme: Enhanced Developer Experience
- Pre-render validation - Catch syntax errors before rendering
- Template analysis - Detect unused variables, missing properties
- Type-safe templates - Optional strongly-typed template compilation
// Validate template syntax
var errors = engine.Validate(template);
if (errors.Any())
{
foreach (var error in errors)
Console.WriteLine($"Line {error.Line}: {error.Message}");
}- Compiled template cache - Parse once, render many times
- Performance boost - 10-50x faster for repeated renders
// Cache compiled template
var compiledTemplate = engine.Compile(template);
// Render many times (fast!)
for (int i = 0; i < 1000; i++)
{
var result = compiledTemplate.Render(context);
}- Line/column information - Pinpoint errors in templates
- Syntax highlighting in error messages (console/terminal)
- Helpful suggestions for common mistakes
slice:start,end- Extract substring by indexmatch:pattern- Regex matchingcontains:value- Check if string/collection contains valuesplit:separator- Split string into array
- ? 20% faster variable resolution
- ? Reduce allocations in tight loops
- ? Optimize pipe helper chaining
Theme: Advanced Templating
- Reusable template fragments
- Nested templates with isolated contexts
var template = """
@include("header.tmpl")
Content here
@include("footer.tmpl")
""";- Define reusable blocks within templates
- Parameters and return values
var template = """
@macro FormatUser(user)
${user.FirstName} ${user.LastName} (${user.Email})
@endmacro
@foreach (var u in Context.Users)
@FormatUser(u)
@endforeach
""";- Support async transformations
- Useful for API calls, database lookups
context.RegisterServiceAsync("translate",
async input => await translationService.TranslateAsync(input));
var template = "${Context.Services('translate')('Hello')}";where:condition- Filter collectionsorderby:property- Sort collectionsgroupby:property- Group collectionsdistinct- Remove duplicates
Theme: Ecosystem & Tooling
- Syntax highlighting for
.tmplfiles - IntelliSense for context properties
- Live preview of template output
- Error highlighting in templates
- Compile templates into C# code at build time
- Type-safe, zero-runtime overhead
- Perfect for embedded templates
// Template file: EmailTemplate.tmpl
// Generated: EmailTemplate.g.cs with type-safe methods
var email = EmailTemplate.Render(new { Name = "John", Order = "12345" });- NuGet packages with pre-built templates
- Community templates for common scenarios
- Template discovery and reuse
- Render templates from command line
- Watch mode for development
- Batch processing
dotnet tinytools render --template email.tmpl --data data.json --output email.txt
dotnet tinytools watch --template *.tmpl- Built-in i18n support
- Resource file integration
- Breakpoints in templates
- Step-through execution
- Variable inspection
- Unsafe code for extreme performance
- Memory pooling and recycling
- SIMD optimizations where applicable
- Mustache-style
{{variable}} - Liquid-style
{{ variable | filter }} - Custom delimiter configuration
To keep TinyTools tiny, we explicitly won't add:
? HTML/View Rendering - Use Razor for that
? JavaScript Execution - Use a JavaScript engine
? Heavy Dependencies - Stays lightweight
? Complex DSL - Keep it simple and readable
? Everything to Everyone - Focus on core use cases
- YEAR.MINOR.PATCH format (e.g., 2026.1.3)
- Breaking changes only in YEAR increments
- MINOR versions add features, maintain compatibility
- PATCH versions fix bugs only
- Mark as obsolete with warning
- Keep for one YEAR (e.g., 2026.x)
- Remove in next YEAR (e.g., 2027.0)
- Document in changelog and migration guide
Track all open issues on GitHub: View All Issues
- #10 -
Operator precedence bugALREADY FIXED ? - #11 -
@foreach iterates over string charactersFIXED ? - #12 -
Floating-point equality precisionFIXED ?
- No open enhancement requests currently tracked
- No open documentation issues currently tracked
- No open questions currently tracked
Note: This section is manually updated. For the most current list, visit the GitHub Issues page.
Want to influence the roadmap? We welcome:
- ?? Bug reports - GitHub Issues
- ?? Feature requests - GitHub Discussions
- ?? Pull requests - See CONTRIBUTING.md
- ?? Feedback - @wendellmva on Twitter
- Template validation (? Planned for 2026.2)
- Template caching (? Planned for 2026.2)
- Better error messages (? Planned for 2026.2)
- Visual Studio extension (? Planned for 2026.4)
- Template includes (Under consideration)
- Quarterly releases (4 per year)
- Patch releases as needed for critical bugs
- Preview releases for early feedback
- LTS support for previous YEAR versions (1 year)
| Version | Released | End of Support | Status |
|---|---|---|---|
| 2026.x | Jan 2026 | Dec 2027 | ? Current |
| 2025.x | Jan 2025 | Dec 2026 | ?? Maintenance |
| 2024.x | Jan 2024 | Dec 2025 | ? End of Life |
This roadmap is a living document. If you have ideas, suggestions, or feedback:
- Open a discussion on GitHub
- Vote on features using ?? reactions
- Share your use cases to help us prioritize
- Contribute code to help ship features faster
Last Updated: January 2026
Next Review: April 2026