diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index bcec3896..11cdc1e0 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -45,6 +45,10 @@ jobs: shell: pwsh run: .\tools\test-public-materials-negative.ps1 + - name: Verify static product site + shell: pwsh + run: .\tools\test-site.ps1 + - name: Restore application run: dotnet restore src/SightAdapt/SightAdapt.csproj diff --git a/.github/workflows/pages.yml b/.github/workflows/pages.yml new file mode 100644 index 00000000..ef00e204 --- /dev/null +++ b/.github/workflows/pages.yml @@ -0,0 +1,53 @@ +name: Deploy SightAdapt Pages + +on: + workflow_dispatch: + workflow_run: + workflows: ["Build and test SightAdapt"] + types: [completed] + +concurrency: + group: sightadapt-pages + cancel-in-progress: false + +permissions: + contents: read + pages: write + id-token: write + +jobs: + package: + if: >- + github.event_name == 'workflow_dispatch' || + (github.event.workflow_run.conclusion == 'success' && + github.event.workflow_run.event == 'push' && + github.event.workflow_run.head_branch == 'main') + runs-on: ubuntu-latest + steps: + - name: Check out exact validated source + uses: actions/checkout@v4 + with: + ref: ${{ github.event_name == 'workflow_run' && github.event.workflow_run.head_sha || github.sha }} + + - name: Validate static site + shell: pwsh + run: ./tools/test-site.ps1 + + - name: Configure GitHub Pages + uses: actions/configure-pages@v5 + + - name: Upload static site + uses: actions/upload-pages-artifact@v4 + with: + path: ./site + + deploy: + needs: package + runs-on: ubuntu-latest + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + steps: + - name: Deploy exact validated site + id: deployment + uses: actions/deploy-pages@v4 diff --git a/site/.nojekyll b/site/.nojekyll new file mode 100644 index 00000000..e69de29b diff --git a/site/README.md b/site/README.md new file mode 100644 index 00000000..dd3c7771 --- /dev/null +++ b/site/README.md @@ -0,0 +1,81 @@ +# SightAdapt™ static product site + +This directory contains the dependency-free static implementation of the SightAdapt product site defined by issue #124 and implemented under #99. + +## Hosting model + +- canonical public product root: `https://aiteracja.pl/sightadapt/` +- GitHub Pages origin/fallback: `https://keyffms.github.io/SightAdapt/` +- optional convenience address: `https://sightadapt.aiteracja.pl/` (permanent redirect only; not a second canonical site) +- official binary authority: GitHub Releases + +The site intentionally uses relative asset and navigation paths so the same tree can be served below both `/SightAdapt/` and `/sightadapt/`. + +## Architecture + +The site is plain HTML and CSS: + +- no JavaScript framework; +- no build-time package manager; +- no cookies; +- no analytics; +- no tracking pixels; +- no remote font requests; +- no unsolicited third-party embeds. + +Canonical repository SVG assets are copied into `site/assets/` so the public pages do not depend on runtime requests to GitHub raw content. + +## Pages + +- `/` — product overview +- `/features/` +- `/download/` +- `/docs/` +- `/how-it-works/` +- `/faq/` +- `/releases/` +- `/privacy/` +- `/legal/` +- `/security/` +- `/support/` + +## Visual provenance + +- Brand SVG files are byte-for-byte copies of the canonical repository assets in `assets/brand/`. +- The architecture diagram on `/how-it-works/` is project-owned HTML/CSS derived from `docs/ARCHITECTURE.md`; it contains no third-party imagery and exposes a full text alternative. +- No third-party product logos, screenshots or private user content are included. +- An authentic product screenshot for the home-page hero remains a content-production follow-up; a fabricated or generated screenshot must not be substituted for it. + +## Local preview + +From the repository root, run any local static HTTP server. With Python 3: + +```powershell +python -m http.server 8000 --directory .\site +``` + +Then open: + +```text +http://localhost:8000/ +``` + +The site does not require Python to build or deploy; Python is only one convenient local preview server. + +## Validation + +Run: + +```powershell +.\tools\test-site.ps1 +``` + +The validator checks the required page inventory, document structure, canonical URLs, accessibility basics, local link/assets, required trademark/footer wording and the absence of remote active content. + +## Deployment + +`.github/workflows/pages.yml` deploys the exact `site/` tree only after a successful `Build and test SightAdapt` run for a push to `main`. Manual dispatch is also available for maintainers. + +Repository Settings → Pages must use GitHub Actions as the Pages source. The repository `main` branch must also be protected according to issue #87 before the protected-default-branch acceptance criterion can be considered complete. + +SightAdapt™ is an unregistered product mark used by KeyffMS / aiteracja.pl. diff --git a/site/assets/sightadapt-lockup-dark.svg b/site/assets/sightadapt-lockup-dark.svg new file mode 100644 index 00000000..2b210230 --- /dev/null +++ b/site/assets/sightadapt-lockup-dark.svg @@ -0,0 +1,34 @@ + + + SightAdapt trademarked product logo for light backgrounds + The SightAdapt eye mark followed by the word SightAdapt and an unregistered trademark symbol. + Copyright 2026 KeyffMS / aiteracja.pl. SightAdapt™ is an unregistered product mark. + + + + + + + + + + + + + + + + + + + + + + + + + + + SightAdapt + ™ + diff --git a/site/assets/sightadapt-lockup-light.svg b/site/assets/sightadapt-lockup-light.svg new file mode 100644 index 00000000..23156a2b --- /dev/null +++ b/site/assets/sightadapt-lockup-light.svg @@ -0,0 +1,34 @@ + + + SightAdapt trademarked product logo for dark backgrounds + The SightAdapt eye mark followed by the word SightAdapt and an unregistered trademark symbol. + Copyright 2026 KeyffMS / aiteracja.pl. SightAdapt™ is an unregistered product mark. + + + + + + + + + + + + + + + + + + + + + + + + + + + SightAdapt + ™ + diff --git a/site/assets/sightadapt-mark.svg b/site/assets/sightadapt-mark.svg new file mode 100644 index 00000000..55269ec9 --- /dev/null +++ b/site/assets/sightadapt-mark.svg @@ -0,0 +1,38 @@ + + + SightAdapt product mark + A stylized eye on a rounded dark-blue square with a blue and violet iris. + Copyright 2026 KeyffMS / aiteracja.pl. SightAdapt is distributed under the repository license. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/site/assets/site.css b/site/assets/site.css new file mode 100644 index 00000000..9b318759 --- /dev/null +++ b/site/assets/site.css @@ -0,0 +1,438 @@ +:root { + color-scheme: light; + --ink: #0f172a; + --muted: #475569; + --paper: #ffffff; + --surface: #f8fafc; + --surface-strong: #eef2ff; + --line: #cbd5e1; + --brand: #243b83; + --brand-strong: #172554; + --accent: #075985; + --focus: #f59e0b; + --success: #166534; + --warning-bg: #fff7ed; + --warning-line: #c2410c; + --max: 74rem; + font-family: "Segoe UI", system-ui, -apple-system, BlinkMacSystemFont, sans-serif; +} + +* { box-sizing: border-box; } + +html { scroll-behavior: smooth; } + +body { + margin: 0; + color: var(--ink); + background: var(--paper); + font-size: 1rem; + line-height: 1.65; +} + +img { max-width: 100%; height: auto; } + +a { + color: var(--accent); + text-underline-offset: .18em; +} + +a:hover { text-decoration-thickness: .16em; } + +a:focus-visible, +button:focus-visible, +summary:focus-visible { + outline: .2rem solid var(--focus); + outline-offset: .2rem; + border-radius: .2rem; +} + +.skip-link { + position: absolute; + left: .75rem; + top: -5rem; + z-index: 100; + background: var(--ink); + color: #fff; + padding: .75rem 1rem; + border-radius: .35rem; +} + +.skip-link:focus { top: .75rem; } + +.container { + width: min(calc(100% - 2rem), var(--max)); + margin-inline: auto; +} + +.site-header { + border-bottom: 1px solid var(--line); + background: rgba(255,255,255,.98); +} + +.header-inner { + min-height: 4.75rem; + display: flex; + align-items: center; + justify-content: space-between; + gap: 1.25rem; +} + +.brand img { width: 13rem; display: block; } + +.desktop-nav { + display: flex; + flex-wrap: wrap; + align-items: center; + gap: .85rem; +} + +.desktop-nav a, +.mobile-nav a { + color: var(--ink); + font-weight: 600; + text-decoration: none; +} + +.desktop-nav a[aria-current="page"], +.mobile-nav a[aria-current="page"] { + text-decoration: underline; + text-decoration-thickness: .16em; +} + +.mobile-menu { display: none; } +.mobile-menu summary { font-weight: 700; cursor: pointer; } +.mobile-nav { display: grid; gap: .65rem; padding: .75rem 0 1rem; } + +.button { + display: inline-block; + padding: .72rem 1rem; + border: 2px solid var(--brand); + border-radius: .5rem; + background: var(--brand); + color: #fff !important; + font-weight: 700; + text-decoration: none; +} + +.button.secondary { + background: transparent; + color: var(--brand) !important; +} + +.button.light { + border-color: #fff; + background: #fff; + color: var(--brand-strong) !important; +} + +.button.light.secondary { + background: transparent; + color: #fff !important; +} + +.alpha-banner { + border-bottom: 1px solid #fed7aa; + background: var(--warning-bg); + padding: .7rem 0; +} + +.alpha-banner p { margin: 0; } + +.hero { + background: linear-gradient(145deg, #111a36, #27366d 70%, #3b3b78); + color: #fff; + padding: clamp(3rem, 7vw, 6rem) 0; +} + +.hero a { color: #fff; } + +.hero-grid { + display: grid; + grid-template-columns: minmax(0, 1.35fr) minmax(17rem, .65fr); + gap: clamp(2rem, 5vw, 5rem); + align-items: center; +} + +.eyebrow { + font-weight: 700; + letter-spacing: .04em; + text-transform: uppercase; + font-size: .85rem; +} + +.hero h1, +.page-hero h1 { + font-size: clamp(2.4rem, 6vw, 4.8rem); + line-height: 1.05; + letter-spacing: -.035em; + max-width: 16ch; + margin: .45rem 0 1.25rem; +} + +.lead { + font-size: clamp(1.1rem, 2vw, 1.35rem); + max-width: 44rem; +} + +.actions { + display: flex; + flex-wrap: wrap; + gap: .75rem; + margin-top: 1.5rem; +} + +.release-card, +.card, +.callout, +.diagram, +.table-wrap { + border: 1px solid var(--line); + border-radius: .75rem; + background: var(--paper); +} + +.release-card { + color: var(--ink); + padding: 1.35rem; + box-shadow: 0 1rem 2.5rem rgba(3, 7, 18, .22); +} + +.release-card h2 { margin-top: 0; font-size: 1.25rem; } + +.meta-list { + list-style: none; + padding: 0; + margin: 1rem 0; +} + +.meta-list li { margin: .35rem 0; } + +.trust-strip { + background: var(--surface-strong); + border-bottom: 1px solid #c7d2fe; +} + +.trust-grid { + display: grid; + grid-template-columns: repeat(4, minmax(0, 1fr)); + gap: 1px; +} + +.trust-grid a { + display: block; + padding: 1rem; + color: var(--ink); + font-weight: 700; + text-align: center; +} + +main section, +.page-hero { + padding: clamp(2.5rem, 5vw, 4.5rem) 0; +} + +.page-hero { + background: var(--surface); + border-bottom: 1px solid var(--line); +} + +.page-hero h1 { max-width: 22ch; font-size: clamp(2.25rem, 5vw, 4rem); } + +.section-heading { + max-width: 48rem; + margin-bottom: 1.8rem; +} + +.section-heading h2 { + font-size: clamp(1.7rem, 3vw, 2.4rem); + line-height: 1.15; + margin-bottom: .65rem; +} + +.grid-2, +.grid-3 { + display: grid; + gap: 1rem; +} + +.grid-2 { grid-template-columns: repeat(2, minmax(0, 1fr)); } +.grid-3 { grid-template-columns: repeat(3, minmax(0, 1fr)); } + +.card { padding: 1.3rem; } +.card h2, .card h3 { margin-top: 0; } + +.steps { + counter-reset: steps; + list-style: none; + padding: 0; + display: grid; + gap: 1rem; +} + +.steps li { + counter-increment: steps; + position: relative; + padding: 1.1rem 1.1rem 1.1rem 4rem; + border-left: .3rem solid var(--brand); + background: var(--surface); +} + +.steps li::before { + content: counter(steps); + position: absolute; + left: 1.1rem; + top: 1rem; + width: 2rem; + height: 2rem; + border-radius: 50%; + display: grid; + place-items: center; + background: var(--brand); + color: #fff; + font-weight: 800; +} + +.callout { + padding: 1.2rem 1.35rem; + background: var(--surface); +} + +.callout.warning { + border-color: #fdba74; + background: var(--warning-bg); +} + +.callout strong { color: var(--ink); } + +.diagram { padding: 1rem; background: var(--surface); } + +.diagram-flow { + display: grid; + grid-template-columns: repeat(4, minmax(0,1fr)); + gap: .75rem; + align-items: stretch; +} + +.diagram-node { + position: relative; + padding: 1rem; + border: 2px solid #a5b4fc; + border-radius: .6rem; + background: #fff; + text-align: center; + font-weight: 700; +} + +.diagram-node:not(:last-child)::after { + content: "→"; + position: absolute; + right: -.75rem; + top: 50%; + transform: translate(50%, -50%); + color: var(--brand); + font-size: 1.4rem; + font-weight: 800; + background: var(--surface); + padding: 0 .15rem; +} + +.code { + overflow-x: auto; + border-radius: .55rem; + padding: 1rem; + background: #111827; + color: #f8fafc; + font-family: Consolas, "SFMono-Regular", monospace; + font-size: .92rem; +} + +table { + width: 100%; + border-collapse: collapse; +} + +th, td { + padding: .7rem; + border-bottom: 1px solid var(--line); + text-align: left; + vertical-align: top; +} + +th { background: var(--surface); } + +.table-wrap { overflow-x: auto; } + +.definition-list { + display: grid; + grid-template-columns: minmax(10rem, .35fr) 1fr; + gap: .6rem 1rem; +} +.definition-list dt { font-weight: 700; } +.definition-list dd { margin: 0; } + +.site-footer { + background: #0f172a; + color: #e2e8f0; + padding: 3rem 0 2rem; +} + +.site-footer a { color: #e0f2fe; } + +.footer-grid { + display: grid; + grid-template-columns: 1.4fr repeat(3, 1fr); + gap: 2rem; +} + +.footer-brand img { width: 13rem; } +.footer-links { list-style: none; padding: 0; margin: 0; } +.footer-links li { margin: .45rem 0; } + +.small-print { + margin-top: 2rem; + padding-top: 1.5rem; + border-top: 1px solid #334155; + font-size: .9rem; +} + +.sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0,0,0,0); + white-space: nowrap; + border: 0; +} + +@media (max-width: 56rem) { + .desktop-nav { display: none; } + .mobile-menu { display: block; } + .header-inner { align-items: flex-start; padding-block: .85rem; } + .hero-grid, + .grid-3, + .footer-grid { grid-template-columns: 1fr; } + .trust-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); } + .diagram-flow { grid-template-columns: 1fr; } + .diagram-node:not(:last-child)::after { + content: "↓"; + right: 50%; + top: auto; + bottom: -.75rem; + transform: translate(50%, 50%); + } +} + +@media (max-width: 40rem) { + .grid-2, + .trust-grid, + .definition-list { grid-template-columns: 1fr; } + .brand img { width: 11.5rem; } + .mobile-nav .button { justify-self: start; } +} + +@media (prefers-reduced-motion: reduce) { + html { scroll-behavior: auto; } +} diff --git a/site/docs/index.html b/site/docs/index.html new file mode 100644 index 00000000..2ee971a6 --- /dev/null +++ b/site/docs/index.html @@ -0,0 +1,80 @@ + + + + + + SightAdapt™ documentation + + + + + + + + + +
+

