Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
76 commits
Select commit Hold shift + click to select a range
215ffa2
Updated the version.
jake1164 May 8, 2026
7614553
Removed HDHR port so it wont crash on local debugging.
jake1164 May 8, 2026
267887e
Added an always on drawer so its easier to move between pages.
jake1164 May 9, 2026
41513fa
Made changes to event window.
jake1164 May 9, 2026
25b0ff6
Made so when events are cleared the window is closed.
jake1164 May 9, 2026
478b238
Removed admin from menu drawer. fixed so lineup is pinned to bottom.
jake1164 May 9, 2026
329618f
Moved Settings icon to navbar.
jake1164 May 9, 2026
9d16784
moved settings to navbar for real this time.
jake1164 May 9, 2026
6efba89
Updated logs to allow search and filtering by type.
jake1164 May 9, 2026
71e05aa
Fixed log so actual error shows up instead of the string array type.
jake1164 May 9, 2026
900e81e
Updated settings to make it much easier to understand.
jake1164 May 9, 2026
05a172a
Combined events so they are less sprawling.
jake1164 May 10, 2026
67993f7
Made changes to create a provider to make it more user friendly.
jake1164 May 10, 2026
2047ec2
Cleaned up the providers page.
jake1164 May 10, 2026
42a1c97
Fixed the logs page having a scroll bar.
jake1164 May 10, 2026
fcbc8ce
Worked on performance between pages.
jake1164 May 10, 2026
d8fea0a
Fixed (removed) refresh being an "unhealthy" service state.
jake1164 May 12, 2026
45113bd
Actually fixed the performance issues in the UI this time.
jake1164 May 12, 2026
482f32e
This borked the tests.
jake1164 May 12, 2026
e0cfc2d
Fixed database bug with saving a snapshot.
jake1164 May 14, 2026
f82085d
Merge main into alpha.7
jake1164 May 15, 2026
b74e8a6
Added always visible notifications that are more in line with what us…
jake1164 May 15, 2026
1643cff
Fixed the max to show the current providers stream limit or remove th…
jake1164 May 15, 2026
81c887f
Made a top level warning box.
jake1164 May 15, 2026
ff2552f
Fixed footer to match warning on warning box.
jake1164 May 15, 2026
2472162
Made changes to dashboard
jake1164 May 15, 2026
f110ebe
Fix clean remux timestamp handling for live streams
jake1164 May 16, 2026
24a3ebd
Implemented first part of plan to help make streams more resilient. c…
jake1164 May 16, 2026
c0a703f
Added logging.
jake1164 May 16, 2026
11aaed8
Fixed tests failing.
jake1164 May 17, 2026
f6d9b71
Added new about page with product info. fixes Add About Dialog / Proj…
jake1164 May 17, 2026
298f3ad
Cleaned the side drawer.
jake1164 May 17, 2026
77ae160
Updated main page to show just active profiles and resolved query iss…
jake1164 May 19, 2026
54ffc08
Fixed so it shows all active chips.
jake1164 May 19, 2026
83d53c6
Fixed profiles page to not mark all providers as degraded when an ina…
jake1164 May 19, 2026
bea941b
Added a tool manifest to repo so same ef-tool gets used everywhere.
jake1164 May 19, 2026
a3805a8
Made changes for slice 2 of making bad streams more stable. Part of A…
jake1164 May 19, 2026
c1d253b
Added HDHR page, reorganized main page to make it more useful showing…
jake1164 May 19, 2026
b3a11bf
Worked on a recovery policy for tracking and fixing bad streams.
jake1164 May 20, 2026
f430245
Made more changes to help with unstable streams and keeping downstrea…
jake1164 May 20, 2026
e244ab3
Fixed the hash not showing up in about window
jake1164 May 21, 2026
beb429d
Updated the streaming page to be more useful including displaying tra…
jake1164 May 21, 2026
4e51fdc
Implemented the hard controlled-retune boundary.
jake1164 May 21, 2026
ef4eb05
Cleaned up stream monitor page.
jake1164 May 21, 2026
33a1f77
Implemented better cooldown policy change and updated both plans.
jake1164 May 21, 2026
c6d664f
minor tweeks to streams page.
jake1164 May 21, 2026
a211eb7
Added explicit provider relay policy: auto, on, off.
jake1164 May 21, 2026
dae4c38
Final cleanup of streams.
jake1164 May 21, 2026
32d661a
attempt to fix tooltip flickering.
jake1164 May 21, 2026
af4245b
Fixed issue with elapsed snapshot time being calculated on the local …
jake1164 May 22, 2026
86ec5ed
Updated to highlight the selected page. Updated gui to 1) fix slow da…
jake1164 May 22, 2026
b5aabdb
Attempt at normalizing chips and using consistent colors / shapes for…
jake1164 May 22, 2026
e4e832c
Clean-watch health evidence is now persisted from cleanly closed sess…
jake1164 May 22, 2026
771fc60
Restore Phase 1B outage cooldown observability and supported streamin…
jake1164 May 22, 2026
642bf56
Updated streams page to have more detailed info.
jake1164 May 23, 2026
5a4920f
fixed issue with nav menu
jake1164 May 23, 2026
6d06b82
Fixed authentication and xtream settings.
jake1164 May 25, 2026
3edaa8a
Changed new providers to not mark all channels needing review
jake1164 May 25, 2026
8d6c5e4
Fixed all channels / groups needing review when a provider is added.
jake1164 May 28, 2026
c4a2f67
Merge remote branch: resolve SnapshotBuilder conflict, update GroupsN…
jake1164 May 28, 2026
2530f4d
Fixed message showing once channels are mapped.
jake1164 May 28, 2026
b12f368
Added correct message back when no channels are mapped.
jake1164 May 28, 2026
47d0825
Fixed chips and group counts.
jake1164 May 29, 2026
9912178
Cleaned up profiles. and made that channels are not tracked by default.
jake1164 May 30, 2026
26ac559
Cleaned up channel mapping to make it move obvious when it might be u…
jake1164 May 30, 2026
5b8405e
more cleanup.
jake1164 May 30, 2026
4262e0e
Fixed broken test by last UI update.
jake1164 May 31, 2026
cc57f65
Made navigation and setup changes to help guide in setup.
jake1164 May 31, 2026
72ee8f7
Added finalize with stream limiting on screen so it does not go unnot…
jake1164 May 31, 2026
c284b3a
Added a better way to track channels while mapping them.
jake1164 May 31, 2026
8b23b59
Fixed IPTVnator issues again.
jake1164 May 31, 2026
4c8bd32
Updated streaming to fix for a controlled downstream retune is suppr…
jake1164 Jun 1, 2026
952780b
Code review, fixed copilot findings.
jake1164 Jun 5, 2026
46f2858
Updated data merges to a single alpha7 gate to keep things clean for …
jake1164 Jun 5, 2026
1b85277
Cleaned up documentation.
jake1164 Jun 5, 2026
ae3103a
Addressed health event recorder value not being persisted.
jake1164 Jun 7, 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
4 changes: 2 additions & 2 deletions .vscode/tasks.json
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,7 @@
"permissions": "rw"
}
],
"customOptions": "--user root --label m3undle.run_mode=existing -p 5004:5004 -p 8080:8080 -p 1900:1900/udp -p 65001:65001/udp"
"customOptions": "--user root --label m3undle.run_mode=existing -p 5004:5004 -p 8080:8080 -p 1900:1900/udp"
},
"netCore": {
"appProject": "${workspaceFolder}/src/M3Undle.Web/M3Undle.Web.csproj",
Expand Down Expand Up @@ -157,7 +157,7 @@
"permissions": "rw"
}
],
"customOptions": "--user root --label m3undle.run_mode=force -p 5004:5004 -p 8080:8080 -p 1900:1900/udp -p 65001:65001/udp"
"customOptions": "--user root --label m3undle.run_mode=force -p 5004:5004 -p 8080:8080 -p 1900:1900/udp"
},
"netCore": {
"appProject": "${workspaceFolder}/src/M3Undle.Web/M3Undle.Web.csproj",
Expand Down
153 changes: 153 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,153 @@
# Changelog

All notable changes to M3Undle are documented here. Newest release at the top.

---

## [v1.0.0-alpha.7] — 2026-06-05

Alpha 7 is the final alpha milestone. It delivers adaptive live stream recovery for noisy provider channels, a first-class relay policy per provider, significant interface polish across nearly every page, and the consolidated schema migration that closes out all alpha database changes. Beta testing begins after this release.

### Adaptive stream recovery

M3Undle now tracks per-channel stream health across sessions and uses that history to make smarter relay decisions.

- Channels are classified as **Stable**, **Cautious**, or **Unstable** based on observed disconnect and reconnect events
- Health classification persists in the database — it survives restarts and informs the next session startup
- Clean-watch duration is tracked after the last adverse event; a channel relaxes one health level after 30 minutes of clean playback
- At session startup, channel health is loaded before the first upstream connection so the relay decision is already informed before a single byte arrives
- When clean recovery from an MPEG-TS/H.264 boundary is not safe, M3Undle issues a hard controlled retune instead of continuing with corrupt data
- Cooldown policy improved to be less aggressive and avoid thrash after a single bad event

### Provider relay policy

Replaced the hidden per-provider "clean remux" toggle with an explicit, user-facing **Relay policy** setting.

- **Auto** — M3Undle decides: direct relay for Stable and Cautious channels, clean relay when channel health is Unstable
- **On** — always use clean relay regardless of health
- **Off** — always use direct relay regardless of health

Existing providers migrate automatically: prior `off` rows become `Auto`, prior legacy remux rows become `On`.

The relay policy, startup health classification, and relay decision reason are now visible on the stream monitor for every active session.

### Stream monitor improvements

- Transfer rates (bytes/sec) displayed per session and per connected client
- Startup health and relay decision reason shown for each active session
- Sessions display more detailed subscriber information

### Retune compatibility fix

A controlled downstream retune is now suppressed when an internal or Generated HLS relay subscriber is attached to the shared session. A Jellyfin or NextPVR retune no longer kills a concurrent IPTVnator or browser HLS stream that is still active.

### HDHomeRun page

New dedicated HDHomeRun page showing device identity, discovery endpoint, tuning endpoint, and configured tuner count. Makes manual client setup straightforward without hunting through settings.

### About page

New About page with application version, build date, and project links. Fixes #97.

### Dashboard and navigation

- Dashboard reorganized: active profiles are the primary focus, all published endpoint URLs grouped in one place
- Always-on side drawer for fast navigation between pages without reopening a menu
- Navigation highlights the currently active page
- Setup guidance built into the navigation flow to help new users move through provider add, group mapping, and publish in the right order
- Settings moved to the navigation bar for direct access

### Channel mapping UX

- New providers no longer mark all channels as needing review — only genuinely new channels are flagged
- Channel tracking progress shown clearly during the mapping workflow
- Group filter chips normalized with consistent colors and shapes for Pending, Include, Exclude, and New states
- Group counts and mapped/unmapped states clearer at a glance
- Fixed a case where adding a provider marked all existing channels and groups as needing review

### Profiles

- Fixed inactive provider issues incorrectly marking active providers as degraded on the Profiles page

### Settings

- Settings page reorganized to make each section easier to understand
- Authentication and Xtream endpoint settings fixed

### Logs

- Log search and type-based filtering added
- Actual error text now shown instead of the .NET array type name

### Database and performance

- Slow database load mitigations — the UI detects and displays when the database is not responding
- UI performance improvements between page transitions
- Fixed a bug where saving a snapshot could fail under certain conditions
- All alpha migrations (Alpha 1 through Alpha 7) consolidated into a single baseline migration, removing the startup migration repair path

**Container images**

```text
ghcr.io/sydney-elvis/m3undle:v1.0.0-alpha.7
ghcr.io/sydney-elvis/m3undle:alpha
```

---

## [v1.0.0-alpha.6] — 2026-04-26

Alpha 6 focuses on practical reliability: stronger stream handling for unstable providers, better browser/HLS behavior, first-class observability, Xtream provider detection, and documentation that better matches how people are actually running M3Undle.

### Streaming and HLS reliability

- Hardened shared live stream handling so regular MPEG-TS clients and Generated HLS clients can coexist more predictably
- Improved HLS session accounting, cleanup, retune behavior, and stream monitor visibility
- Added stronger internal relay handling for Generated HLS playback, including MPEG-TS relay paths and safer fallback behavior
- Improved handling for shaky providers with upstream cooldowns, content-stall detection, clean relay support, and MPEG-TS startup boundary handling
- Fixed cases where HLS or relay sessions could hold stale client counts or make a parent shared stream look idle while playback was still active

### Provider workflow and Xtream compatibility

- Added Xtream-capable endpoint detection when adding providers, with clearer mode guidance in the UI
- Added provider account and playlist-expiration visibility where the upstream exposes it
- Improved support for Xtream/Roku-style endpoint behavior and stream URL handling
- Added per-provider refresh scheduling so provider cadence can be tuned without forcing every profile to follow the same timing

### Observability and diagnostics

- Added Prometheus-compatible metrics with configurable access modes (Disabled, LocalOnly, Token, Public), local CIDR controls, and token-based scraping
- Added liveness, readiness, and JSON health endpoints for containers, reverse proxies, and uptime checks
- Added authenticated diagnostics APIs for provider refreshes, streams, lineup state, and EPG behavior
- Added system event tracking and UI badging so stream/provider problems are easier to see without digging through logs first

### Lineup, guide, and data reliability

- Added the consolidated alpha.6 schema migration with new observability, system event, provider, and scheduling data
- Improved EPG matching, coverage analysis, and guide handling around refresh/build workflows
- Fixed guide carry-forward behavior so build-only refreshes do not keep serving an empty guide when cached EPG data is available
- Added database indexes and service-side cleanup in areas expected to matter more as catalogs grow

### Documentation, UI, and project hygiene

- Reworked the README with current alpha status, Docker guidance, screenshots, endpoint examples, and troubleshooting notes
- Added dedicated observability documentation covering metrics, probes, diagnostics APIs, labels, and Prometheus examples
- Updated Docker and GUI documentation around generated HLS storage, endpoint security, refresh schedules, stream proxy settings, and HDHomeRun behavior
- Continued the CLI/Core split so shared parsing, filtering, provider, EPG, and stream utilities live in the core project instead of the web layer

### Testing

- Expanded focused coverage around stream sharing, Generated HLS, upstream connector behavior, MPEG-TS boundary scanning, observability, refresh scheduling, system events, Xtream/provider handling, and EPG matching
- Fixed a timing-sensitive CI failure in the HDHR-only subscriber keepalive test

**Container images**

```text
ghcr.io/sydney-elvis/m3undle:v1.0.0-alpha.6
ghcr.io/sydney-elvis/m3undle:alpha
```

---

[v1.0.0-alpha.7]: https://github.com/Sydney-Elvis/M3Undle/compare/v1.0.0-alpha.6...v1.0.0-alpha.7
[v1.0.0-alpha.6]: https://github.com/Sydney-Elvis/M3Undle/compare/v1.0.0-alpha.5...v1.0.0-alpha.6
26 changes: 13 additions & 13 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
[![Release](https://img.shields.io/github/v/release/Sydney-Elvis/M3Undle?include_prereleases&style=flat-square)](https://github.com/Sydney-Elvis/M3Undle/releases/latest)
[![License](https://img.shields.io/github/license/Sydney-Elvis/M3Undle?style=flat-square)](LICENSE)

[**Sponsor**](https://github.com/sponsors/Sydney-Elvis) | [**Buy Me a Coffee**](https://buymeacoffee.com/jake1164s) | [**Changelog**](https://github.com/Sydney-Elvis/M3Undle/releases) | [**Docker**](https://github.com/Sydney-Elvis/M3Undle/pkgs/container/m3undle)
[**Sponsor**](https://github.com/sponsors/Sydney-Elvis) | [**Buy Me a Coffee**](https://buymeacoffee.com/jake1164s) | [**Changelog**](CHANGELOG.md) | [**Docker**](https://github.com/Sydney-Elvis/M3Undle/pkgs/container/m3undle)

</div>

Expand All @@ -26,19 +26,19 @@ Works with clients such as NextPVR, Jellyfin, IPTVnator, IPTV Smarters, and othe
![M3Undle dashboard showing system status, active profile, published channel counts, and output URLs](docs/images/readme-dashboard.png)

> [!IMPORTANT]
> **Alpha Status**
> **Beta Status**
>
> M3Undle has completed Alpha 6. The core workflow is implemented, streaming has been hardened with shared-stream support and relay fallback for unstable providers, and observability endpoints are in place. Alpha 7 is focused on interface polish before moving into beta.
> M3Undle has completed all alpha milestones and is entering beta. The core workflow is fully implemented: streaming is hardened with shared-stream support, adaptive stream health tracking, and relay policy for unstable providers. Observability, Xtream detection, HDHomeRun integration, and interface polish are all in place.
>
> It is stable enough for real LAN testing and personal use, but it is still alpha software. Expect rough edges and possible provider or client-specific issues before beta.
> Beta focuses on broader DVR client validation, documentation, and final hardening before a stable release. It is suitable for real LAN use, but expect provider- and client-specific edge cases to surface during testing.

## Run it

M3Undle is published to GitHub Container Registry.

Pull the current alpha image:
Pull the current beta image:

docker pull ghcr.io/sydney-elvis/m3undle:alpha
docker pull ghcr.io/sydney-elvis/m3undle:beta

Create a working directory:

Expand All @@ -50,7 +50,7 @@ Create `compose.yaml`:

services:
m3undle:
image: ghcr.io/sydney-elvis/m3undle:alpha
image: ghcr.io/sydney-elvis/m3undle:beta
container_name: m3undle
ports:
- "5004:5004"
Expand Down Expand Up @@ -82,7 +82,7 @@ Port `8080` serves the web UI, M3U, XMLTV, Xtream, and general compatibility end

The `config` folder is bind-mounted so configuration files stay easy to inspect and back up. Runtime state, logs, snapshots, and browser playback working files use the Docker-managed `m3undle_data` volume.

Use `alpha` for the latest alpha build. Specific release tags are listed on the [M3Undle container registry page](https://github.com/Sydney-Elvis/M3Undle/pkgs/container/m3undle).
Use `beta` for the latest beta build. Specific release tags are listed on the [M3Undle container registry page](https://github.com/Sydney-Elvis/M3Undle/pkgs/container/m3undle).

`latest` is not used during alpha or beta. It will be introduced no earlier than the release candidate track.

Expand Down Expand Up @@ -127,7 +127,7 @@ Publish the same managed lineup through M3U, XMLTV, HDHomeRun-compatible, and Xt

### Streaming

Proxy live streams through M3Undle, hide provider credentials from clients, share live streams across multiple downstream clients, and monitor active stream sessions.
Proxy live streams through M3Undle, hide provider credentials from clients, share live streams across multiple downstream clients, and monitor active stream sessions. M3Undle tracks per-channel stream health (Stable, Cautious, Unstable) and uses configurable relay policy to handle noisy provider channels without disrupting connected clients.

![Stream Monitor showing two active sessions with buffer usage and three connected clients sharing streams](docs/images/readme-streams.png)

Expand Down Expand Up @@ -239,13 +239,13 @@ When reporting an issue, include the M3Undle version tag, Docker compose file wi

## Roadmap

Alpha 6 is released. Current work is Alpha 7 interface polish before moving into beta.
All alpha milestones are complete. M3Undle is now in beta.

Planned release path:
Release path:

1. Alpha 6 — released.
2. Alpha 7 — interface polish and UX improvements.
3. Beta — broader testing, documentation cleanup, and client compatibility work.
2. Alpha 7 — released. Adaptive stream recovery, relay policy, stream health tracking, interface polish, and HDHomeRun improvements.
3. **Beta — current.** Broader DVR client validation, documentation, and final hardening.
4. Release candidate — final validation and packaging.
5. v1.0.0 — stable release.

Expand Down
13 changes: 6 additions & 7 deletions docs/DOCKER.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ docker compose up -d
```yaml
services:
m3undle:
image: ghcr.io/sydney-elvis/m3undle:alpha
image: ghcr.io/sydney-elvis/m3undle:beta
container_name: m3undle
user: "${PUID}:${PGID}"
ports:
Expand Down Expand Up @@ -92,7 +92,7 @@ docker run -d \
-v ./config:/config \
-v ./data:/data \
--restart unless-stopped \
ghcr.io/sydney-elvis/m3undle:alpha
ghcr.io/sydney-elvis/m3undle:beta
```

---
Expand Down Expand Up @@ -463,7 +463,7 @@ For auto-discovery to work identically to a real HDHomeRun (including from other
```yaml
services:
m3undle:
image: ghcr.io/sydney-elvis/m3undle:alpha
image: ghcr.io/sydney-elvis/m3undle:beta
container_name: m3undle
network_mode: host
environment:
Expand Down Expand Up @@ -538,12 +538,11 @@ Database migrations run automatically on startup.

| Tag | Tracks | Notes |
|---|---|---|
| `v1.0.0-alpha.1` | Exact version — immutable | Pin to this if you want full control over updates |
| `alpha` | Latest alpha release | Moves forward as new alpha builds are published |
| `beta` | Latest beta release | Available from v1.0.0-beta.1 |
| `v1.0.0-beta.1` | Exact version — immutable | Pin to this if you want full control over updates |
| `beta` | Latest beta release | Moves forward as new beta builds are published |
| `latest` | Latest **stable** release | Not published until v1.0.0 — do not use during pre-release |

**Current phase:** alpha — use the `alpha` tag or pin to a specific version like `v1.0.0-alpha.1`.
**Current phase:** beta — use the `beta` tag or pin to a specific version like `v1.0.0-beta.1`.

`latest` does not exist yet. Pulling it will return "image not found".

Expand Down
26 changes: 26 additions & 0 deletions docs/GUI.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@ The interface emphasizes:
- Clear visibility
- No hidden logic

UI consistency rules used by contributors and AI agents are documented in `docs/dev/GUI_CONSISTENCY_CONTRACT.md`.

---

## UI Sections
Expand All @@ -27,6 +29,7 @@ Configuration includes:
- Timeout settings
- Enabled/disabled toggle
- Optional per-provider max concurrent stream limit
- Relay policy — controls how M3Undle handles the stream from this provider: **Auto** (applies clean relay for channels classified as Unstable), **On** (always clean relay regardless of health), or **Off** (direct relay only)

The UI shows:

Expand Down Expand Up @@ -153,6 +156,8 @@ When the simultaneous-stream cap is full, zero-viewer streams waiting in their d

MPEG-TS CDN-gap handling is automatic. M3Undle can send null-packet keepalives for external non-HDHomeRun players during short upstream gaps, while HDHomeRun-only sessions are left as plain upstream MPEG-TS for DVR compatibility. The advanced content-stall timeout for that behavior is configured through appsettings/environment variables rather than the UI.

M3Undle tracks per-channel stream health across sessions. Each channel is classified as **Stable**, **Cautious**, or **Unstable** based on observed disconnect and recovery events, and that classification persists in the database. The stream monitor shows the startup health and relay policy decision for each active session so you can see which channels are being handled with additional relay protection.

For HDHomeRun-style access, tuner ownership is tracked by the configured `Virtual Tuner ID`, not by remote IP. Re-tuning from the same virtual tuner replaces the prior playback session instead of consuming another tuner slot.

**Browser Playback**
Expand Down Expand Up @@ -272,6 +277,27 @@ The **Manage Numbers** button in the page header switches the page into Number M

---

### 9. HDHomeRun

The HDHomeRun page shows the M3Undle device identity and endpoint URLs for clients that use HDHomeRun-compatible device discovery.

It displays:

- Device name, device ID, and firmware version (as presented to HDHomeRun clients)
- Discovery endpoint URL (`http://<host>:5004/discover.json`)
- Tuning endpoint URL (`http://<host>:5004/lineup.json`)
- Configured tuner count

Use this page to confirm your HDHomeRun setup and copy the tuner URL for manual client configuration. Auto-discovery depends on Docker networking and multicast; manual setup using the URL shown here is generally more reliable.

---

### 10. About

The About page shows product information: application version, build date, and links to the project home and license.

---

## UI Design Goals

The Web UI is built around the following principles:
Expand Down
2 changes: 1 addition & 1 deletion docs/design/DB_SCHEMA.md
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@
- created_utc (TEXT)
- updated_utc (TEXT)

Note: `providers.is_active` was removed in migration `Alpha6_ActiveProfile`. Active state now lives on `profiles.is_active`.
Note: active state lives on `profiles.is_active`.

Indexes:
- idx_providers_enabled(enabled)
Expand Down
2 changes: 1 addition & 1 deletion docs/dev/ALPHA5_VALIDATION_CHECKLIST.md
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ Legend: `[ ]` not started | `[x]` passed | `[!]` failed / investigate
- [x] Make `ChannelSessionManager.RemoveIfClosedAsync()` atomic
- [x] Add a transaction around `ProfilesPageService.DeleteProfileAsync()`
- [x] Block disabled profiles from being activated in `ProfilesPageService.SetProfileActiveAsync()`
- [x] Harden `20260404000000_Alpha6_ActiveProfile` migration table rebuild behavior
- [x] Harden active-profile schema handling

## Post-Review Medium Coverage (2026-04-10)

Expand Down
Loading