---
Made with ❤️ for productivity
⭐ Star this repo if you find it useful!
---
## ✨ Features
### 🖼️ Screen Capture
- **Multi-monitor support** — Capture across all connected displays
- **Flexible modes** — Region selection, fullscreen, or active window
- **Resizable selection** — Fine-tune your capture area with precision handles
- **Smart positioning** — Movable tool palette that stays out of your way
### ✏️ Annotation Tools
| Tool | Description |
|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------|
|  **IconPen** | Freehand drawing with customizable thickness |
|  **Line** | Straight lines for precise markups |
|  **Arrow** | Directional arrows to highlight important areas |
|  **Rectangle** | Rectangular shapes and outlines |
|  **Ellipse** | Circular and oval shapes |
|  **Text** | Add text annotations with font customization |
|  **Highlight** | Semi-transparent highlighting |
|  **Blur** | Redact sensitive information |
|  **Pixelate** | Pixelate areas for privacy |
- **Undo/Redo** — Full history support
- **Color Palette** — Quick color selection with custom picker
- **Thickness Control** — Adjustable stroke width
### 🔍 OCR (Optical Character Recognition)
- **EasyOCR** — Python-based with 80+ language support
- **Tesseract** — Lightweight native engine with language packs
- **100% Local** — No cloud services, complete privacy
- **One-click install** — Managed directly from Settings
### 🎨 Customization
- **3 Themes** — Dark, Light, and Sunset
- **73+ Languages** — Extensive localization support
- **Custom Hotkeys** — Configure keyboard shortcuts
- **Export Options** — PNG, JPEG with quality control
- **Filename Patterns** — Customizable naming templates
- **Auto-save Folder** — Set your preferred destination
### 🖥️ Cross-Platform
| Edition | Framework | Platforms |
|---------|-----------|-----------|
| **Shotora.App** | Avalonia UI 11.3 | Windows, Linux, macOS |
---
## 📸 Screenshots
### Theme Showcase
| Dark Theme | Light Theme | Sunset Theme |
|:----------:|:-----------:|:------------:|
|

|

|

|
### Editor Settings
| Dark | Light | Sunset |
|:-------------------------------------------------------------------------------------:|:-----:|:------:|
|

|

|

|
### Hotkey Configuration
| Dark | Light | Sunset |
|:----:|:-----:|:------:|
|

|

|

|
### UI Elements
| Annotation Panel | Color Palette |
|:----------------:|:-------------:|
|

|