Documentation

Set up SightAdapt and understand each control.

This hub covers day-to-day use. Developer and architecture documents remain maintained in the GitHub repository.

+
+ +

Applications

Add an application by activating it and using the persistent-assignment shortcut or configuration UI. Assignments can be enabled, disabled and removed. Executable identity and path information is stored locally for matching.

Automatic mode applies enabled assignments when their application is foreground.

+

Profiles

None leaves the application unchanged. Exact invert is fixed. Soft invert is editable. User-defined profiles can be created, duplicated, renamed, edited and deleted.

Preview behavior is intended to help tune a profile but does not guarantee how every application or display driver will render it.

+

Menus and scopes

Native Win32 #32768 popup menus can inherit the application profile or use a separate profile. Overlay scope can target client area, full window, current screen or all screens.

WPF, WinUI, Electron, Qt and other custom-rendered menus are not separately detected.

+

Keyboard and emergency controls

Ctrl+Alt+I toggles correction for the active supported window without changing saved settings.

Ctrl+Alt+Shift+I adds, disables or re-enables the active application's persistent assignment.

Emergency disable all overlays removes active overlays immediately and disables automatic mode.

+

Troubleshooting

  • For elevated target applications, use a compatible integrity level.
  • If the tray icon is missing, verify only one SightAdapt instance is running.
  • If an overlay does not appear, verify the assignment, automatic mode and target visibility.
  • If menu correction does not apply, check whether the menu is a native Win32 popup.
  • Mixed monitors, scaling, remote desktop and graphics drivers may change behavior.
  • For settings recovery, exit SightAdapt and back up or remove settings.json.
  • Protected content may remain unavailable or unfilterable.
