Extract TODO:: items and markdown checklists from your source files β entirely in your browser. Nothing is uploaded to any server.
- π¦ Extract from ZIP β Upload a
.ziparchive and recursively find allTODO::and[ ]/[x]patterns across every file inside - π Extract from Files β Select individual files directly
- π Load
.todosSessions β Load a previously saved session and continue working - β¨ Blank Canvas β Start fresh with custom groups and tasks
- π Drag & Drop β Reorder tasks within and between groups
- βοΈ Edit & Manage β Rename groups, add/remove/edit tasks, toggle completion
- π Search/Filter β Quickly find tasks across all groups
- πΎ Save Sessions β Download your progress as a
.todosJSON file for later - β No Server Upload β All processing happens client-side via WebAssembly
(Add screenshots here)
| Technology | Purpose |
|---|---|
| .NET 10 | Runtime & SDK |
| Blazor WebAssembly | Client-side SPA framework |
| C# 13 / .NET 10 | Language & BCL |
| xUnit | Unit testing |
| Bootstrap 5 | CSS framework (grid only) |
- .NET 10.0 SDK (or later)
- A code editor (VS Code, Rider, Visual Studio 2022+)
# Clone the repository
git clone https://github.com/navidezashibi/TodoExtractor.git
cd TodoExtractor
# Restore dependencies
dotnet restore
# Run the app (opens at http://localhost:5251)
dotnet run --project src/TodoExtractorOr use the Watch mode for hot reload during development:
dotnet watch --project src/TodoExtractordotnet test# Publish the app in Release mode
dotnet publish src/TodoExtractor -c Release -o publishThe output will be in publish/wwwroot/ β a fully static site ready for deployment.
publish/wwwroot/
βββ _framework/ # .NET WebAssembly runtime & assemblies
βββ css/ # Application styles
βββ lib/ # Third-party libraries (Bootstrap)
βββ sample-data/ # Sample files
βββ index.html # SPA entry point
βββ TodoExtractor.styles.css # Scoped CSS
βββ web.config # IIS URL rewrite rules (for IIS hosts)
Deploying to GitHub Pages requires a few extra steps because Blazor WASM is a Single Page Application (SPA) served from a subpath.
For a repo at https://username.github.io/TodoExtractor/, the <base> tag in wwwroot/index.html must be updated to <base href="/TodoExtractor/" />.
The simplest way is to use the ghaction-rewrite-base-href action in your workflow β it automatically rewrites the base tag during CI.
-
.nojekyllβ Create an empty file at the repo root. This tells GitHub Pages not to process the site with Jekyll (otherwise_framework/is ignored). -
.gitattributesβ Add to repo root to prevent line-ending corruption of JavaScript/WebAssembly files:*.js binary *.wasm binary
GitHub Pages doesn't support server-side URL rewriting. Create a wwwroot/404.html with a redirect script, or use stevesandersonms/ghaction-rewrite-base-href which handles this automatically.
Create .github/workflows/deploy.yml:
name: Deploy to GitHub Pages
on:
push:
branches: [main]
jobs:
deploy:
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- uses: actions/checkout@v4
- name: Setup .NET
uses: actions/setup-dotnet@v4
with:
dotnet-version: "10.0.x"
- name: Publish
run: dotnet publish src/TodoExtractor -c Release -o release
- name: Rewrite base href
uses: SteveSandersonMS/ghaction-rewrite-base-href@v1.1.0
with:
html_path: release/wwwroot/index.html
base_href: /TodoExtractor/
- name: Deploy to GitHub Pages
uses: JamesIves/github-pages-deploy-action@v4
with:
folder: release/wwwroot
branch: gh-pagesNote: Replace
TodoExtractorwith your actual repository name in thebase_hrefabove.
Blazor WASM produces a static site β no server-side runtime is needed. Simply upload the compiled files.
-
Publish the app:
dotnet publish src/TodoExtractor -c Release -o publish
-
Upload the contents of
publish/wwwroot/to your web root (e.g.,public_html/,httpdocs/, or/var/www/html/). -
Configure SPA fallback (required for direct URL navigation / page refresh to work):
IIS / Windows Hosting
The publish process generates a
web.configwith URL Rewrite rules. Ensure the URL Rewrite Module is installed on your IIS server. If it's not, contact your hosting provider.The generated
web.configcontains:<?xml version="1.0" encoding="UTF-8"?> <configuration> <system.webServer> <rewrite> <rules> <rule name="SPA Fallback" stopProcessing="true"> <match url=".*" /> <conditions> <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" /> </conditions> <action type="Rewrite" url="/" /> </rule> </rules> </rewrite> <staticContent> <mimeMap fileExtension=".wasm" mimeType="application/wasm" /> <mimeMap fileExtension=".br" mimeType="application/brotli" /> </staticContent> </system.webServer> </configuration>
Apache / Linux Hosting
Remove the auto-generated
web.configand create an.htaccessfile in your web root:RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^ index.html [L] # MIME types for Blazor WASM AddType application/wasm .wasm AddType application/brotli .br
Nginx
location / { try_files $uri $uri/ /index.html =404; } location ~ \.wasm$ { add_header Content-Type application/wasm; }
-
Verify MIME types β Ensure your server serves
.wasmfiles withContent-Type: application/wasm. Check the browser's Network tab if the app fails to load.
| Problem | Likely Cause | Fix |
|---|---|---|
| Blank page, no errors | Missing .wasm MIME type |
Add application/wasm to server config |
| 404 on page refresh | No SPA fallback rule | Add URL rewrite rule (see above) |
_framework failing to load |
Jekyll processing (GitHub Pages) | Add .nojekyll file |
| Integrity check failure | Git changed line endings of .js files |
Add *.js binary to .gitattributes |
TodoExtractor/
βββ docs/
β βββ Intro.md # Original project documentation
βββ examples/
β βββ edge-cases/ # Edge case test data
β βββ languages/ # Language-specific examples
β βββ mixed/ # Mixed format examples
β βββ project-structure/ # Full project example with TODOs
β βββ simple/ # Simple test data
β βββ todos-output/ # Sample .todos output file
βββ src/
β βββ TodoExtractor/ # Blazor WebAssembly app
β βββ Layout/ # App layout (MainLayout)
β βββ Models/ # Data models (TodoTask, TaskGroup, etc.)
β βββ Pages/ # Razor pages (Home, Board)
β βββ Services/ # Application services
β βββ wwwroot/ # Static assets
β βββ Program.cs # Entry point
βββ tests/
β βββ TodoExtractor.Tests/ # xUnit unit tests
βββ .gitignore
βββ TodoExtractor.slnx # Solution file
βββ README.md # This file
The project uses xUnit with 41+ tests covering:
- Task extraction from text (TODO:: and checklist patterns)
- File parsing and grouping
- Session serialization/deserialization round-trip
- Group CRUD operations (create, rename, delete, uniqueness)
- Session lifecycle management
Run tests:
dotnet testNavid Dezashibi
- GitHub: @dezashibi
Copyright (c) 2026 Navid Dezashibi
This project is licensed under the MIT License β see the LICENSE file for details.