An OpenCode plugin that reduces token usage by up to 45% with zero configuration. It compresses tool descriptions, compacts read output, and adds line-range edit support.
Total tokens vs baseline (lower is better)
GPT 5.3 Codex [================================> ] -45.1% saved
Claude Sonnet 4.5 [========================> ] -32.6% saved
GPT 5.2 Codex [====================> ] -26.7% saved
Minimax M2.5 Free [==================> ] -24.8% saved
Claude Opus 4.6 [=================> ] -21.8% saved
| Model | Baseline | OpenSlimedit | Saved |
|---|---|---|---|
| GPT 5.3 Codex | 77,494 tokens | 42,509 tokens | -45.1% |
| Claude Opus 4.6 | 60,841 tokens | 47,590 tokens | -21.8% |
| Claude Sonnet 4.5 | 120,884 tokens | 81,471 tokens | -32.6% |
| GPT 5.2 Codex | 39,185 tokens | 28,713 tokens | -26.7% |
| Minimax M2.5 Free | 28,031 tokens | 21,073 tokens | -24.8% |
Measured across 4 edit tasks (single-edit, multi-line-replace, multi-edit, large-file-edit) on small test files. Separate sessions, no prompt caching.
Three optimizations that compound across every API call:
-
Tool description compression — Replaces verbose built-in tool descriptions with minimal versions. Since tool schemas are sent with every API call, this saves thousands of input tokens per step.
-
Compact read output — Shortens absolute file paths to relative paths, strips type tags and footer boilerplate from file reads.
-
Line-range edit expansion — Allows the model to specify
oldStringas a line range like"55-64"instead of reproducing exact file content. The plugin transparently expands the range to the actual lines before the edit tool runs.
No custom tools. No system prompt injection. No modifications to built-in tool behavior. Everything works through lightweight hooks.
Add to your OpenCode config:
Using @latest ensures you always get the newest version automatically when OpenCode starts.
Restart OpenCode. The plugin will automatically start optimizing your sessions.
We tested multiple approaches to find the most token-efficient editing strategy. All benchmarks run on an isolated test folder with no project context, 1 iteration per case, separate sessions to avoid prompt caching effects.
Test cases:
- single-edit — 21-line file, change one word
- multi-line-replace — 48-line file, rewrite a function body
- multi-edit — 35-line file, 3 separate changes across the file
- large-file-edit — 115-line file, add try/catch + retry logic
Approaches tested:
- baseline — No plugin, default OpenCode behavior
- hashline — Tags every line with a content hash, model references lines by hash instead of reproducing content. Custom tool schema, system prompt injection.
- smart_edit — Shortens descriptions of unused tools only + line-range expansion in edit. No custom tools.
- OpenSlimedit (current) — Aggressively shortens ALL tool descriptions + compact read output + line-range expansion. No custom tools, no system prompt.
The hashline approach seemed promising in theory: tag lines with hashes so models don't need to reproduce code. In practice, it increases token usage for most models:
Total token change vs baseline (negative = savings, positive = regression)
Hashline:
Claude Opus 4.6 ██████████████ +14.0%
Claude Sonnet 4.5 ███████████████ +15.2%
GPT 5.2 Codex █████████████████████████████████████████████████ +49.9%
Minimax M2.5 Free █████████ +9.1%
OpenSlimedit:
GPT 5.3 Codex ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ -45.1%
Claude Opus 4.6 ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ -21.8%
Claude Sonnet 4.5 ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ -32.6%
GPT 5.2 Codex ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ -26.7%
Minimax M2.5 Free ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ -24.8%
The hash-tagged read output, custom tool schemas, and system prompt injection add per-step overhead that outweighs any savings from shorter oldString values. The biggest win comes from compressing tool descriptions — they're sent with every API call and the savings compound.
| Case | Baseline | Hashline | Smart Edit | OpenSlimedit |
|---|---|---|---|---|
| single-edit | 13,419 | 13,915 (+3.7%) | 12,739 (-5.1%) | 9,902 (-26.2%) |
| multi-line-replace | 13,965 | 16,940 (+21.3%) | 13,289 (-4.8%) | 10,547 (-24.5%) |
| multi-edit | 17,583 | 19,125 (+8.8%) | 16,572 (-5.7%) | 13,743 (-21.8%) |
| large-file-edit | 15,874 | 19,377 (+22.1%) | 16,691 (+5.1%) | 13,398 (-15.6%) |
| Total | 60,841 | 69,357 (+14.0%) | 59,291 (-2.5%) | 47,590 (-21.8%) |
| Case | Baseline | Hashline | OpenSlimedit |
|---|---|---|---|
| single-edit | 38,111 | 26,881 (-29.5%) | 18,460 (-51.6%) |
| multi-line-replace | 26,997 | 19,039 (-29.5%) | 20,042 (-25.8%) |
| multi-edit | 39,785 | 47,923 (+20.5%) | 19,940 (-49.9%) |
| large-file-edit | 15,991 | 45,429 (+184.1%) | 23,029 (+44.0%) |
| Total | 120,884 | 139,272 (+15.2%) | 81,471 (-32.6%) |
| Case | Baseline | Hashline | OpenSlimedit |
|---|---|---|---|
| single-edit | 8,002 | 11,208 (+40.1%) | 14,027 (+75.3%) |
| multi-line-replace | 8,325 | 19,350 (+132.4%) | 7,019 (-15.7%) |
| multi-edit | 9,510 | FAIL | 4,797 (-49.5%) |
| large-file-edit | 13,348 | 8,189 (-38.6%) | 2,870 (-78.5%) |
| Total | 39,185 | 58,747* | 28,713 (-26.7%) |
*Hashline multi-edit failed (760s timeout loop); total includes failed run
| Case | Baseline | OpenSlimedit |
|---|---|---|
| single-edit | 10,445 | 10,402 (-0.4%) |
| multi-line-replace | 20,468 | 11,312 (-44.7%) |
| multi-edit | 21,299 | 6,068 (-71.5%) |
| large-file-edit | 25,282 | 14,727 (-41.8%) |
| Total | 77,494 | 42,509 (-45.1%) |
| Case | Baseline | Hashline | Smart Edit | OpenSlimedit |
|---|---|---|---|---|
| single-edit | 10,691 | 11,098 (+3.8%) | 9,994 (-6.5%) | 7,405 (-30.7%) |
| multi-line-replace | 11,105 | 12,045 (+8.5%) | 10,396 (-6.4%) | 1,721 (-84.5%) |
| multi-edit | 2,308 | 2,331 (+1.0%) | 2,357 (+2.1%) | 8,034 (+248.1%) |
| large-file-edit | 3,927 | 5,100 (+29.9%) | 3,986 (+1.5%) | 3,913 (-0.4%) |
| Total | 28,031 | 30,574 (+9.1%) | 26,733 (-4.6%) | 21,073 (-24.8%) |
| Model | Hashline | Smart Edit | OpenSlimedit |
|---|---|---|---|
| GPT 5.3 Codex | — | — | -45.1% |
| Claude Opus 4.6 | +14.0% | -2.5% | -21.8% |
| Claude Sonnet 4.5 | +15.2% | — | -32.6% |
| GPT 5.2 Codex | +49.9%* | — | -26.7% |
| Minimax M2.5 Free | +9.1% | -4.6% | -24.8% |
*Includes failed multi-edit run
The benchmarks above use small files (21-115 lines). How does OpenSlimedit perform on real-world file sizes?
| File Size | Baseline | OpenSlimedit | Saved |
|---|---|---|---|
| 1k lines | 37,743 | 30,697 | -18.7% |
| 3k lines | 29,021 | 25,832 | -11.0% |
| 6k lines | 29,422 | 25,747 | -12.5% |
| 10k lines | 29,405 | 25,742 | -12.5% |
| File Size | Baseline | OpenSlimedit | Saved |
|---|---|---|---|
| 1k lines | 38,962 | 29,833 | -23.4% |
| 3k lines | 59,283 | 38,861 | -34.4% |
| 6k lines | 70,380 | 29,193 | -58.5% |
| 10k lines | 65,888 | 34,315 | -47.9% |
Minimax shows consistent savings (11-19%) at all file sizes. GPT 5.3 Codex shows even larger savings (23-59%) that increase with file size — the baseline becomes noisier and more expensive on larger files while OpenSlimedit stays consistent.
- Tool description compression is the biggest win. Tool schemas are sent with every API call. Shortening them saves thousands of input tokens per step, and this compounds across multi-step tasks.
- Hashline increases token usage for most models. The hash-tagged read output, custom tool schemas, and system prompt injection add per-step overhead that outweighs the savings from shorter
oldStringvalues. - OpenSlimedit consistently saves 11-45% across all tested models and file sizes with zero regressions on Opus 4.6. GPT 5.3 Codex shows the largest savings at 45.1%. Some models show regressions on individual cases (Minimax on multi-edit, Codex 5.2 on single-edit) but the total is always significantly lower.
- Custom tools confuse some models. Minimax and Codex struggle with non-standard tool schemas, leading to extra steps or failures. OpenSlimedit avoids this entirely by only modifying descriptions of existing tools.
Raw data — Hashline runs
| Mode | Model | Case | Time | Input | Output | Total | Success |
|---|---|---|---|---|---|---|---|
| hashline | claude-sonnet-4.5 | single-edit | 10,745 ms | 26,582 | 299 | 26,881 | yes |
| hashline | claude-sonnet-4.5 | multi-line-replace | 37,231 ms | 17,188 | 1,851 | 19,039 | yes |
| hashline | claude-sonnet-4.5 | multi-edit | 52,668 ms | 44,604 | 3,319 | 47,923 | yes |
| hashline | claude-sonnet-4.5 | large-file-edit | 25,097 ms | 44,466 | 963 | 45,429 | yes |
| hashline | claude-opus-4.6 | single-edit | 12,994 ms | 13,617 | 298 | 13,915 | yes |
| hashline | claude-opus-4.6 | multi-line-replace | 21,080 ms | 16,208 | 732 | 16,940 | yes |
| hashline | claude-opus-4.6 | multi-edit | 46,637 ms | 17,031 | 2,094 | 19,125 | yes |
| hashline | claude-opus-4.6 | large-file-edit | 25,787 ms | 18,401 | 976 | 19,377 | yes |
| hashline | gpt-5.2-codex | single-edit | 12,458 ms | 10,929 | 279 | 11,208 | yes |
| hashline | gpt-5.2-codex | multi-line-replace | 24,931 ms | 18,381 | 969 | 19,350 | yes |
| hashline | gpt-5.2-codex | multi-edit | 760,890 ms | 146,516 | 53,250 | 199,766 | no |
| hashline | gpt-5.2-codex | large-file-edit | 27,601 ms | 6,979 | 1,210 | 8,189 | yes |
| hashline | minimax-m2.5-free | single-edit | 13,806 ms | 10,680 | 418 | 11,098 | yes |
| hashline | minimax-m2.5-free | multi-line-replace | 56,046 ms | 11,082 | 963 | 12,045 | yes |
| hashline | minimax-m2.5-free | multi-edit | 19,062 ms | 1,654 | 677 | 2,331 | yes |
| hashline | minimax-m2.5-free | large-file-edit | 61,973 ms | 3,222 | 1,878 | 5,100 | yes |
Raw data — Baseline runs
| Mode | Model | Case | Time | Input | Output | Total | Success |
|---|---|---|---|---|---|---|---|
| baseline | claude-sonnet-4.5 | single-edit | 11,107 ms | 37,775 | 336 | 38,111 | yes |
| baseline | claude-sonnet-4.5 | multi-line-replace | 12,876 ms | 26,541 | 456 | 26,997 | yes |
| baseline | claude-sonnet-4.5 | multi-edit | 17,343 ms | 38,890 | 895 | 39,785 | yes |
| baseline | claude-sonnet-4.5 | large-file-edit | 21,273 ms | 15,035 | 956 | 15,991 | yes |
| baseline | claude-opus-4.6 | single-edit | 12,464 ms | 13,146 | 273 | 13,419 | yes |
| baseline | claude-opus-4.6 | multi-line-replace | 14,016 ms | 13,554 | 411 | 13,965 | yes |
| baseline | claude-opus-4.6 | multi-edit | 43,656 ms | 15,873 | 1,710 | 17,583 | yes |
| baseline | claude-opus-4.6 | large-file-edit | 20,120 ms | 14,981 | 893 | 15,874 | yes |
| baseline | gpt-5.2-codex | single-edit | 11,662 ms | 7,656 | 346 | 8,002 | yes |
| baseline | gpt-5.2-codex | multi-line-replace | 11,922 ms | 8,039 | 286 | 8,325 | yes |
| baseline | gpt-5.2-codex | multi-edit | 22,087 ms | 8,519 | 991 | 9,510 | yes |
| baseline | gpt-5.2-codex | large-file-edit | 29,591 ms | 11,701 | 1,647 | 13,348 | yes |
| baseline | minimax-m2.5-free | single-edit | 10,740 ms | 10,389 | 302 | 10,691 | yes |
| baseline | minimax-m2.5-free | multi-line-replace | 16,274 ms | 10,668 | 437 | 11,105 | yes |
| baseline | minimax-m2.5-free | multi-edit | 43,462 ms | 1,233 | 1,075 | 2,308 | yes |
| baseline | minimax-m2.5-free | large-file-edit | 20,430 ms | 3,250 | 677 | 3,927 | yes |
| baseline | gpt-5.3-codex | single-edit | 12,075 ms | 10,218 | 227 | 10,445 | yes |
| baseline | gpt-5.3-codex | multi-line-replace | 22,378 ms | 20,110 | 358 | 20,468 | yes |
| baseline | gpt-5.3-codex | multi-edit | 17,870 ms | 20,723 | 576 | 21,299 | yes |
| baseline | gpt-5.3-codex | large-file-edit | 22,028 ms | 24,384 | 898 | 25,282 | yes |
Raw data — Smart Edit runs
| Mode | Model | Case | Time | Input | Output | Total | Success |
|---|---|---|---|---|---|---|---|
| smart_edit | claude-opus-4.6 | single-edit | 13,016 ms | 12,432 | 307 | 12,739 | yes |
| smart_edit | claude-opus-4.6 | multi-line-replace | 15,812 ms | 12,847 | 442 | 13,289 | yes |
| smart_edit | claude-opus-4.6 | multi-edit | 40,820 ms | 14,919 | 1,653 | 16,572 | yes |
| smart_edit | claude-opus-4.6 | large-file-edit | 32,170 ms | 15,377 | 1,314 | 16,691 | yes |
| smart_edit | minimax-m2.5-free | single-edit | 11,149 ms | 9,707 | 287 | 9,994 | yes |
| smart_edit | minimax-m2.5-free | multi-line-replace | 21,405 ms | 9,992 | 404 | 10,396 | yes |
| smart_edit | minimax-m2.5-free | multi-edit | 20,998 ms | 1,377 | 980 | 2,357 | yes |
| smart_edit | minimax-m2.5-free | large-file-edit | 41,250 ms | 3,212 | 774 | 3,986 | yes |
Raw data — OpenSlimedit runs
| Mode | Model | Case | Time | Input | Output | Total | Success |
|---|---|---|---|---|---|---|---|
| openslimedit | claude-opus-4.6 | single-edit | 12,126 ms | 9,629 | 273 | 9,902 | yes |
| openslimedit | claude-opus-4.6 | multi-line-replace | 15,326 ms | 10,066 | 481 | 10,547 | yes |
| openslimedit | claude-opus-4.6 | multi-edit | 41,378 ms | 12,095 | 1,648 | 13,743 | yes |
| openslimedit | claude-opus-4.6 | large-file-edit | 28,135 ms | 12,161 | 1,237 | 13,398 | yes |
| openslimedit | claude-sonnet-4.5 | single-edit | 10,884 ms | 18,148 | 312 | 18,460 | yes |
| openslimedit | claude-sonnet-4.5 | multi-line-replace | 13,208 ms | 19,528 | 514 | 20,042 | yes |
| openslimedit | claude-sonnet-4.5 | multi-edit | 20,895 ms | 18,985 | 955 | 19,940 | yes |
| openslimedit | claude-sonnet-4.5 | large-file-edit | 20,498 ms | 22,053 | 976 | 23,029 | yes |
| openslimedit | gpt-5.2-codex | single-edit | 8,745 ms | 13,841 | 186 | 14,027 | yes |
| openslimedit | gpt-5.2-codex | multi-line-replace | 10,123 ms | 6,770 | 249 | 7,019 | yes |
| openslimedit | gpt-5.2-codex | multi-edit | 13,653 ms | 4,239 | 558 | 4,797 | yes |
| openslimedit | gpt-5.2-codex | large-file-edit | 14,786 ms | 2,206 | 664 | 2,870 | yes |
| openslimedit | minimax-m2.5-free | single-edit | 15,159 ms | 7,140 | 265 | 7,405 | yes |
| openslimedit | minimax-m2.5-free | multi-line-replace | 14,744 ms | 1,316 | 405 | 1,721 | yes |
| openslimedit | minimax-m2.5-free | multi-edit | 13,289 ms | 7,385 | 649 | 8,034 | yes |
| openslimedit | minimax-m2.5-free | large-file-edit | 21,090 ms | 3,214 | 699 | 3,913 | yes |
| openslimedit | gpt-5.3-codex | single-edit | 10,638 ms | 10,186 | 216 | 10,402 | yes |
| openslimedit | gpt-5.3-codex | multi-line-replace | 10,419 ms | 10,974 | 338 | 11,312 | yes |
| openslimedit | gpt-5.3-codex | multi-edit | 15,752 ms | 5,470 | 598 | 6,068 | yes |
| openslimedit | gpt-5.3-codex | large-file-edit | 28,453 ms | 13,359 | 1,368 | 14,727 | yes |
Raw data — Large file scaling runs
| Mode | Model | Case | Time | Input | Output | Total | Success |
|---|---|---|---|---|---|---|---|
| baseline | minimax-m2.5-free | 1k-lines | 51,367 ms | 36,733 | 1,010 | 37,743 | yes |
| baseline | minimax-m2.5-free | 3k-lines | 39,505 ms | 28,392 | 629 | 29,021 | yes |
| baseline | minimax-m2.5-free | 6k-lines | 47,862 ms | 28,398 | 1,024 | 29,422 | yes |
| baseline | minimax-m2.5-free | 10k-lines | 40,794 ms | 28,523 | 882 | 29,405 | yes |
| openslimedit | minimax-m2.5-free | 1k-lines | 25,237 ms | 29,788 | 909 | 30,697 | yes |
| openslimedit | minimax-m2.5-free | 3k-lines | 45,621 ms | 25,247 | 585 | 25,832 | yes |
| openslimedit | minimax-m2.5-free | 6k-lines | 33,315 ms | 25,158 | 589 | 25,747 | yes |
| openslimedit | minimax-m2.5-free | 10k-lines | 19,114 ms | 25,173 | 569 | 25,742 | yes |
| baseline | gpt-5.3-codex | 1k-lines | 59,368 ms | 36,850 | 1,818 | 38,668 | yes |
| baseline | gpt-5.3-codex | 1k-lines | 39,687 ms | 35,650 | 1,692 | 37,342 | yes |
| baseline | gpt-5.3-codex | 1k-lines | 30,868 ms | 34,345 | 1,551 | 35,896 | yes |
| baseline | gpt-5.3-codex | 1k-lines | 30,132 ms | 34,123 | 1,436 | 35,559 | yes |
| baseline | gpt-5.3-codex | 1k-lines | 36,521 ms | 45,786 | 1,558 | 47,344 | yes |
| baseline | gpt-5.3-codex | 3k-lines | 37,920 ms | 61,005 | 1,595 | 62,600 | yes |
| baseline | gpt-5.3-codex | 3k-lines | 42,808 ms | 63,127 | 2,088 | 65,215 | yes |
| baseline | gpt-5.3-codex | 3k-lines | 29,531 ms | 48,845 | 1,422 | 50,267 | yes |
| baseline | gpt-5.3-codex | 3k-lines | 29,003 ms | 71,641 | 1,260 | 72,901 | yes |
| baseline | gpt-5.3-codex | 3k-lines | 29,224 ms | 44,010 | 1,421 | 45,431 | yes |
| baseline | gpt-5.3-codex | 6k-lines | 32,856 ms | 53,029 | 1,665 | 54,694 | yes |
| baseline | gpt-5.3-codex | 6k-lines | 35,228 ms | 79,907 | 1,764 | 81,671 | yes |
| baseline | gpt-5.3-codex | 6k-lines | 42,342 ms | 92,061 | 2,144 | 94,205 | yes |
| baseline | gpt-5.3-codex | 6k-lines | 33,617 ms | 74,514 | 1,562 | 76,076 | yes |
| baseline | gpt-5.3-codex | 6k-lines | 35,195 ms | 43,847 | 1,407 | 45,254 | yes |
| baseline | gpt-5.3-codex | 10k-lines | 29,958 ms | 77,713 | 1,412 | 79,125 | yes |
| baseline | gpt-5.3-codex | 10k-lines | 37,031 ms | 61,844 | 1,758 | 63,602 | yes |
| baseline | gpt-5.3-codex | 10k-lines | 29,698 ms | 61,034 | 1,493 | 62,527 | yes |
| baseline | gpt-5.3-codex | 10k-lines | 41,649 ms | 60,975 | 1,533 | 62,508 | yes |
| baseline | gpt-5.3-codex | 10k-lines | 26,924 ms | 60,525 | 1,152 | 61,677 | yes |
| openslimedit | gpt-5.3-codex | 1k-lines | 35,515 ms | 16,960 | 1,696 | 18,656 | yes |
| openslimedit | gpt-5.3-codex | 1k-lines | 27,865 ms | 42,485 | 1,198 | 43,683 | yes |
| openslimedit | gpt-5.3-codex | 1k-lines | 30,197 ms | 20,297 | 1,540 | 21,837 | yes |
| openslimedit | gpt-5.3-codex | 1k-lines | 42,478 ms | 31,444 | 1,959 | 33,403 | yes |
| openslimedit | gpt-5.3-codex | 1k-lines | 23,994 ms | 30,360 | 1,225 | 31,585 | yes |
| openslimedit | gpt-5.3-codex | 3k-lines | 35,438 ms | 46,056 | 1,774 | 47,830 | yes |
| openslimedit | gpt-5.3-codex | 3k-lines | 38,383 ms | 60,527 | 1,983 | 62,510 | yes |
| openslimedit | gpt-5.3-codex | 3k-lines | 39,220 ms | 23,657 | 1,699 | 25,356 | yes |
| openslimedit | gpt-5.3-codex | 3k-lines | 28,254 ms | 27,737 | 1,428 | 29,165 | yes |
| openslimedit | gpt-5.3-codex | 3k-lines | 29,321 ms | 28,430 | 1,013 | 29,443 | yes |
| openslimedit | gpt-5.3-codex | 6k-lines | 29,934 ms | 27,332 | 1,451 | 28,783 | yes |
| openslimedit | gpt-5.3-codex | 6k-lines | 29,402 ms | 22,984 | 1,445 | 24,429 | yes |
| openslimedit | gpt-5.3-codex | 6k-lines | 34,198 ms | 28,639 | 1,410 | 30,049 | yes |
| openslimedit | gpt-5.3-codex | 6k-lines | 32,525 ms | 33,417 | 1,669 | 35,086 | yes |
| openslimedit | gpt-5.3-codex | 6k-lines | 26,625 ms | 26,330 | 1,286 | 27,616 | yes |
| openslimedit | gpt-5.3-codex | 10k-lines | 26,953 ms | 28,106 | 1,180 | 29,286 | yes |
| openslimedit | gpt-5.3-codex | 10k-lines | 33,084 ms | 28,065 | 1,423 | 29,488 | yes |
| openslimedit | gpt-5.3-codex | 10k-lines | 33,384 ms | 38,156 | 1,324 | 39,480 | yes |
| openslimedit | gpt-5.3-codex | 10k-lines | 32,269 ms | 42,259 | 1,277 | 43,536 | yes |
| openslimedit | gpt-5.3-codex | 10k-lines | 28,136 ms | 28,476 | 1,308 | 29,784 | yes |
openslimedit/
├── src/
│ └── index.ts # Plugin implementation (single file)
├── package.json
├── LICENSE
└── README.md
Contributions are welcome. Please open an issue or submit a pull request.
This project is licensed under the MIT License.