+
+
+

Developer documentation

Authoritative technical documentation remains versioned with the source.

+ +
+
+ + + diff --git a/site/download/index.html b/site/download/index.html new file mode 100644 index 00000000..1c20c3d6 --- /dev/null +++ b/site/download/index.html @@ -0,0 +1,95 @@ + + + + + + Download SightAdapt™ for Windows + + + + + + + + + +
+

Download

Download the current SightAdapt™ release.

GitHub Releases are the authoritative source for official SightAdapt binaries. The website links to those immutable release assets instead of duplicating them.

+
+ +
+
+

System requirements

  • Windows 10 version 2004 or later, or Windows 11.
  • x64 processor.
  • User permission to start a desktop application.
  • Compatible desktop composition and graphics driver.
+

Install and start

  1. Download only from a project-controlled URL or approved package listing.
  2. Verify the checksum when practical.
  3. Extract the archive to a user-controlled directory.
  4. Start SightAdapt.exe.
  5. Use the notification-area icon to open configuration.
+
+
+

Verify the archive

Run the following in PowerShell from the directory containing the downloaded ZIP:

+
Get-FileHash .\SightAdapt-0.5.0.50-alpha-win-x64.zip -Algorithm SHA256
+

The resulting hash must equal:

+
c6dc5ba5c0356c84b32a74d298015d63158c57886b835e411da0b60f306fd711
+
+
+

