149 lines
8.4 KiB
Markdown
149 lines
8.4 KiB
Markdown
# Glint-inspired Fenris dashboard
|
||
|
||
Status: accepted on 2026-09-19. The user confirmed the complete design and
|
||
additionally requested Glint-style plotted graphs in place of block bars.
|
||
|
||
## Purpose and reference
|
||
|
||
Adopt the visual approach of [Glint](https://github.com/ntrospect0/glint) for
|
||
Fenris's terminal dashboard. The selected visual reference is the third README
|
||
screenshot, using Chalktone, at upstream commit
|
||
`c1d73d3e8ead2f4069630b2a237306af8f6e69c8`:
|
||
[reference screenshot](https://github.com/ntrospect0/glint/blob/c1d73d3e8ead2f4069630b2a237306af8f6e69c8/docs/screenshots/glint-demo3.png).
|
||
|
||
The source and architectural assessment is recorded in
|
||
[the research note](../research/glint-dashboard-adoption.md).
|
||
|
||
## Confirmed user choices
|
||
|
||
- Adopt panel styling, keyboard focus, and panel zoom. A freely configurable
|
||
dashboard builder is outside the selected scope.
|
||
- Give the live read/write activity chart the largest opening-screen area,
|
||
with endurance outlook and monitoring state visible alongside it.
|
||
- Use the muted Chalktone appearance from Glint's third screenshot as the
|
||
visual direction.
|
||
- Put Live / Day / History views inside one activity panel, keeping both
|
||
read/write totals and the selected date visible.
|
||
- Expand a focused panel within the dashboard while retaining a fixed strip
|
||
for monitoring state, observation freshness, and essential controls.
|
||
- Replace block bars with thin dotted time-series plots resembling Glint's
|
||
chart. Label volume and time axes, retain exact selected-point readouts,
|
||
and leave explicit breaks for missing or incompatible evidence. Joining
|
||
adjacent measured points is visual guidance, not additional observations.
|
||
|
||
## Implementation recommendation
|
||
|
||
Implement the selected visual and interaction patterns independently in
|
||
Fenris's existing Python/Textual presentation layer. Retain the collector,
|
||
observation store, shared status/projection contracts, and authenticated control
|
||
path. Glint is a Rust/Ratatui application under GPL-3.0-or-later; copying or
|
||
porting its implementation into Fenris would require a separate licensing
|
||
decision under [ADR 0009](../adr/0009-mit-license.md). Referencing general panel
|
||
and navigation patterns does not require adopting its application architecture.
|
||
|
||
Use thin borders, compact titles, an explicit focused-panel indicator, and
|
||
restrained cream/earth-tone accents. Preserve readable contrast and semantic
|
||
state labels; the reference's dim secondary text is not a readability target.
|
||
Use Fenris content and identity, without Glint's unrelated clock, weather,
|
||
finance, email, or gallery features.
|
||
|
||
## Existing behavior to preserve
|
||
|
||
- Activity is measured read/write volume, with both totals accessible and
|
||
writes selected initially. A visual stock-chart reference must not turn
|
||
interval volume into speed or imply continuity through unknown evidence.
|
||
- Preserve the latest-three-hour opening view, date selection, local-day and
|
||
timezone labels, available history precision, and historical selection across
|
||
refresh under [live drive activity](live-drive-activity.md).
|
||
- Preserve the usage-adjusted theoretical lifespan and categorical projection
|
||
confidence with contributing facts. Navigation and graph selection cannot
|
||
change the projection evidence window or endurance accounting.
|
||
- Preserve explicit zero, gap, incomplete, unallocated, unavailable, paused,
|
||
stale, collection-failure, and store-fault states.
|
||
- Keep boot enablement, runtime activity, collection outcome, and observation
|
||
freshness distinct. Quit leaves background monitoring running; pause remains
|
||
a deliberate disable through the existing control path.
|
||
- Preserve keyboard and mouse access, constrained-terminal text/reflow,
|
||
high-contrast availability, reduced motion, help, and disclosures.
|
||
|
||
## Concrete layout and interaction proposal
|
||
|
||
- A compact identity header above one dashboard workspace.
|
||
- A narrow supporting column for the endurance outlook and drive facts;
|
||
a wide activity panel receives the remaining workspace. On the normal
|
||
dashboard, confidence and monitoring state remain visible beside activity.
|
||
- Live starts with the latest three hours; Day exposes the selected local
|
||
day's available detail; History exposes the retained longer-term evidence.
|
||
Reuse existing measurements and ranges rather than introducing a new data
|
||
model. Show selected date/timezone, read/write totals, measurement, and
|
||
evidence state wherever applicable.
|
||
- Use visible, clickable tabs; Tab/Shift+Tab and mouse clicks move focus.
|
||
Use `z` to toggle focused-panel zoom and Escape to restore the dashboard
|
||
when an input/dialog is not consuming Escape. Preserve selection, date,
|
||
range, measurement, and focus across zoom and refresh.
|
||
- Keep the bottom status/control area outside the expanding workspace. It
|
||
may wrap when required: compactness cannot merge the four service facts or
|
||
hide a fault/pause state. Keep quit distinct from pause in wording and
|
||
behavior without spending three full rows on a separate heavy quit box.
|
||
- Use existing date-navigation and read/write shortcuts, with visible help
|
||
updated for tabs, focus, and zoom. Text entry must consume its own keys.
|
||
- Use Chalktone-inspired styling as the new default while retaining existing
|
||
selectable themes, High Contrast, and reduced motion. Preserve an explicitly
|
||
saved theme preference during upgrade.
|
||
- Design for 80×24 and larger, with existing text/reflow behavior below that
|
||
size. Essential facts and actions must remain accessible; the large-screen
|
||
reference does not require squeezing its entire density into small terminals.
|
||
|
||
These defaults implement the confirmed choices. Date entry and inspection
|
||
retain existing evidence precision: hourly/daily UTC evidence is labelled UTC,
|
||
while local-day totals keep their recorded timezone. This visual redesign does
|
||
not manufacture finer or local-hour precision from coarse UTC evidence.
|
||
|
||
## Smallest sufficient implementation proof
|
||
|
||
Render normal and zoomed views at a representative large terminal and 80×24,
|
||
plus a constrained terminal. Check focus/tab/zoom/date/read-write interactions
|
||
and selection persistence through refresh. Exercise paused, stale, store-fault,
|
||
missing-baseline, and incomplete-evidence displays using existing synthetic
|
||
stores and headless TUI patterns. Verify quit never invokes monitoring control
|
||
and existing action tests still cover the sanctioned helper. UI fixtures are
|
||
not evidence of the user's deployed drive state.
|
||
|
||
## Specification reconciliation
|
||
|
||
This accepted redesign supersedes conflicting presentation requirements in
|
||
[the original Panes specification](fenris-redesign.md#7-panes-tui) and
|
||
[dashboard clarity](dashboard-clarity.md): the full-width headline becomes a
|
||
supporting endurance panel, the history/live plots share a tabbed activity
|
||
panel, and a compact fixed control row replaces the heavy standalone quit
|
||
rail. The block-bar requirement is superseded by dotted volume plots. Their
|
||
behavioral requirements, including clear quit-versus-pause semantics, remain.
|
||
|
||
The live-drive-activity specification excludes unrelated redesign from that
|
||
earlier task. This is a separate design request, not permission to undo its
|
||
accepted data, date-navigation, evidence, or forecast behavior. Existing design
|
||
documents and source may differ in implementation status; this assessment is
|
||
not proof that every earlier acceptance criterion has shipped.
|
||
|
||
## Documentation scope
|
||
|
||
No new domain term has been resolved: panel, focus, zoom, and theme are general
|
||
interface concepts and do not belong in the domain glossary. No new ADR is
|
||
needed for a reversible presentation change that retains the existing stack,
|
||
license, data model, and privilege boundary. Record any later durable
|
||
architectural trade-off separately if one emerges.
|
||
|
||
## Implementation validation
|
||
|
||
Implemented in Fenris's existing presentation layer with Textual 8.2.8.
|
||
The full suite passed 801 tests; 43 packaging/signing checks were skipped for
|
||
missing package artifacts or signing tools. After the final incomplete-evidence
|
||
fixes, all 81 focused dashboard, history, and plot tests passed. New renderer
|
||
and regression files pass configured Ruff checks; affected production files
|
||
pass correctness lint and the diff passes whitespace checks. Existing broader
|
||
lint warnings were not part of this redesign.
|
||
|
||
Rendered normal and zoomed dashboards at 140×44, plus normal 80×24 and
|
||
constrained 70×20 views. The [saved preview](../../assets/dashboard-chalktone.png)
|
||
uses synthetic observations. No installation or release was performed.
|