diff --git a/.gitignore b/.gitignore
index a44e7f1..02a6e36 100644
--- a/.gitignore
+++ b/.gitignore
@@ -34,6 +34,9 @@ packages/
# Publish output
publish/
+# installers
+SemanticDeveloper/Installers/Linux/pkgroot/
+
# OS files
[Dd]esktop.ini
[Tt]humbs.db
diff --git a/NOTICE b/NOTICE
index dac21a7..d6fa670 100644
--- a/NOTICE
+++ b/NOTICE
@@ -1,18 +1,18 @@
NOTICE
======
-This project integrates with Codex CLI (https://github.com/openai/codex).
+SemanticDeveloper
-Codex CLI is licensed under the MIT License:
+Copyright (c) 2025 Stainless Designer LLC
-Copyright (c) OpenAI
+Licensed under the Apache License, Version 2.0 (the "License").
+You may obtain a copy of the License at:
+ http://www.apache.org/licenses/LICENSE-2.0
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
+Third-party attributions
+- Codex CLI (https://github.com/openai/codex)
+ Licensed under the Apache License, Version 2.0.
+ Copyright (c) OpenAI and contributors.
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
+The contents of this NOTICE file are for informational purposes only and
+do not modify the License.
diff --git a/SemanticDeveloper/Installers/Linux/Installer.Linux.csproj b/SemanticDeveloper/Installers/Linux/Installer.Linux.csproj
new file mode 100644
index 0000000..9a02d6f
--- /dev/null
+++ b/SemanticDeveloper/Installers/Linux/Installer.Linux.csproj
@@ -0,0 +1,21 @@
+
+
+ net8.0
+ false
+ enable
+ SemanticDeveloper.Installer.Linux
+ SemanticDeveloper.Installer.Linux
+ Exe
+ disable
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/SemanticDeveloper/Installers/Linux/README.md b/SemanticDeveloper/Installers/Linux/README.md
new file mode 100644
index 0000000..746e700
--- /dev/null
+++ b/SemanticDeveloper/Installers/Linux/README.md
@@ -0,0 +1,22 @@
+SemanticDeveloper — Linux Installer Project (Debian/Ubuntu)
+
+Overview
+- Produces a `.deb` package for Debian/Ubuntu following Avalonia guidance.
+
+Prerequisites (run on Debian/Ubuntu)
+- .NET 8 SDK
+- `dpkg-deb`, `fakeroot`
+
+Build steps
+- Open a terminal in this folder.
+- Make the script executable: `chmod +x build_deb.sh`
+- x64: `./build_deb.sh linux-x64`
+- arm64: `./build_deb.sh linux-arm64`
+- Result: `dist/semantic-developer__.deb`
+
+Notes
+- Installs under `/opt/semantic-developer` and adds launcher under `/usr/share/applications`.
+
+References
+- Avalonia deployment (Debian/Ubuntu): https://docs.avaloniaui.net/docs/deployment/debian-ubuntu
+
diff --git a/SemanticDeveloper/Installers/Linux/build_deb.sh b/SemanticDeveloper/Installers/Linux/build_deb.sh
new file mode 100755
index 0000000..b976ec5
--- /dev/null
+++ b/SemanticDeveloper/Installers/Linux/build_deb.sh
@@ -0,0 +1,48 @@
+#!/usr/bin/env bash
+set -euo pipefail
+
+RID="${1:-linux-x64}"
+SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
+ROOT="$(cd "$SCRIPT_DIR/../../" && pwd)"
+APP_PROJ="$ROOT/SemanticDeveloper/SemanticDeveloper.csproj"
+PUBLISH_DIR="$SCRIPT_DIR/out/publish"
+PKG_ROOT="$SCRIPT_DIR/pkgroot"
+DIST_DIR="$SCRIPT_DIR/dist"
+VERSION="1.0.1"
+ARCH="amd64"
+if [[ "$RID" == "linux-arm64" ]]; then ARCH="arm64"; fi
+
+rm -rf "$PKG_ROOT" "$PUBLISH_DIR"
+mkdir -p "$PUBLISH_DIR" "$PKG_ROOT/opt/semantic-developer" "$PKG_ROOT/usr/bin" "$PKG_ROOT/usr/share/applications" "$DIST_DIR"
+
+echo "Publishing SemanticDeveloper for $RID ..."
+dotnet publish "$APP_PROJ" -c Release -r "$RID" --self-contained true \
+ /p:PublishSingleFile=true /p:IncludeNativeLibrariesForSelfExtract=true /p:PublishTrimmed=false \
+ -o "$PUBLISH_DIR"
+
+echo "Staging files ..."
+cp -R "$PUBLISH_DIR"/* "$PKG_ROOT/opt/semantic-developer/"
+ln -sf "/opt/semantic-developer/SemanticDeveloper" "$PKG_ROOT/usr/bin/semantic-developer"
+
+echo "Adding desktop entry ..."
+install -m 644 "$SCRIPT_DIR/debian/usr/share/applications/semantic-developer.desktop" "$PKG_ROOT/usr/share/applications/semantic-developer.desktop"
+
+echo "Preparing control files ..."
+mkdir -p "$PKG_ROOT/DEBIAN"
+CONTROL_FILE="$PKG_ROOT/DEBIAN/control"
+cat > "$CONTROL_FILE" <
+
+ net8.0
+ false
+ enable
+ SemanticDeveloper.Installer.Windows
+ SemanticDeveloper.Installer.Windows
+ Exe
+ disable
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/SemanticDeveloper/Installers/Windows/README.md b/SemanticDeveloper/Installers/Windows/README.md
new file mode 100644
index 0000000..52f0939
--- /dev/null
+++ b/SemanticDeveloper/Installers/Windows/README.md
@@ -0,0 +1,29 @@
+SemanticDeveloper — Windows Installer Project
+
+Overview
+- Produces a distributable for Windows: either a ZIP of the self-contained publish output or an installer using Inno Setup (optional).
+- Follows Avalonia guidance: publish self-contained, single-file, no trimming.
+
+Prerequisites
+- Windows 10/11
+- .NET 8 SDK
+- Optional (for .exe installer): Inno Setup 6 (`iscc.exe`) added to PATH
+
+Build steps (ZIP package)
+- Open a PowerShell prompt in this folder.
+- Run: `./build.ps1 -Rid win-x64 -Mode Zip`
+- Result: `artifacts/SemanticDeveloper-win-x64.zip`
+
+Build steps (Inno Setup installer)
+- Ensure Inno Setup is installed and `iscc.exe` is on PATH.
+- Run: `./build.ps1 -Rid win-x64 -Mode Inno`
+- Result: `artifacts/SemanticDeveloperSetup-win-x64.exe`
+
+Notes
+- The script publishes the app from `../..//SemanticDeveloper/SemanticDeveloper.csproj`.
+- To build for ARM64, use `-Rid win-arm64`.
+- You can customize app metadata in `SemanticDeveloper.iss`.
+
+References
+- Avalonia deployment (Windows): https://docs.avaloniaui.net/docs/deployment/windows
+
diff --git a/SemanticDeveloper/Installers/Windows/SemanticDeveloper.iss b/SemanticDeveloper/Installers/Windows/SemanticDeveloper.iss
new file mode 100644
index 0000000..9bc5590
--- /dev/null
+++ b/SemanticDeveloper/Installers/Windows/SemanticDeveloper.iss
@@ -0,0 +1,48 @@
+; Inno Setup script to package SemanticDeveloper
+#define AppName "SemanticDeveloper"
+#define AppVersion "1.0.1"
+#define Publisher "Stainless Designer LLC"
+#define URL "https://github.com/stainless-design/semantic-developer"
+#ifndef RID
+#define RID "win-x64"
+#endif
+#ifndef OutDir
+#define OutDir "out\\publish"
+#endif
+#ifndef ArtifactsDir
+#define ArtifactsDir "artifacts"
+#endif
+
+[Setup]
+AppId={{C21A3B89-8F5C-4E9F-9F5D-7B5C6A5B3A99}
+AppName={#AppName}
+AppVersion={#AppVersion}
+AppPublisher={#Publisher}
+AppPublisherURL={#URL}
+DefaultDirName={autopf64}\{#AppName}
+DefaultGroupName={#AppName}
+UninstallDisplayIcon={app}\SemanticDeveloper.exe
+OutputBaseFilename=SemanticDeveloperSetup-{#RID}
+OutputDir={#ArtifactsDir}
+Compression=lzma2
+SolidCompression=yes
+DisableDirPage=auto
+DisableProgramGroupPage=auto
+ArchitecturesInstallIn64BitMode=x64 arm64
+SetupIconFile=..\\..\\SemanticDeveloper\\Images\\SemanticDeveloperLogo.ico
+
+[Languages]
+Name: "en"; MessagesFile: "compiler:Default.isl"
+
+[Tasks]
+Name: "desktopicon"; Description: "Create a &desktop shortcut"; GroupDescription: "Additional icons:"; Flags: unchecked
+
+[Files]
+Source: "{#OutDir}/*"; DestDir: "{app}"; Flags: recursesubdirs ignoreversion
+
+[Icons]
+Name: "{autoprograms}\{#AppName}"; Filename: "{app}\SemanticDeveloper.exe"
+Name: "{autodesktop}\{#AppName}"; Filename: "{app}\SemanticDeveloper.exe"; Tasks: desktopicon
+
+[Run]
+Filename: "{app}\SemanticDeveloper.exe"; Description: "Launch {#AppName}"; Flags: nowait postinstall skipifsilent
diff --git a/SemanticDeveloper/Installers/Windows/build.ps1 b/SemanticDeveloper/Installers/Windows/build.ps1
new file mode 100644
index 0000000..7238d4f
--- /dev/null
+++ b/SemanticDeveloper/Installers/Windows/build.ps1
@@ -0,0 +1,38 @@
+$ErrorActionPreference = 'Stop'
+param(
+ [string]$Rid = 'win-x64',
+ [ValidateSet('Zip','Inno')][string]$Mode = 'Zip'
+)
+
+$root = Resolve-Path "$PSScriptRoot/../../"
+$appProj = Join-Path $root 'SemanticDeveloper/SemanticDeveloper.csproj'
+$outDir = Join-Path $PSScriptRoot 'out/publish'
+$artifacts = Join-Path $PSScriptRoot 'artifacts'
+New-Item -Force -ItemType Directory -Path $outDir | Out-Null
+New-Item -Force -ItemType Directory -Path $artifacts | Out-Null
+
+Write-Host "Publishing SemanticDeveloper for $Rid ..."
+dotnet publish $appProj -c Release -r $Rid --self-contained true /p:PublishSingleFile=true /p:IncludeNativeLibrariesForSelfExtract=true /p:PublishTrimmed=false -o $outDir
+
+if ($LASTEXITCODE -ne 0) { throw 'Publish failed.' }
+
+if ($Mode -eq 'Zip') {
+ $zip = Join-Path $artifacts "SemanticDeveloper-$Rid.zip"
+ if (Test-Path $zip) { Remove-Item $zip -Force }
+ Write-Host "Zipping to $zip ..."
+ Add-Type -AssemblyName System.IO.Compression.FileSystem
+ [System.IO.Compression.ZipFile]::CreateFromDirectory($outDir, $zip)
+ Write-Host "Done: $zip"
+ exit 0
+}
+
+if ($Mode -eq 'Inno') {
+ $iscc = (Get-Command iscc.exe -ErrorAction SilentlyContinue)
+ if (-not $iscc) { throw 'Inno Setup (iscc.exe) not found in PATH.' }
+ $iss = Join-Path $PSScriptRoot 'SemanticDeveloper.iss'
+ & $iscc $iss /DRID=$Rid /DOutDir=$outDir /DArtifactsDir=$artifacts
+ if ($LASTEXITCODE -ne 0) { throw 'Inno Setup build failed.' }
+ Write-Host "Done. See artifacts folder."
+ exit 0
+}
+
diff --git a/SemanticDeveloper/Installers/macOS/Info.plist b/SemanticDeveloper/Installers/macOS/Info.plist
new file mode 100644
index 0000000..b4d1dda
--- /dev/null
+++ b/SemanticDeveloper/Installers/macOS/Info.plist
@@ -0,0 +1,27 @@
+
+
+
+
+ CFBundleName
+ SemanticDeveloper
+ CFBundleDisplayName
+ SemanticDeveloper
+ CFBundleIdentifier
+ com.stainlessdesigner.semanticdeveloper
+ CFBundleVersion
+ 1.0.1
+ CFBundleShortVersionString
+ 1.0.1
+ CFBundlePackageType
+ APPL
+ CFBundleExecutable
+ SemanticDeveloper
+ LSMinimumSystemVersion
+ 11.0
+ LSApplicationCategoryType
+ public.app-category.developer-tools
+ NSHighResolutionCapable
+
+
+
+
diff --git a/SemanticDeveloper/Installers/macOS/Installer.macOS.csproj b/SemanticDeveloper/Installers/macOS/Installer.macOS.csproj
new file mode 100644
index 0000000..e5dffd1
--- /dev/null
+++ b/SemanticDeveloper/Installers/macOS/Installer.macOS.csproj
@@ -0,0 +1,22 @@
+
+
+ net8.0
+ false
+ enable
+ SemanticDeveloper.Installer.macOS
+ SemanticDeveloper.Installer.macOS
+ Exe
+ disable
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/SemanticDeveloper/Installers/macOS/README.md b/SemanticDeveloper/Installers/macOS/README.md
new file mode 100644
index 0000000..191d46e
--- /dev/null
+++ b/SemanticDeveloper/Installers/macOS/README.md
@@ -0,0 +1,25 @@
+SemanticDeveloper — macOS Installer Project
+
+Overview
+- Produces a macOS `.app` bundle and a `.dmg` image following Avalonia guidance.
+
+Prerequisites (run on macOS)
+- macOS 12+
+- Xcode command line tools (for `hdiutil`)
+- .NET 8 SDK
+
+Build steps
+- Open a terminal in this folder.
+- Make the script executable: `chmod +x create_dmg.sh`
+- Intel: `./create_dmg.sh osx-x64`
+- Apple Silicon: `./create_dmg.sh osx-arm64`
+- Result: `dist/SemanticDeveloper-osx-.dmg`
+
+Notes
+- The script creates `SemanticDeveloper.app` and then a DMG.
+- You may need to sign and notarize for distribution.
+
+References
+- Avalonia deployment (macOS): https://docs.avaloniaui.net/docs/deployment/macOS
+- Apple notarization: https://developer.apple.com/documentation/xcode/notarizing_macos_software_before_distribution
+
diff --git a/SemanticDeveloper/Installers/macOS/create_dmg.sh b/SemanticDeveloper/Installers/macOS/create_dmg.sh
new file mode 100644
index 0000000..4765f3a
--- /dev/null
+++ b/SemanticDeveloper/Installers/macOS/create_dmg.sh
@@ -0,0 +1,35 @@
+#!/usr/bin/env bash
+set -euo pipefail
+
+RID="${1:-osx-x64}"
+SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
+ROOT="$(cd "$SCRIPT_DIR/../../" && pwd)"
+APP_PROJ="$ROOT/SemanticDeveloper/SemanticDeveloper.csproj"
+PUBLISH_DIR="$SCRIPT_DIR/out/publish"
+APP_DIR="$SCRIPT_DIR/out/SemanticDeveloper.app"
+CONTENTS_DIR="$APP_DIR/Contents"
+MACOS_DIR="$CONTENTS_DIR/MacOS"
+RESOURCES_DIR="$CONTENTS_DIR/Resources"
+DIST_DIR="$SCRIPT_DIR/dist"
+
+mkdir -p "$PUBLISH_DIR" "$MACOS_DIR" "$RESOURCES_DIR" "$DIST_DIR"
+
+echo "Publishing SemanticDeveloper for $RID ..."
+dotnet publish "$APP_PROJ" -c Release -r "$RID" --self-contained true \
+ /p:PublishSingleFile=true /p:IncludeNativeLibrariesForSelfExtract=true /p:PublishTrimmed=false \
+ -o "$PUBLISH_DIR"
+
+echo "Creating .app bundle ..."
+cp -R "$SCRIPT_DIR/Info.plist" "$CONTENTS_DIR/Info.plist"
+cp "$ROOT/SemanticDeveloper/Images/SemanticDeveloperLogo.ico" "$RESOURCES_DIR/Icon.icns" || true
+cp -R "$PUBLISH_DIR"/* "$MACOS_DIR/"
+chmod +x "$MACOS_DIR/SemanticDeveloper"
+
+DMG_NAME="SemanticDeveloper-${RID}.dmg"
+DMG_PATH="$DIST_DIR/$DMG_NAME"
+test -f "$DMG_PATH" && rm -f "$DMG_PATH"
+
+echo "Creating DMG ..."
+hdiutil create -volname "SemanticDeveloper" -srcfolder "$APP_DIR" -ov -format UDZO "$DMG_PATH"
+echo "Done: $DMG_PATH"
+
diff --git a/SemanticDeveloper/SemanticDeveloper.sln b/SemanticDeveloper/SemanticDeveloper.sln
index 8af17d5..73e0a25 100644
--- a/SemanticDeveloper/SemanticDeveloper.sln
+++ b/SemanticDeveloper/SemanticDeveloper.sln
@@ -2,6 +2,12 @@
Microsoft Visual Studio Solution File, Format Version 12.00
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SemanticDeveloper", "SemanticDeveloper\SemanticDeveloper.csproj", "{61A7620C-C963-4DEA-9E5E-EB218D51612E}"
EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Installer.Windows", "Installers\Windows\Installer.Windows.csproj", "{C4F7A4C0-7E3D-4D64-AC64-1C3E2EDB1E01}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Installer.macOS", "Installers\macOS\Installer.macOS.csproj", "{88C2C36A-6C3E-4A82-9D31-6E0A8C6D7F02}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Installer.Linux", "Installers\Linux\Installer.Linux.csproj", "{F9B35BF2-4E63-4FC4-8F01-39BB9E0F8E03}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -12,5 +18,17 @@ Global
{61A7620C-C963-4DEA-9E5E-EB218D51612E}.Debug|Any CPU.Build.0 = Debug|Any CPU
{61A7620C-C963-4DEA-9E5E-EB218D51612E}.Release|Any CPU.ActiveCfg = Release|Any CPU
{61A7620C-C963-4DEA-9E5E-EB218D51612E}.Release|Any CPU.Build.0 = Release|Any CPU
+ {C4F7A4C0-7E3D-4D64-AC64-1C3E2EDB1E01}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {C4F7A4C0-7E3D-4D64-AC64-1C3E2EDB1E01}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {C4F7A4C0-7E3D-4D64-AC64-1C3E2EDB1E01}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {C4F7A4C0-7E3D-4D64-AC64-1C3E2EDB1E01}.Release|Any CPU.Build.0 = Release|Any CPU
+ {88C2C36A-6C3E-4A82-9D31-6E0A8C6D7F02}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {88C2C36A-6C3E-4A82-9D31-6E0A8C6D7F02}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {88C2C36A-6C3E-4A82-9D31-6E0A8C6D7F02}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {88C2C36A-6C3E-4A82-9D31-6E0A8C6D7F02}.Release|Any CPU.Build.0 = Release|Any CPU
+ {F9B35BF2-4E63-4FC4-8F01-39BB9E0F8E03}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {F9B35BF2-4E63-4FC4-8F01-39BB9E0F8E03}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {F9B35BF2-4E63-4FC4-8F01-39BB9E0F8E03}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {F9B35BF2-4E63-4FC4-8F01-39BB9E0F8E03}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
EndGlobal
diff --git a/SemanticDeveloper/SemanticDeveloper.sln.DotSettings.user b/SemanticDeveloper/SemanticDeveloper.sln.DotSettings.user
index ece89d2..f8b8d6d 100644
--- a/SemanticDeveloper/SemanticDeveloper.sln.DotSettings.user
+++ b/SemanticDeveloper/SemanticDeveloper.sln.DotSettings.user
@@ -1,3 +1,4 @@
ForceIncluded
- ForceIncluded
\ No newline at end of file
+ ForceIncluded
+
\ No newline at end of file
diff --git a/SemanticDeveloper/SemanticDeveloper/README.md b/SemanticDeveloper/SemanticDeveloper/README.md
index 4011f54..f8ef093 100644
--- a/SemanticDeveloper/SemanticDeveloper/README.md
+++ b/SemanticDeveloper/SemanticDeveloper/README.md
@@ -221,4 +221,12 @@ Selection behavior:
- Proto mode is enforced in code; the app does not fall back to non‑proto modes.
- Settings are stored under the OS‑specific application data directory and loaded on startup.
- The log view uses AvaloniaEdit + TextMate (Dark+) for better legibility and simple JSON syntax coloring.
+
+## Installers
+
+- Windows: see `SemanticDeveloper/Installers/Windows` for `build.ps1` to produce a ZIP or Inno Setup installer.
+- macOS: see `SemanticDeveloper/Installers/macOS` for `create_dmg.sh` to produce a `.app` and `.dmg`.
+- Linux (Debian/Ubuntu): see `SemanticDeveloper/Installers/Linux` for `build_deb.sh` to produce a `.deb`.
+
+Each installer project contains detailed prerequisites and step-by-step instructions.
- Token stats in the header are derived from `token_count` events. The percent remaining is estimated (using a baseline of ~12k tokens for fixed prompts) and may be approximate.