Windows reputation warning

Unsigned or newly published open-source binaries may trigger Microsoft Defender SmartScreen. Do not disable system protection to run SightAdapt. Verify the source URL, release page and checksum before deciding whether to run a downloaded file.

+

Removal

Exit SightAdapt, then remove the extracted application files. To remove saved profiles and assignments as well, delete %LOCALAPPDATA%\SightAdapt\settings.json. Deleting that file permanently removes the local SightAdapt configuration.

+
+

Alpha use

This is an alpha release. Keep the emergency-disable command available and test the application with non-critical work before relying on it for extended sessions.

+
+ + + diff --git a/site/faq/index.html b/site/faq/index.html new file mode 100644 index 00000000..2c8db92a --- /dev/null +++ b/site/faq/index.html @@ -0,0 +1,104 @@ + + + + + + SightAdapt™ FAQ + + + + + + + + + +
+

FAQ

Common questions about SightAdapt™.

+
+
+

Is SightAdapt free?

Yes. SightAdapt is free and open source under the MIT License.

+

Does SightAdapt change application files?

No. It uses a separate Windows overlay and does not modify the target application's installed files.

+

Does it inject code into other applications?

No. The current alpha does not use DLL injection or write another process's memory.

+

Does it record or upload my screen?

The current alpha does not save or transmit captured screen content. See privacy and security for the exact boundaries.

+

Why does it store executable paths?

Paths are used locally to identify saved application assignments. A path can contain a Windows account or organization name, so redact it from public bug reports when necessary.

+

Does it work with every application?

No guarantee is made. Framework, privilege level, protected content, remote sessions and graphics drivers can affect behavior.

+

Can it correct only menus?