|
---
## 📦 Installation
### Prerequisites
- **.NET 10 SDK** — [Download](https://dotnet.microsoft.com/download/dotnet/10.0)
- **Python 3.11+** — Required only for EasyOCR (optional)
### Build from Source
```bash
# Clone the repository
git clone https://github.com/YourUsername/Shotora.git
cd Shotora
# Build the solution
dotnet build Shotora.sln
# Run Avalonia version (Cross-platform)
dotnet run --project Shotora.App/Shotora.App.csproj
```
### Build Profiles
The following build profiles are available for different platforms and configurations:
| Platform | Architecture | Action | Command |
|:--------:|:------------:|:------:|:--------|
|
| x64 | Publish & Pack | `dotnet-cake --runtime=win-x64 --singlefile=true --selfcontained=true` |
|
| x86 | Publish & Pack | `dotnet-cake --runtime=win-x86 --singlefile=true --selfcontained=true` |
|
| x64 | Publish Only | `dotnet-cake --runtime=linux-x64 --singlefile=true --selfcontained=true` |
|
| arm64 | Publish Only | `dotnet-cake --runtime=linux-arm64 --singlefile=true --selfcontained=true` |
|
| x64 | Publish & Pack | `dotnet-cake --runtime=osx-x64 --singlefile=true --selfcontained=true` |
> 💡 **Tip**: Run `dotnet tool restore` first to install Cake and Velopack CLI tools.
📋 Detailed Build Commands
#### Windows (x64) — Publish and Pack
```powershell
dotnet tool run dotnet-cake --runtime=win-x64 --singlefile=true --selfcontained=true --output=./ready/win-x64
./build/pack-from-cake.ps1 -PackDir ./ready/win-x64 -Runtime win-x64 -Channel stable
```
#### Windows (x86) — Publish and Pack
```powershell
dotnet tool run dotnet-cake --runtime=win-x86 --singlefile=true --selfcontained=true --output=./ready/win-x86
./build/pack-from-cake.ps1 -PackDir ./ready/win-x86 -Runtime win-x86 -Channel stable
```
#### Linux (x64) — Publish Only
```bash
dotnet tool run dotnet-cake --runtime=linux-x64 --singlefile=true --selfcontained=true --output=./ready/linux-x64
```
#### Linux (arm64) — Publish Only
```bash
dotnet tool run dotnet-cake --runtime=linux-arm64 --singlefile=true --selfcontained=true --output=./ready/linux-arm64
```
#### macOS (x64) — Publish & Pack
```bash
dotnet tool run dotnet-cake --runtime=osx-x64 --singlefile=true --selfcontained=true --output=./ready/osx-x64
./build/pack-from-cake.ps1 -PackDir ./ready/osx-x64 -Runtime osx-x64 -Channel stable
```
### Publish (Self-Contained)
```bash
# Windows
dotnet publish Shotora.App/Shotora.App.csproj -c Release -r win-x64
# Linux
dotnet publish Shotora.App/Shotora.App.csproj -c Release -r linux-x64
# macOS
dotnet publish Shotora.App/Shotora.App.csproj -c Release -r osx-x64
```
### Velopack Setup (Windows)
- Install the pinned Velopack CLI: `dotnet tool restore` (uses `.config/dotnet-tools.json`; sets `DOTNET_ROLL_FORWARD=LatestMajor` automatically when packing).
- Build a branded Setup.exe with the Shotora splash (`build/Installer/splash.png`) and icon (`Shotora.App/Assets/Shotora.ico`):
- `pwsh ./build/pack-setup.ps1 -Runtime win-x64 -Channel win -Version 1.0.0`
- The script publishes `Shotora.App`, then runs `vpk pack` with the branded assets.
- Output artifacts land in `bin/velopack//` (including `Setup.exe` and the release/portable packages).
---
## 🚀 Usage
### Quick Start
1. **Launch** — Shotora starts minimized in the system tray
2. **Capture** — Use hotkey or right-click tray icon
3. **Select** — Draw a region on screen
4. **Annotate** — Use the toolbar to mark up your capture
5. **Export** — Copy to clipboard, save to file, or extract text with OCR
### Default Hotkeys
| Action | Shortcut |
|--------|----------|
| Region Capture | `Ctrl + Shift + PrintScreen` |
| Fullscreen Capture | `Alt + PrintScreen` |
| Active Window | `Shift + Win + S` |
> 💡 All hotkeys are configurable in Settings
### Editor Controls
| Key | Action |
|-----|--------|
| `Escape` | Deselect tool / Exit editor |
| `Ctrl + Z` | Undo |
| `Ctrl + Y` | Redo |
| `Ctrl + C` | Copy selection |
| `Ctrl + S` | Save selection |
---
## 🔍 OCR Engines
### EasyOCR
- **Languages**: 80+ including CJK, Arabic, Cyrillic
- **Installation**: Managed from Settings (requires Python)
- **Best for**: Multi-language documents, complex scripts
### Tesseract
- **Languages**: English bundled, others downloadable
- **Installation**: Built-in, no external dependencies
- **Best for**: Quick text extraction, lightweight usage
Both engines run **completely offline** — your screenshots never leave your device.
---
## 🏗️ Project Structure
```
Shotora/
├── Shotora.App/ # Avalonia Cross-Platform Application
│ ├── Views/ # Windows and dialogs (MainWindow, OverlayWindow, SettingsWindow, etc.)
│ ├── Controls/ # Custom UI controls
│ ├── Services/ # Platform services
│ ├── Extensions/ # Extension methods
│ ├── Styles/ # Avalonia styles and themes
│ ├── Assets/ # Application assets (icons, installer resources, screenshots)
│ ├── Content/ # Fonts and content files
│ ├── Resources/ # Resource files
│ └── Properties/ # Launch settings and project properties
│
├── Shotora.App.Interfaces/ # Service contracts and abstractions
│ ├── Abstractions/ # Base interfaces and abstractions
│ ├── Adapters/ # Adapter interfaces
│ ├── Builders/ # Builder pattern interfaces
│ ├── DrawingServices/ # Drawing service interfaces
│ ├── Ocr/ # OCR service interfaces
│ ├── PeripheralServices/ # Peripheral service interfaces
│ ├── Providers/ # Provider interfaces
│ ├── System/ # System-level interfaces
│ └── ViewModels/ # ViewModel interfaces
│
├── Shotora.App.Models/ # Domain models and DTOs
│ ├── ViewModels/ # MVVM view models
│ ├── Enums/ # Enumeration types
│ ├── Constants/ # Constant definitions
│ ├── Drawings/ # Drawing models
│ ├── ItemModels/ # Item-specific models
│ ├── AtomModels/ # Atomic models
│ ├── Localization/ # Localization models
│ ├── SealedModels/ # Sealed/immutable models
│ ├── System/ # System models
│ ├── Extensions/ # Model extensions
│ └── Utilities/ # Model utilities
│
├── Shotora.App.Services/ # Business logic and services
│ ├── Abstractions/ # Service abstractions
│ ├── Adapters/ # Service adapters
│ ├── Builders/ # Builder implementations
│ ├── DrawingServices/ # Drawing service implementations
│ ├── Ocr/ # OCR service implementations
│ ├── PeripheralServices/ # Peripheral services
│ ├── Providers/ # Provider implementations
│ ├── PythonEmbed/ # Python embedding for EasyOCR
│ ├── System/ # System-level services
│ └── ViewModels/ # Service view models
│
├── Shotora.App.Tests/ # Unit and integration tests
│ ├── Abstractions/ # Tests for service abstractions
│ ├── Builders/ # Tests for builder implementations
│ ├── DrawingServices/ # Tests for drawing services
│ ├── PeripheralServices/ # Tests for peripheral services
│ ├── Providers/ # Tests for providers
│ ├── System/ # Tests for system services
│ └── ViewModels/ # Tests for view models
│
├── NativeSupport/ # Native platform bindings
│ ├── Adapters/ # Native adapters
│ ├── Binaries/ # Native binaries (Linux, Mac, Windows)
│ ├── Constants/ # Native constants
│ ├── Enums/ # Native enums
│ ├── Extensions/ # Native extensions
│ └── Services/ # Native services
│
├── Shared.Interfaces/ # Shared interface contracts
│ ├── Adapters/ # Shared adapter interfaces
│ └── Facades/ # Shared facade interfaces
│
├── Shared.Models/ # Shared domain models
│ ├── Constants/ # Shared constants
│ └── Enums/ # Shared enums
│
├── Shared.Services/ # Shared service implementations
│ ├── Adapters/ # Shared adapters
│ └── Facades/ # Shared facades
│
├── build/ # Build scripts and configurations
│ ├── pack-from-cake.ps1 # Velopack packaging script
│ ├── pack-setup.ps1 # Setup.exe builder
│ ├── pack-macos.ps1 # macOS packaging script
│ └── fix-macos-dylibs.ps1 # macOS dylib fixer
│
└── Releases/ # Release artifacts and checksums
└── checksums.txt # SHA-256 checksums for release files
```
---
## 🛠️ Development
### Running Tests
```bash
dotnet test Shotora.sln
```
---
## 🔐 Release Checksums
To verify the integrity of downloaded release files, compare their SHA-256 checksums against the official values:
| File | SHA-256 Checksum |
|------|------------------|
| `Shotora_Installer_Mac_x64.pkg` | `9AE9FD005B1149EF816715E1042C23FCF9376C5302501615531C2570F61ACB9C` |
| `Shotora_Installer_Windows_x64.exe` | `B8A098E5EDC64DB26814D9ECE649702FC72200BC5C590DEA45AA4A5414F2E635` |
| `Shotora_Installer_Windows_x86.exe` | `F6E10682367358BA054D5AF45BE25D2C14695A655886A9F01DEA96ECA0862157` |
| `Shotora_Portable_Linux_arm64.App` | `3DEE5D4871A180E09F6F8AD1596E0FE2272AA0DC47811FDA7D9797D10089BE23` |
| `Shotora_Portable_Linux_x64.App` | `24F02ECC1DE1A48D8176E8CDD6CB988A8B13CBA167AECB9EBB648B83AAD807B5` |
| `Shotora_Portable_Windows_x64.exe` | `7C2B010B6F365756B68662E25CDA3EB5BD80C9F23169C8228339C67DE7900A5F` |
| `Shotora_Portable_Windows_x86.exe` | `1EB0C9B3AD054BE369EFB088E66E3765EF33ED5F422EBE53C90CA6DD5738414D` |
### Verifying Checksums
**Windows (PowerShell):**
```powershell
Get-FileHash -Algorithm SHA256 Shotora_Installer_Windows_x64.exe
```
**Linux/macOS:**
```bash
sha256sum Shotora_Portable_Linux_x64.App
# or on macOS:
shasum -a 256 Shotora_Installer_Mac_x64.pkg
```
> 💡 **Tip**: All checksums are also available in [`Releases/checksums.txt`](Releases/checksums.txt)
---
# Detailed Coverage Report
> **Generated:** 2026-01-24 22:06:06
> **Tool:** DotCover 2025.3.1
> **Report Type:** Detailed File-Level Analysis
> **Minimum Threshold:** 80%
## Overall Summary
| Metric | Value |
|--------|-------|
| **Total Files** | 52 |
| **Total Statements** | 5,605 |
| **Covered Statements** | 4,703 |
| **Coverage** |  |
### Coverage Distribution
| Category | Files | Percentage |
|----------|-------|------------|
| **Perfect** (100%) | 19 | 36.5% |
| **High** (80-99%) | 11 | 21.2% |
| **Medium** (60-79%) | 0 | 0% |
| **Low** (1-59%) | | 0% |
| **No Coverage** (0%) | 21 | 40.4% |
---
###  **NativeSupport** 
>  | **2** / 94 statements covered
####  **Extensions** 
> **2** / 2 statements covered
####  **Services** 
>  | **0** / 92 statements covered
###  **Shared.Models** 
> **495** / 495 statements covered
####  **Constants** 
> **495** / 495 statements covered
| File | Coverage | Statements | Progress |
|------|----------|------------|----------|
| `LanguageCollection.cs` |  | 242 / 242 | `[###############]` 100% |
| `Links.cs` |  | 253 / 253 | `[###############]` 100% |
###  **Shotora.App.Services** 
>  | **1,064** / 1,857 statements covered
####  **Abstractions** 
>  | **53** / 231 statements covered
####  **Adapters** 
>  | **0** / 37 statements covered
| File | Coverage | Statements | Progress |
|------|----------|------------|----------|
| `AvaloniaEnumAdapter.cs` |  **!** | 0 / 9 | `[---------------]` 0% |
| `ColorAdapter.cs` |  **!** | 0 / 14 | `[---------------]` 0% |
| `SkiaImageAdapter.cs` |  **!** | 0 / 14 | `[---------------]` 0% |
####  **Builders** 
>  | **12** / 23 statements covered
| File | Coverage | Statements | Progress |
|------|----------|------------|----------|
| `AnnotationItemBuilder.cs` |  **!** | 0 / 10 | `[---------------]` 0% |
| `FilePickerBuilder.cs` |  **!** | 0 / 1 | `[---------------]` 0% |
| `PathBuilder.cs` |  | 12 / 12 | `[###############]` 100% |
####  **DrawingServices** 
> **495** / 595 statements covered
| File | Coverage | Statements | Progress |
|------|----------|------------|----------|
| `AnnotationDrawingService.cs` |  | 114 / 126 | `[#############--]` 90% |
| `ArrowDrawingService.cs` |  | 77 / 77 | `[###############]` 100% |
| `EllipseDrawingService.cs` |  **!** | 0 / 29 | `[---------------]` 0% |
| `GridDrawingService.cs` |  | 42 / 42 | `[###############]` 100% |
| `LineDrawingService.cs` |  **!** | 0 / 11 | `[---------------]` 0% |
| `PolylineDrawingService.cs` |  | 28 / 28 | `[###############]` 100% |
| `RectangleDrawingService.cs` |  | 100 / 112 | `[#############--]` 89% |
| `SaveDrawingService.cs` |  | 1 / 1 | `[###############]` 100% |
| `SkiaDrawingService.cs` |  | 74 / 79 | `[##############-]` 94% |
| `TextDrawingService.cs` |  | 59 / 59 | `[###############]` 100% |
| `TranslationDrawingService.cs` |  **!** | 0 / 31 | `[---------------]` 0% |
####  **Facades** 
>  | **0** / 2 statements covered
####  **Ocr** 
>  | **0** / 140 statements covered
####  **EasyOcr** 
>  | **0** / 18 statements covered
| File | Coverage | Statements | Progress |
|------|----------|------------|----------|
| `MaintenanceEasyOcrService.cs` |  **!** | 0 / 1 | `[---------------]` 0% |
| `PackageDetectorEasyOcrService.cs` |  **!** | 0 / 17 | `[---------------]` 0% |
####  **Tesseract** 
>  | **0** / 62 statements covered
| File | Coverage | Statements | Progress |
|------|----------|------------|----------|
| `LanguageTesseractService.cs` |  **!** | 0 / 39 | `[---------------]` 0% |
| `TessdataTesseractService.cs` |  **!** | 0 / 23 | `[---------------]` 0% |
####  **PeripheralServices** 
> **66** / 69 statements covered
| File | Coverage | Statements | Progress |
|------|----------|------------|----------|
| `KeyboardInteractionService.cs` |  | 20 / 23 | `[#############--]` 87% |
| `MouseInteractionService.cs` |  | 46 / 46 | `[###############]` 100% |
####  **Providers** 
> **244** / 293 statements covered
| File | Coverage | Statements | Progress |
|------|----------|------------|----------|
| `IconVisibilityProvider.cs` |  | 9 / 9 | `[###############]` 100% |
| `LocalizationProvider.cs` |  **!** | 0 / 34 | `[---------------]` 0% |
| `PythonProvider.cs` |  | 67 / 78 | `[############---]` 86% |
| `SettingsProvider.cs` |  | 51 / 51 | `[###############]` 100% |
| `TrayMenuWindowService.cs` |  | 117 / 121 | `[##############-]` 97% |
####  **System** 
>  | **51** / 293 statements covered
| File | Coverage | Statements | Progress |
|------|----------|------------|----------|
| `ClipboardService.cs` |  **!** | 0 / 2 | `[---------------]` 0% |
| `HotkeyService.cs` |  **!** | 0 / 54 | `[---------------]` 0% |
| `ScreenshotService.cs` |  **!** | 0 / 173 | `[---------------]` 0% |
| `SettingsSystemService.cs` |  **!** | 0 / 8 | `[---------------]` 0% |
| `StartupService.cs` |  | 51 / 56 | `[#############--]` 91% |
####  **ViewModels** 
> **143** / 174 statements covered
| File | Coverage | Statements | Progress |
|------|----------|------------|----------|
| `AboutViewModel.cs` |  **!** | 0 / 14 | `[---------------]` 0% |
| `SettingsViewModelController.cs` |  | 143 / 160 | `[#############--]` 89% |
###  **Shotora.App.Tests** 
> **2,543** / 2,553 statements covered
####  **DrawingServices** 
> **1,237** / 1,241 statements covered
| File | Coverage | Statements | Progress |
|------|----------|------------|----------|
| `RectangleDrawingServiceTests.cs` |  | 243 / 244 | `[###############]` 100% |
| `SaveDrawingServiceTests.cs` |  | 219 / 220 | `[###############]` 100% |
| `SkiaDrawingServiceTests.cs` |  | 259 / 260 | `[###############]` 100% |
| `TextDrawingServiceTests.cs` |  | 516 / 517 | `[###############]` 100% |
####  **PeripheralServices** 
> **298** / 300 statements covered
| File | Coverage | Statements | Progress |
|------|----------|------------|----------|
| `KeyboardInteractionServiceTests.cs` |  | 199 / 200 | `[###############]` 100% |
| `MouseInteractionServiceTests.cs` |  | 99 / 100 | `[##############-]` 99% |
####  **Providers** 
> **1,008** / 1,012 statements covered
| File | Coverage | Statements | Progress |
|------|----------|------------|----------|
| `IconVisibilityProviderTests.cs` |  | 544 / 545 | `[###############]` 100% |
| `PythonProviderTests.cs` |  | 21 / 22 | `[##############-]` 95% |
| `SettingsProviderTests.cs` |  | 282 / 283 | `[###############]` 100% |
| `TrayMenuWindowServiceTests.cs` |  | 161 / 162 | `[##############-]` 99% |
---
## Files Needing Attention
> **20 file(s)** below 80% coverage threshold
| Priority | File | Coverage | Statements | Uncovered |
|----------|------|----------|------------|-----------|
|  | `Shotora.App.Services\Providers\LocalizationProvider.cs` |  | 34 | 34 |
|  | `Shotora.App.Services\Ocr\EasyOcr\MaintenanceEasyOcrService.cs` |  | 1 | 1 |
|  | `Shotora.App.Services\System\ScreenshotService.cs` |  | 173 | 173 |
|  | `Shotora.App.Services\Adapters\AvaloniaEnumAdapter.cs` |  | 9 | 9 |
|  | `NativeSupport\Services\BinariesLoaderService.cs` |  | 92 | 92 |
|  | `Shotora.App.Services\Ocr\Tesseract\TessdataTesseractService.cs` |  | 23 | 23 |
|  | `Shotora.App.Services\System\ClipboardService.cs` |  | 2 | 2 |
|  | `Shotora.App.Services\Builders\AnnotationItemBuilder.cs` |  | 10 | 10 |
|  | `Shotora.App.Services\Adapters\SkiaImageAdapter.cs` |  | 14 | 14 |
|  | `Shotora.App.Services\Ocr\EasyOcr\PackageDetectorEasyOcrService.cs` |  | 17 | 17 |
|  | `Shotora.App.Services\DrawingServices\LineDrawingService.cs` |  | 11 | 11 |
|  | `Shotora.App.Services\Ocr\BaseOcrService.cs` |  | 60 | 60 |
|  | `Shotora.App.Services\ViewModels\AboutViewModel.cs` |  | 14 | 14 |
|  | `Shotora.App.Services\Builders\FilePickerBuilder.cs` |  | 1 | 1 |
|  | `Shotora.App.Services\DrawingServices\EllipseDrawingService.cs` |  | 29 | 29 |
|  | `Shotora.App.Services\System\HotkeyService.cs` |  | 54 | 54 |
|  | `Shotora.App.Services\System\SettingsSystemService.cs` |  | 8 | 8 |
|  | `Shotora.App.Services\Facades\SevenZipFacade.cs` |  | 2 | 2 |
|  | `Shotora.App.Services\DrawingServices\TranslationDrawingService.cs` |  | 31 | 31 |
|  | `Shotora.App.Services\Ocr\Tesseract\LanguageTesseractService.cs` |  | 39 | 39 |
---
*Detailed report generated by Shotora Coverage Tool | Powered by DotCover 2025.3.1*
---