Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
50 commits
Select commit Hold shift + click to select a range
a2b247c
Halo v3 — a from-scratch glass-notch rewrite (Dynamic Island for Wind…
phoseinq Jul 23, 2026
a3c2f2f
v3.0.2 - de-duplicate the strings that split translations
phoseinq Jul 25, 2026
c1c3070
fix: the Bluetooth widget threw on every frame while the pill was tucked
phoseinq Jul 25, 2026
03abffe
ci: add public build and security guardrails
phoseinq Jul 26, 2026
1c3353a
Update README.md
phoseinq Jul 26, 2026
4833fae
v3.1.0 - live Edge download progress, a Cancel that really cancels, s…
phoseinq Jul 26, 2026
e457455
polish: real scrubbing on the media bars, a session ring that shows t…
phoseinq Jul 26, 2026
31fa557
v3.1.1 - press-and-drag scrubbing, a session ring that shows the limi…
phoseinq Jul 26, 2026
44199eb
v3.1.1 - press-and-drag scrubbing, a session ring that shows the limi…
phoseinq Jul 27, 2026
45be791
fix: glass latency, the pushpin's second setting, and three gestures …
phoseinq Jul 27, 2026
0ecc99a
v3.1.2 - installer: autostart and Codex integration stay ticked on up…
phoseinq Jul 27, 2026
f64c2f3
v3.1.2 - installer icon and wizard mark
phoseinq Jul 27, 2026
4f0b98c
docs: rewritten README in both languages, plus PRIVACY
phoseinq Jul 27, 2026
e4d2839
v3.1.3 - notification sound no longer cut off; README + PRIVACY
phoseinq Jul 27, 2026
9c489a0
docs: README clips re-encoded from the original captures
phoseinq Jul 27, 2026
9ece3c4
docs: try-it-in-your-browser link
phoseinq Jul 27, 2026
603dcac
docs: vector README hero
phoseinq Jul 27, 2026
6170dc2
docs: revert the vector hero
phoseinq Jul 27, 2026
8a87c1a
docs: drop the hero clip from the top of the README
phoseinq Jul 27, 2026
6fdb6e4
docs: a proper banner at the top of the README
phoseinq Jul 27, 2026
30bdd31
docs: redraw the banner in gold and move it above the demo link
phoseinq Jul 27, 2026
e2cc849
docs: strip the banner back to the mark, the name and one line
phoseinq Jul 27, 2026
c4ada96
docs: red banner, and it says what the thing actually does
phoseinq Jul 27, 2026
0777b35
docs: turquoise banner, one download, and far less prose
phoseinq Jul 27, 2026
9ceb581
docs: rename the banners so the image cache cannot serve the old ones
phoseinq Jul 27, 2026
b32bae6
Update README.md
phoseinq Jul 29, 2026
4af6441
Update README.fa.md
phoseinq Jul 29, 2026
ef1926a
Update README.md
phoseinq Jul 29, 2026
e986ec9
the pill reads the situation: situational moods, a ring that rides wi…
phoseinq Jul 29, 2026
13f2f20
Update README.md
phoseinq Jul 29, 2026
74e3c76
Update README.fa.md
phoseinq Jul 29, 2026
e112367
a ring with a palette, one mapping behind the words and the colour, a…
phoseinq Jul 29, 2026
47d1064
the pill says what it is working on, the ring stops being orange, and…
phoseinq Jul 30, 2026
2e0daaf
readable words on the pill, a second colour on the ring, and the swit…
phoseinq Jul 30, 2026
9c1cc96
the pill said idle, which is the one word it must never say
phoseinq Jul 30, 2026
d9facc7
ten states with their own colour, and the second ring taken back out
phoseinq Jul 30, 2026
3fe947d
a pinned pill that stayed buried in fullscreen, and a fallback icon t…
phoseinq Jul 30, 2026
3be9128
the pinned pill was not buried under fullscreen video, it was never c…
phoseinq Jul 30, 2026
2d661ed
stop trying to force the pill over fullscreen video
phoseinq Jul 30, 2026
00c61c1
a speed menu, a second line under the name, a seek bar that actually …
phoseinq Jul 30, 2026
84c5c80
the seek bar was dead because the widget never learned the duration, …
phoseinq Jul 30, 2026
723025f
seeking several times quickly, where the player drops all but the first
phoseinq Jul 30, 2026
a75ef6b
the file size actually shows, and the bar says whether it is playing
phoseinq Jul 30, 2026
d3c0491
v3.1.4 - a media bar you can trust, and a head that stays attached to it
phoseinq Jul 31, 2026
62b27cc
v3.1.5 - a pulse that swells instead of stepping, and downloads that …
phoseinq Jul 31, 2026
7ece3c8
fix: a mood line stamped in the future was held forever
phoseinq Jul 31, 2026
cd93757
v3.1.6 - the hourly banner speaks the calendar of the place it is in
phoseinq Jul 31, 2026
9b80de2
fix: the exe stamped 3.1.3.0 through three releases, so clients reins…
phoseinq Jul 31, 2026
b83733b
v3.1.7 - no updater, and a privacy policy that matches the code
phoseinq Jul 31, 2026
2eb000e
v3.2.0 - the settings panel is real, a tray icon, and a local API
phoseinq Aug 2, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .github/CODEOWNERS
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
* @phoseinq
/.github/ @phoseinq
/src/ @phoseinq
57 changes: 57 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
name: CI

on:
push:
branches: [main, V3]
pull_request:
branches: [main, V3]
workflow_dispatch:

permissions:
contents: read

concurrency:
group: ci-${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true

jobs:
build-test-policy:
runs-on: windows-latest
timeout-minutes: 20

steps:
- name: Check out repository
uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4

- name: Set up .NET
uses: actions/setup-dotnet@67a3573c9a986a3f9c594539f4ab511d57bb3ce9 # v4
with:
dotnet-version: 9.0.x
cache: true
cache-dependency-path: '**/*.csproj'

- name: Restore
run: dotnet restore Halo.sln

- name: Build
run: dotnet build Halo.sln -c Release --no-restore --nologo -warnaserror

- name: Test
run: dotnet test tests\Halo.Tests\Halo.Tests.csproj -c Release --no-build --nologo

- name: Self-test the policy script
shell: pwsh
run: pwsh -NoProfile -File scripts\verify-public-source.ps1 -SelfTest

# A push to V3 is a mirror publish, so an unstripped file there is our own bug and must fail. A pull
# request is somebody else's work: the comment rule drops to a warning annotation so a patch is never
# rejected for explaining itself. Tabs and the package allowlist fail in both cases.
- name: Check public source policy (push)
if: github.event_name != 'pull_request'
shell: pwsh
run: pwsh -NoProfile -File scripts\verify-public-source.ps1

- name: Check public source policy (pull request)
if: github.event_name == 'pull_request'
shell: pwsh
run: pwsh -NoProfile -File scripts\verify-public-source.ps1 -CommentsAdvisory
65 changes: 65 additions & 0 deletions .github/workflows/codeql.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
name: Security

on:
push:
branches: [main, V3]
pull_request:
branches: [main, V3]
schedule:
- cron: '17 4 * * 1'
workflow_dispatch:

permissions:
contents: read
security-events: write

concurrency:
group: security-${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true

jobs:
codeql:
runs-on: windows-latest
timeout-minutes: 30

steps:
- name: Check out repository
uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4

- name: Initialize CodeQL
uses: github/codeql-action/init@4187e74d05793876e9989daffde9c3e66b4acd07 # v3
with:
languages: csharp
build-mode: manual

- name: Set up .NET
uses: actions/setup-dotnet@67a3573c9a986a3f9c594539f4ab511d57bb3ce9 # v4
with:
dotnet-version: 9.0.x
cache: true
cache-dependency-path: '**/*.csproj'

- name: Restore
run: dotnet restore Halo.sln

- name: Build
run: dotnet build Halo.sln -c Release --no-restore --nologo -warnaserror

- name: Analyze
uses: github/codeql-action/analyze@4187e74d05793876e9989daffde9c3e66b4acd07 # v3

dependency-review:
if: github.event_name == 'pull_request'
runs-on: ubuntu-latest
timeout-minutes: 10
permissions:
contents: read

steps:
- name: Check out repository
uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4

- name: Review dependency changes
uses: actions/dependency-review-action@2031cfc080254a8a887f58cffee85186f0e49e48 # v4
with:
fail-on-severity: moderate
14 changes: 11 additions & 3 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,4 +1,12 @@
bin/
obj/
.vs/
/DynamicWin/bin/
/DynamicWin/obj/
/DynamicWinSetup
*.user
*.log
_reference/
publish/
.worktrees/
.superpowers/
dist/
.claude/settings.local.json
.serena/logs/
84 changes: 84 additions & 0 deletions Halo.sln
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.0.31903.59
MinimumVisualStudioVersion = 10.0.40219.1
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{827E0CD3-B72D-47B6-A68D-7590B98EB39B}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Halo.App", "src\Halo.App\Halo.App.csproj", "{B2DA8E05-575B-410A-ACA1-AA881D1574CF}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Halo.Tests", "tests\Halo.Tests\Halo.Tests.csproj", "{5F246822-CC7C-4909-A80D-FDD271F7308D}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Halo.Hooks", "src\Halo.Hooks\Halo.Hooks.csproj", "{9FA9150C-C7E3-4E31-958D-C86419F89182}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Halo.Settings", "src\Halo.Settings\Halo.Settings.csproj", "{88089641-797D-4D9C-A4A1-9D11A6B52A4A}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Debug|x64 = Debug|x64
Debug|x86 = Debug|x86
Release|Any CPU = Release|Any CPU
Release|x64 = Release|x64
Release|x86 = Release|x86
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{B2DA8E05-575B-410A-ACA1-AA881D1574CF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{B2DA8E05-575B-410A-ACA1-AA881D1574CF}.Debug|Any CPU.Build.0 = Debug|Any CPU
{B2DA8E05-575B-410A-ACA1-AA881D1574CF}.Debug|x64.ActiveCfg = Debug|Any CPU
{B2DA8E05-575B-410A-ACA1-AA881D1574CF}.Debug|x64.Build.0 = Debug|Any CPU
{B2DA8E05-575B-410A-ACA1-AA881D1574CF}.Debug|x86.ActiveCfg = Debug|Any CPU
{B2DA8E05-575B-410A-ACA1-AA881D1574CF}.Debug|x86.Build.0 = Debug|Any CPU
{B2DA8E05-575B-410A-ACA1-AA881D1574CF}.Release|Any CPU.ActiveCfg = Release|Any CPU
{B2DA8E05-575B-410A-ACA1-AA881D1574CF}.Release|Any CPU.Build.0 = Release|Any CPU
{B2DA8E05-575B-410A-ACA1-AA881D1574CF}.Release|x64.ActiveCfg = Release|Any CPU
{B2DA8E05-575B-410A-ACA1-AA881D1574CF}.Release|x64.Build.0 = Release|Any CPU
{B2DA8E05-575B-410A-ACA1-AA881D1574CF}.Release|x86.ActiveCfg = Release|Any CPU
{B2DA8E05-575B-410A-ACA1-AA881D1574CF}.Release|x86.Build.0 = Release|Any CPU
{5F246822-CC7C-4909-A80D-FDD271F7308D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{5F246822-CC7C-4909-A80D-FDD271F7308D}.Debug|Any CPU.Build.0 = Debug|Any CPU
{5F246822-CC7C-4909-A80D-FDD271F7308D}.Debug|x64.ActiveCfg = Debug|Any CPU
{5F246822-CC7C-4909-A80D-FDD271F7308D}.Debug|x64.Build.0 = Debug|Any CPU
{5F246822-CC7C-4909-A80D-FDD271F7308D}.Debug|x86.ActiveCfg = Debug|Any CPU
{5F246822-CC7C-4909-A80D-FDD271F7308D}.Debug|x86.Build.0 = Debug|Any CPU
{5F246822-CC7C-4909-A80D-FDD271F7308D}.Release|Any CPU.ActiveCfg = Release|Any CPU
{5F246822-CC7C-4909-A80D-FDD271F7308D}.Release|Any CPU.Build.0 = Release|Any CPU
{5F246822-CC7C-4909-A80D-FDD271F7308D}.Release|x64.ActiveCfg = Release|Any CPU
{5F246822-CC7C-4909-A80D-FDD271F7308D}.Release|x64.Build.0 = Release|Any CPU
{5F246822-CC7C-4909-A80D-FDD271F7308D}.Release|x86.ActiveCfg = Release|Any CPU
{5F246822-CC7C-4909-A80D-FDD271F7308D}.Release|x86.Build.0 = Release|Any CPU
{9FA9150C-C7E3-4E31-958D-C86419F89182}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{9FA9150C-C7E3-4E31-958D-C86419F89182}.Debug|Any CPU.Build.0 = Debug|Any CPU
{9FA9150C-C7E3-4E31-958D-C86419F89182}.Debug|x64.ActiveCfg = Debug|Any CPU
{9FA9150C-C7E3-4E31-958D-C86419F89182}.Debug|x64.Build.0 = Debug|Any CPU
{9FA9150C-C7E3-4E31-958D-C86419F89182}.Debug|x86.ActiveCfg = Debug|Any CPU
{9FA9150C-C7E3-4E31-958D-C86419F89182}.Debug|x86.Build.0 = Debug|Any CPU
{9FA9150C-C7E3-4E31-958D-C86419F89182}.Release|Any CPU.ActiveCfg = Release|Any CPU
{9FA9150C-C7E3-4E31-958D-C86419F89182}.Release|Any CPU.Build.0 = Release|Any CPU
{9FA9150C-C7E3-4E31-958D-C86419F89182}.Release|x64.ActiveCfg = Release|Any CPU
{9FA9150C-C7E3-4E31-958D-C86419F89182}.Release|x64.Build.0 = Release|Any CPU
{9FA9150C-C7E3-4E31-958D-C86419F89182}.Release|x86.ActiveCfg = Release|Any CPU
{9FA9150C-C7E3-4E31-958D-C86419F89182}.Release|x86.Build.0 = Release|Any CPU
{88089641-797D-4D9C-A4A1-9D11A6B52A4A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{88089641-797D-4D9C-A4A1-9D11A6B52A4A}.Debug|Any CPU.Build.0 = Debug|Any CPU
{88089641-797D-4D9C-A4A1-9D11A6B52A4A}.Debug|x64.ActiveCfg = Debug|Any CPU
{88089641-797D-4D9C-A4A1-9D11A6B52A4A}.Debug|x64.Build.0 = Debug|Any CPU
{88089641-797D-4D9C-A4A1-9D11A6B52A4A}.Debug|x86.ActiveCfg = Debug|Any CPU
{88089641-797D-4D9C-A4A1-9D11A6B52A4A}.Debug|x86.Build.0 = Debug|Any CPU
{88089641-797D-4D9C-A4A1-9D11A6B52A4A}.Release|Any CPU.ActiveCfg = Release|Any CPU
{88089641-797D-4D9C-A4A1-9D11A6B52A4A}.Release|Any CPU.Build.0 = Release|Any CPU
{88089641-797D-4D9C-A4A1-9D11A6B52A4A}.Release|x64.ActiveCfg = Release|Any CPU
{88089641-797D-4D9C-A4A1-9D11A6B52A4A}.Release|x64.Build.0 = Release|Any CPU
{88089641-797D-4D9C-A4A1-9D11A6B52A4A}.Release|x86.ActiveCfg = Release|Any CPU
{88089641-797D-4D9C-A4A1-9D11A6B52A4A}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
{B2DA8E05-575B-410A-ACA1-AA881D1574CF} = {827E0CD3-B72D-47B6-A68D-7590B98EB39B}
{5F246822-CC7C-4909-A80D-FDD271F7308D} = {827E0CD3-B72D-47B6-A68D-7590B98EB39B}
{9FA9150C-C7E3-4E31-958D-C86419F89182} = {827E0CD3-B72D-47B6-A68D-7590B98EB39B}
{88089641-797D-4D9C-A4A1-9D11A6B52A4A} = {827E0CD3-B72D-47B6-A68D-7590B98EB39B}
EndGlobalSection
EndGlobal
Loading