For supported native Win32 popup menus, an application can use None while an explicit menu profile is assigned. Custom-rendered menus are not separately detected.

+

Is SightAdapt a medical device?

The current project is a general-purpose visual-accessibility and display-personalization utility. It does not diagnose or treat medical conditions.

+

Why might Windows show a warning?

New or unsigned binaries may have limited Microsoft Defender SmartScreen reputation. Download only from project-controlled sources and verify the published checksum.

+

How do I stop all overlays?

Use Emergency disable all overlays from the notification-area menu, or exit SightAdapt.

+ + +
+
+
+ + + diff --git a/site/features/index.html b/site/features/index.html new file mode 100644 index 00000000..5ffa3779 --- /dev/null +++ b/site/features/index.html @@ -0,0 +1,111 @@ + + + + + + SightAdapt™ features — profiles, overlays and Windows controls + + + + + + + + + +
+

Features

Features designed around individual applications.

SightAdapt keeps profile selection, overlay scope and automatic activation attached to the application you choose.

+
+

Application assignments

Persistent assignments are matched primarily by executable path. Each assignment stores its enabled state, application profile, optional native-menu profile and overlay scope. With automatic mode enabled, the saved assignment activates when its application becomes the supported foreground window.

+

Visual profile management

Built-in profiles provide fixed or editable starting points. User-defined profiles can be created, duplicated, renamed, edited, assigned and deleted. Deleting a user profile reassigns affected applications to the built-in Soft invert profile.

+

Available controls

Editable profiles expose output black, output white, brightness, contrast, saturation and hue shift. These are display-personalization controls; they are not a color-calibration or clinical measurement system.

+

Native popup menus

Supported native Win32 #32768 popup menus can inherit the application profile or use a separate profile. WPF, WinUI, Chromium/Electron, Qt and other custom-rendered menus are outside this separate-menu boundary.

+

Overlay scopes

Client area excludes the title bar and frame. Full window covers the visible window. Current screen covers the target monitor. All screens covers the Windows virtual desktop.

+

Shortcuts and notification-area controls

Ctrl+Alt+I toggles local correction without changing saved settings. Ctrl+Alt+Shift+I adds, disables or re-enables the persistent assignment for the active application. The tray menu also exposes automatic mode and emergency shutdown.

+

Multi-monitor and DPI behavior

The overlay geometry follows Windows window and monitor coordinates and the application is per-monitor DPI aware. Unusual display drivers, mixed display arrangements and remote sessions may still require testing.

+

Settings and migration

Configuration is stored locally as schema-versioned JSON at %LOCALAPPDATA%\SightAdapt\settings.json. Supported older settings are normalized and migrated; writes are committed atomically so a failed save does not replace the last committed configuration.

+
+
+

What SightAdapt does not do

+
    +
  • It does not modify another application's files.
  • +
  • It does not inject code into another process.
  • +
  • It does not install a driver.
  • +
  • It does not upload screen content.
  • +
  • It does not bypass DRM or other access controls.
  • +
  • It does not guarantee compatibility with every rendering framework.
  • +
  • It does not provide medical diagnosis or treatment.
  • +
+

Read how the overlay works or inspect the complete functionality document.

+
+
+ + + diff --git a/site/how-it-works/index.html b/site/how-it-works/index.html new file mode 100644 index 00000000..8077aac7 --- /dev/null +++ b/site/how-it-works/index.html @@ -0,0 +1,114 @@ + + + + + + How SightAdapt™ works on Windows + + + + + + + + + +
+

How it works

A separate overlay, not a modification of the target application.

SightAdapt observes window metadata, resolves your saved assignment and renders correction through Windows display APIs.

+
+
    +
  1. SightAdapt observes the foreground window and resolves the corresponding application assignment.
  2. +
  3. It creates or retargets an input-transparent overlay.
  4. +
  5. The Windows Magnification API applies the selected color transform to the chosen source area.
  6. +
  7. Filtering prevents the overlay from recursively capturing itself.
  8. +
  9. Native popup menus may receive transient overlays when supported.
  10. +
  11. Emergency shutdown removes active overlays.
  12. +
+
+
+

Architecture at a glance

The diagram is built from text and HTML so its meaning remains available when images or styles are unavailable.

+
+ +
SightAdapt keeps the target application separate from the correction overlay; native popup menus may receive additional transient overlays.
+
+
+
+

Security boundary

SightAdapt does not inject DLLs, write target-process memory or modify target application files. It reads limited window and process metadata required to identify the selected application.

+

Read the full architecture documentation.

+
+
+ + + diff --git a/site/index.html b/site/index.html new file mode 100644 index 00000000..42fc3d00 --- /dev/null +++ b/site/index.html @@ -0,0 +1,193 @@ + + + + + + SightAdapt™ — per-application visual accessibility for Windows | Aiteracja + + + + + + + + + +
+
+
+
+

Free and open source · Windows 10 and 11 · Alpha

+

Adapt the application in front of you.

+

SightAdapt™ applies configurable color correction to individual Windows application windows. Keep the rest of the desktop unchanged, assign profiles per application and stop every overlay immediately when needed.

+ +
+ +
+
+
+ +
+
+
+

Change one application, not your entire desktop.

System-wide display filters can affect every monitor, application and notification. SightAdapt targets the active application through a separate overlay, allowing different applications to use different visual profiles while unrelated windows remain unchanged.

+
+

Profiles per application

Assign a saved color profile to an application and let SightAdapt activate it when that application becomes active.

+

Separate native-menu correction

Use the application profile for native popup menus or assign a different menu profile when menu contrast needs separate treatment.

+

Flexible overlay scope

Choose the client area, full window, current screen or all screens according to the application and display setup.

+

Editable visual profiles

Adjust output black and white levels, brightness, contrast, saturation and hue, then preview the result before assigning it.

+

Manual and automatic controls

Toggle the active window temporarily or save an automatic application assignment.

+

Immediate shutdown

Remove active overlays from the notification-area menu through the emergency-disable command.

+
+
+
+
+
+

Three steps to a per-application profile.

+
    +
  1. Select or activate an application.
  2. +
  3. Choose or create a visual profile.
  4. +
  5. Enable the assignment or use the temporary shortcut.
  6. +
+

See the complete quick start.

+
+
+
+
+

Built-in starting points, editable when appropriate.

+
+

None

Leave the application unchanged.

+

Exact invert

Apply a fixed full inversion.

+

Soft invert

Use an editable lower-intensity starting profile.

+

Custom profiles

Duplicate and adjust a profile for a particular application or display.

+
+

Individual preferences: Visual preferences are individual. SightAdapt does not choose a medically appropriate profile and does not replace professional advice.

+
+
+
+
+
+

Local settings. No screen-content upload.

+

SightAdapt stores its configuration locally. The current alpha does not transmit captured screen content, does not inject code into target applications and does not install a kernel driver. Application assignments may include executable paths and file metadata stored in the local settings file.

+

Read privacy details · Review security boundaries

+
+
+

Built in public.

+

SightAdapt is developed in a public GitHub repository and distributed under the MIT License. Source code, architecture documentation, test results, issues and release history are available for inspection.

+

Browse the source · Report an issue · Read the license

+
+
+
+
+
+

Current alpha limitations

+
    +
  • Only one foreground application session is corrected at a time.
  • +
  • Native menu-specific handling applies only to Win32 #32768 popup menus.
  • +
  • Protected or digital-rights-management (DRM) controlled content may not be capturable.
  • +
  • Elevated applications may require a compatible integrity level.
  • +
  • Remote desktop and some graphics drivers may behave differently.
  • +
  • Broad compatibility and endurance testing are incomplete.
  • +
+

Read all known limitations.

+
+
+
+
+

Try SightAdapt™ and inspect every part of it.

+ +
+
+
+ + + diff --git a/site/legal/index.html b/site/legal/index.html new file mode 100644 index 00000000..2355c23b --- /dev/null +++ b/site/legal/index.html @@ -0,0 +1,97 @@ + + + + + + SightAdapt™ license and legal notices + + + + + + + + + +
+

License and legal notices

SightAdapt™ license and legal notices.

SightAdapt is distributed under the MIT License. Release-specific legal and supply-chain files are published beside each official binary.

+
+

MIT License

+
MIT License
+
+Copyright (c) 2026 KeyffMS
+
+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:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+

Repository license source

+
+
+ +

Protected content and access controls

SightAdapt is not intended to circumvent, disable, avoid or interfere with digital-rights management (DRM), protected-content restrictions, authentication, licensing checks, encryption or other access controls. Protected content may remain unavailable, blank, excluded or unfilterable.

+
+
+

Names and trademarks

+

SightAdapt™ is an unregistered product mark used by KeyffMS / aiteracja.pl. The ™ notation identifies product branding and does not represent a registered trademark.

+

Third-party product names and trademarks are the property of their respective owners and are used only to identify user-selected applications. SightAdapt is not affiliated with or endorsed by those owners.

+

Microsoft, Windows and .NET are trademarks of the Microsoft group of companies. Their names identify the operating-system platform, runtime components or technical compatibility only.

+

Read the complete third-party names and protected-content notice.

+
+
+ + + diff --git a/site/privacy/index.html b/site/privacy/index.html new file mode 100644 index 00000000..63b0cb21 --- /dev/null +++ b/site/privacy/index.html @@ -0,0 +1,73 @@ + + + + + + SightAdapt™ privacy + + + + + + + + + +
+

Privacy

Local settings and explicit support sharing.

The current SightAdapt alpha stores configuration locally and does not transmit captured screen content or behavioral telemetry.

+
+

Data processed locally

To identify the active application and render the configured overlay, SightAdapt may read window handles, process and GUI thread identifiers, display names, executable names and paths, file-description metadata, window geometry and foreground state.

Saved settings can include assignments, enabled states, selected profiles, menu-profile references, overlay scopes and user-defined tuning values.

+

Local storage

Settings are stored at %LOCALAPPDATA%\SightAdapt\settings.json. The file is human-readable JSON and can contain executable paths. Those paths may contain a Windows account, organization or project name.

To reset local configuration, exit SightAdapt and remove the file. Starting SightAdapt again recreates defaults.

+

Screen content and network behavior

The current application does not intentionally save screenshots, record the screen, build a screen-content history, perform image recognition or transmit captured screen content.

It contains no telemetry, product analytics, advertising, remote crash reporting, automatic diagnostic upload, cloud synchronization or automatic update check.

+

Support information

Information reaches the project owner only when a person voluntarily sends it through GitHub or another support route. Before sharing logs, settings, screenshots or paths, remove usernames, organization names, private directory names, tokens and unrelated content.

+
+
+

Controller and contact for submitted support data

+

KeyffMS / aiteracja.pl. The current public contact route is the GitHub repository owner. For non-public material, request a private communication route before sending it.

+

Privately submitted support material is limited to people needed to investigate the report and is normally deleted no later than 90 days after the related support matter closes, except when a longer period is needed for an active security investigation, legal obligation, dispute or agreed follow-up.

+

Policy source: PRIVACY.md. Last updated in the repository: 29 July 2026.

+
+
+ + + diff --git a/site/releases/index.html b/site/releases/index.html new file mode 100644 index 00000000..1b15bf18 --- /dev/null +++ b/site/releases/index.html @@ -0,0 +1,70 @@ + + + + + + SightAdapt™ release history + + + + + + + + + +
+

Releases

Public, dated SightAdapt releases.

GitHub Releases are the authoritative binary publication record. This page is a human-readable index and does not host divergent binaries.

+
+
+ + +
VersionDateStatusPlatformOfficial files
0.5.0.50-alpha24 September 2026Alpha / prereleaseWindows x64Windows ZIP · checksums · SBOM
+

Tag v0.5.0.50-alpha is immutable and points to the published release source. GitHub-generated source archives are source snapshots; the file named SightAdapt-0.5.0.50-alpha-win-x64.zip is the official Windows binary package.

+

Read the repository release-history record.

+
+

Withdrawal policy

A compromised or unsafe release is not silently replaced. The immutable release record remains identifiable and receives an explicit withdrawal notice; a corrected version is published under a new version and tag.

+
+ + + diff --git a/site/security/index.html b/site/security/index.html new file mode 100644 index 00000000..60af28a6 --- /dev/null +++ b/site/security/index.html @@ -0,0 +1,71 @@ + + + + + + SightAdapt™ security and reporting + + + + + + + + + +
+

Security

SightAdapt™ security and reporting.

The current alpha has explicit process and display boundaries and has not completed a formal security review.

+
+

Current application boundaries

  • No DLL or code injection into target applications.
  • No kernel driver installation.
  • No saved or transmitted captured screen content.
  • Runs with the current user's privileges.
  • Uses a separate input-transparent overlay.
+

Elevated applications

Windows integrity boundaries can affect access to elevated target applications. A target may require SightAdapt to run at a compatible integrity level. Do not weaken operating-system security settings to force compatibility.

+

Emergency shutdown

The notification-area menu provides Emergency disable all overlays. It removes active overlays immediately and disables automatic mode before settings persistence is attempted.

+

Alpha review status

The current alpha has not completed a formal security review and must not be treated as production-ready assistive software. Compatibility and endurance testing remain incomplete.

+
+
+

Report a vulnerability privately

Do not disclose security-sensitive issues in a public GitHub issue. Until a dedicated private reporting channel is configured, contact the repository owner through GitHub and request a private communication channel.

Do not post passwords, tokens, private keys, confidential screenshots, unredacted executable paths or sensitive customer information.

+

Read SECURITY.md · Review current limitations

+
+
+ + + diff --git a/site/support/index.html b/site/support/index.html new file mode 100644 index 00000000..1aa5a9c8 --- /dev/null +++ b/site/support/index.html @@ -0,0 +1,73 @@ + + + + + + SightAdapt™ support and contact + + + + + + + + + +
+

Support and contact

Get help or report a reproducible problem.

Use public issues for non-sensitive defects and feature requests. Ask for a private route before sending sensitive or security-related material.

+
+ + + + + +
+
+

Bug-report checklist

+
  • SightAdapt version.
  • Windows version.
  • Monitor arrangement and display scaling.
  • Target application and framework when known.
  • Target privilege level.
  • Exact reproduction steps.
  • Whether emergency disable remained available.
  • Sanitized logs or paths when relevant.
+

Privacy: Do not attach screenshots containing private information or publish unredacted paths, usernames, organization names or confidential application content.

+
+
+ + + diff --git a/tools/test-site.ps1 b/tools/test-site.ps1 new file mode 100644 index 00000000..e4cea3bb --- /dev/null +++ b/tools/test-site.ps1 @@ -0,0 +1,179 @@ +param( + [string]$SiteRoot = (Join-Path $PSScriptRoot '..\site') +) + +$ErrorActionPreference = 'Stop' +Set-StrictMode -Version Latest + +$SiteRoot = (Resolve-Path $SiteRoot).Path + +$requiredPages = @( + '', + 'features', + 'download', + 'docs', + 'how-it-works', + 'faq', + 'releases', + 'privacy', + 'legal', + 'security', + 'support' +) + +$canonicalRoot = 'https://aiteracja.pl/sightadapt/' +$errors = New-Object System.Collections.Generic.List[string] + +function Add-Error([string]$Message) { + $errors.Add($Message) +} + +function Get-ExpectedCanonical([string]$PageName) { + if ([string]::IsNullOrWhiteSpace($PageName)) { + return $canonicalRoot + } + + return "$canonicalRoot$PageName/" +} + +function Resolve-LocalReference( + [System.IO.FileInfo]$HtmlFile, + [string]$Reference +) { + $clean = ($Reference -split '[?#]', 2)[0] + if ([string]::IsNullOrWhiteSpace($clean)) { + return $null + } + + if ($clean -match '^(?:https?:|mailto:|tel:|data:)') { + return $null + } + + if ($clean.StartsWith('/')) { + Add-Error "$($HtmlFile.FullName): root-relative URL '$Reference' breaks the dual /SightAdapt/ and /sightadapt/ hosting model." + return $null + } + + $candidate = [System.IO.Path]::GetFullPath((Join-Path $HtmlFile.DirectoryName $clean)) + if ($clean.EndsWith('/')) { + $candidate = Join-Path $candidate 'index.html' + } + + return $candidate +} + +foreach ($pageName in $requiredPages) { + $path = if ([string]::IsNullOrWhiteSpace($pageName)) { + Join-Path $SiteRoot 'index.html' + } + else { + Join-Path $SiteRoot "$pageName\index.html" + } + + if (-not (Test-Path $path -PathType Leaf)) { + Add-Error "Missing required page: $path" + continue + } + + $file = Get-Item $path + $html = Get-Content $path -Raw + + $titleMatches = [regex]::Matches($html, '[^<]+', 'IgnoreCase') + if ($titleMatches.Count -ne 1) { + Add-Error ($path + ": expected exactly one non-empty ; found $($titleMatches.Count).") + } + + $h1Matches = [regex]::Matches($html, '<h1(?:\s[^>]*)?>.*?</h1>', 'IgnoreCase,Singleline') + if ($h1Matches.Count -ne 1) { + Add-Error ($path + ": expected exactly one <h1>; found $($h1Matches.Count).") + } + + if ($html -notmatch '<html\s+lang="en"') { + Add-Error ($path + ': missing html lang=en.') + } + + if ($html -notmatch '<meta\s+name="viewport"') { + Add-Error ($path + ': missing viewport metadata.') + } + + if ($html -notmatch '<meta\s+name="description"\s+content="[^"]+"') { + Add-Error ($path + ': missing non-empty meta description.') + } + + $expectedCanonical = [regex]::Escape((Get-ExpectedCanonical $pageName)) + $canonicalPattern = '<link\s+rel="canonical"\s+href="' + $expectedCanonical + '"' + if ($html -notmatch $canonicalPattern) { + Add-Error ($path + ': canonical URL is missing or inconsistent.') + } + + if ($html -notmatch 'class="skip-link"\s+href="#main"') { + Add-Error ($path + ': missing visible-on-focus skip navigation.') + } + + if ($html -notmatch '<main\s+id="main"') { + Add-Error ($path + ': missing main landmark with id=main.') + } + + if ($html -notmatch [regex]::Escape('SightAdapt™ is an unregistered product mark used by KeyffMS / aiteracja.pl.')) { + Add-Error ($path + ': missing required SightAdapt trademark footer notice.') + } + + if ($html -notmatch [regex]::Escape('SightAdapt is free and open-source software distributed under the MIT License.')) { + Add-Error ($path + ': missing required open-source/license footer statement.') + } + + if ($html -match '<(?:script|iframe)\b[^>]*(?:src)=["'']https?://') { + Add-Error ($path + ': remote active content is not permitted.') + } + + foreach ($imageMatch in [regex]::Matches($html, '<img\b[^>]*>', 'IgnoreCase')) { + if ($imageMatch.Value -notmatch '\balt="[^"]*"') { + Add-Error ($path + ": image is missing an alt attribute: $($imageMatch.Value)") + } + } + + $references = New-Object System.Collections.Generic.List[string] + foreach ($match in [regex]::Matches($html, '\b(?:href|src)="([^"]+)"', 'IgnoreCase')) { + $references.Add($match.Groups[1].Value) + } + + foreach ($reference in $references) { + $resolved = Resolve-LocalReference -HtmlFile $file -Reference $reference + if ($null -ne $resolved -and -not (Test-Path $resolved)) { + Add-Error ($path + ": local reference '$reference' resolves to missing '$resolved'.") + } + } +} + +$homeHtml = Get-Content (Join-Path $SiteRoot 'index.html') -Raw +foreach ($claim in @( + 'No code injection', + 'No driver installation', + 'No screen-content telemetry', + "Runs with the current user's privileges" +)) { + if ($homeHtml -notmatch [regex]::Escape($claim)) { + Add-Error "Home page is missing trust statement '$claim'." + } +} + +$downloadHtml = Get-Content (Join-Path $SiteRoot 'download\index.html') -Raw +foreach ($requiredReleaseValue in @( + '0.5.0.50-alpha', + 'c6dc5ba5c0356c84b32a74d298015d63158c57886b835e411da0b60f306fd711', + 'SightAdapt-0.5.0.50-alpha-win-x64.zip' +)) { + if ($downloadHtml -notmatch [regex]::Escape($requiredReleaseValue)) { + Add-Error "Download page is missing release authority value '$requiredReleaseValue'." + } +} + +if ($errors.Count -gt 0) { + foreach ($siteError in $errors) { + Write-Host "::error::$siteError" + } + + throw "SightAdapt site validation failed with $($errors.Count) error(s)." +} + +Write-Host "SightAdapt site validation passed for $($requiredPages.Count) pages."