[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-82918":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":9,"language":10,"languages":9,"totalLinesOfCode":9,"stars":11,"forks":12,"watchers":13,"openIssues":14,"contributorsCount":14,"subscribersCount":14,"size":14,"stars1d":15,"stars7d":16,"stars30d":17,"stars90d":14,"forks30d":14,"starsTrendScore":18,"compositeScore":19,"rankGlobal":9,"rankLanguage":9,"license":20,"archived":21,"fork":21,"defaultBranch":22,"hasWiki":23,"hasPages":21,"topics":24,"createdAt":9,"pushedAt":9,"updatedAt":25,"readmeContent":26,"aiSummary":27,"trendingCount":14,"starSnapshotCount":14,"syncStatus":15,"lastSyncTime":28,"discoverSource":29},82918,"glint","ntrospect0\u002Fglint","ntrospect0","Terminal TUI-based dashboard, serving at-a-glance information across multiple domains",null,"Rust",145,8,1,0,2,42,80,19,74.86,"GNU General Public License v3.0",false,"main",true,[],"2026-06-12 04:01:39","# glint\n\nA fast, keyboard-driven terminal dashboard. Stocks, forex + crypto,\ncalendar, weather, news, email, notes, system resources, image gallery —\nall in one grid you compose yourself. Written in Rust with\n[ratatui](https:\u002F\u002Fratatui.rs).\n\nhttps:\u002F\u002Fgithub.com\u002Fuser-attachments\u002Fassets\u002F31f79aef-412c-44fb-bd72-c684e6aa9185\n\n*A live capture — keyboard shortcuts driving focus, view changes, and\nwidget interaction across the dashboard.*\n\n![Composed glint dashboard with clock, weather, calendar, news, stocks, resources, and gallery widgets in the tokyonight scheme](docs\u002Fscreenshots\u002Fglint-demo1.png)\n\n*A composed dashboard — clock + weather on the left, a calendar \u002F email\n\u002F notes stack and a stocks \u002F forex \u002F WSJ stack on the right, system\nresources and a rotating gallery filling the rest. `tokyonight` scheme.*\n\n![The same layout with the calendar rotated to week view, weather expanded to a 3-day forecast, and the WSJ news widget scrolling the latest articles](docs\u002Fscreenshots\u002Fglint-demo2.png)\n\n*Same layout, different views — calendar in week mode, weather showing\nthe 3-day forecast, the gallery rotating its next image, and the WSJ\nfeed scrolling the latest articles in the middle stack.*\n\n![A different 5-pane layout in the chalktone scheme, focused on the WSJ widget with an NVDA stock chart open](docs\u002Fscreenshots\u002Fglint-demo3.png)\n\n*A different 5-pane layout in the `chalktone` scheme, focused on the\nWSJ stack with an NVDA chart open in stocks on the right.*\n\nEverything is opt-in, locally configured, and persists in plain TOML\nunder `~\u002F.config\u002Fglint\u002F` — no accounts, no telemetry, no cloud\ncomponent glint controls. The setup wizard generates a working\ndashboard on first launch.\n\n---\n\n## Highlights\n\n- **Ten widget kinds**, each independently configurable, with sensible\n  built-in defaults — see the [widget catalogue](#widget-catalogue) below.\n- **Composable layout**: a grid of cells; any cell can be a single\n  widget or a **stack** of widgets you cycle between with `.` \u002F `,`.\n- **Multi-instance** — run the same widget kind in several panes\n  (`stocks@watchlist1` + `stocks@watchlist2`, `clock@home` + `clock@office`).\n- **Live config reload** — edit any widget's TOML and the dashboard\n  picks it up without a restart.\n- **Theming** — nine bundled colour schemes; per-widget colour overrides;\n  add your own schemes by editing one TOML file. `:scheme nord` switches\n  live.\n- **Setup wizard** — `glint --setup` (or first launch with no config)\n  walks you through layout, widget assignment, and credentials with\n  copy-pasteable instructions for each external service.\n- **Keyboard-first, mouse-friendly** — `Tab` cycles widgets,\n  `Shift+\u003Cletter>` jumps to a widget by its shortcut letter, `:` opens\n  a command bar, click anywhere to focus.\n- **No cloud component**: every credential lives on disk under\n  `~\u002F.config\u002Fglint\u002Fcredentials\u002F` (0600 perms). API calls go directly\n  from your machine to the upstream service.\n\n---\n\n## Install\n\n### From source (only option for now)\n\nYou need a recent Rust toolchain (1.81+). Install via\n[`rustup`](https:\u002F\u002Frustup.rs\u002F) if you don't have one.\n\n```sh\ngit clone https:\u002F\u002Fgithub.com\u002Fntrospect0\u002Fglint.git glint\ncd glint\n\n# Per-user install (no sudo, installs to ~\u002F.local\u002Fbin):\nmake install PREFIX=~\u002F.local\n\n# Or system-wide (typically needs sudo):\nsudo make install\n```\n\nIf `~\u002F.local\u002Fbin` isn't on your `$PATH`, add this to `~\u002F.zshrc` or\n`~\u002F.bashrc`:\n\n```sh\nexport PATH=\"$HOME\u002F.local\u002Fbin:$PATH\"\n```\n\nVerify:\n\n```sh\nglint --version\n```\n\n### Makefile targets\n\n| target | what it does |\n|---|---|\n| `make` \u002F `make release` | release build at `target\u002Frelease\u002Fglint` |\n| `make build` | debug build (faster compile, slower runtime) |\n| `make install` | release build + copy to `$(PREFIX)\u002Fbin\u002Fglint` |\n| `make uninstall` | remove `$(PREFIX)\u002Fbin\u002Fglint` |\n| `make test` | run the test suite |\n| `make clean` | `cargo clean` |\n\n### Slim builds\n\nEvery widget compiles in only when its feature is enabled. The default\n`widgets-all` umbrella turns them all on. For a smaller binary:\n\n```sh\ncargo install --path . --no-default-features \\\n  --features widget-clock,widget-weather,widget-stocks\n```\n\nAvailable features: `widget-clock`, `widget-weather`, `widget-calendar`,\n`widget-news`, `widget-stocks`, `widget-forex`, `widget-email`,\n`widget-resources`, `widget-gallery`, `widget-notes`.\n\n### Updating\n\n```sh\ngit pull\nmake install PREFIX=~\u002F.local   # or sudo make install\n```\n\n---\n\n## Quickstart\n\nLaunch with no existing config and you land in the setup wizard:\n\n```sh\nglint\n# → \"No config detected … launching the setup wizard.\"\n```\n\nThe wizard walks you through:\n\n1. **Global settings** — colour scheme, mouse-scroll direction, optional\n   LLM provider and API key.\n2. **Layout** — pick 1 to 8 panes and a layout preset.\n3. **Widget assignment** — pick the widget kind that fills each pane,\n   including the option to stack multiple widgets in a single cell.\n4. **Per-widget setup** — timezone, location, RSS feeds, watchlist\n   tickers, calendar providers, mailbox folders, gallery image paths.\n5. **OAuth flows** (where needed) — Gmail, Outlook, Google Calendar all\n   captured inline through the wizard with copy-paste instructions.\n\n![Setup wizard layout step — picking a 5-pane preset such as \"Sidebar + 2x2\"](docs\u002Fscreenshots\u002Fglint-setup.png)\n\n*The wizard's layout step — pick a pane count, then a preset; widget\nassignment follows on the next page.*\n\nRe-run any time with `glint --setup`. Every section has an\n**Edit \u002F Skip** gate; skipping leaves that TOML untouched, so hand-edits\nand comments survive.\n\nAfter the wizard, the dashboard launches with your layout. Press `?` for\nthe live keybinding overlay.\n\n---\n\n## Widget catalogue\n\n| widget | what it does | external services |\n|---|---|---|\n| **Clock** | big block-digit local time, optional secondary world clocks, configurable gradient | none |\n| **Weather** | current conditions + N-day forecast, IP geolocation fallback | [Open-Meteo](https:\u002F\u002Fopen-meteo.com) (free, key-less) |\n| **Calendar** | day \u002F week \u002F month views with event agenda | Google Calendar (OAuth), Microsoft Outlook (OAuth), CalDAV (iCloud \u002F Fastmail \u002F Nextcloud), local TOML events |\n| **News** | RSS \u002F Atom aggregator with topic filters, keyword search (`:news \u003Cterms>`), optional per-article LLM summaries | any RSS\u002FAtom feed; LLM provider for summaries |\n| **Stocks** | watchlist with price + change %, intraday + multi-year graphs, period toggle | [Yahoo Finance](https:\u002F\u002Ffinance.yahoo.com) (free, key-less) |\n| **Forex** | fiat + crypto pairs with auto-grouped Currencies \u002F Crypto sections, primary-swap with `s`, USD-pivot triangulation | Yahoo Finance |\n| **Email** | unified inbox preview with optional per-message LLM summaries | Gmail (OAuth), Outlook (OAuth), any IMAP server (app password) |\n| **Resources** | htop-style CPU \u002F memory \u002F top-process view | local `sysinfo` (no FFI) |\n| **Gallery** | rotating inline image slideshow (any image glob you point it at) | none — uses iTerm2 \u002F Kitty \u002F Sixel inline image protocol, falls back to unicode half-blocks |\n| **Notes** | vim-flavoured multi-note pad with undo\u002Fredo, mouse cursor positioning, per-note files | none — plain `.md` files under `~\u002F.config\u002Fglint\u002Fnotes\u002F` |\n\nEvery widget is independently optional. The wizard surfaces only what\nyou turn on; missing credentials route gracefully into the inline\ncapture flow.\n\n---\n\n## Configuration\n\nAll files live under `~\u002F.config\u002Fglint\u002F`:\n\n| file | what it controls |\n|---|---|\n| `config.toml` | active colour scheme, mouse-scroll direction, status bar, grid layout, widget cell placements |\n| `colorschemes.toml` | named theme palettes (`default`, `chalktone`, `gruvbox`, `tokyonight`, `rosepine`, `nord`, `bluloco`, `onedark`, `miasma`) |\n| `clock.toml` | primary timezone, world clocks, big-digit gradient |\n| `weather.toml` | location, units (metric\u002Fimperial), forecast days, IP geolocation fallback |\n| `news.toml` | RSS \u002F Atom feeds, topic filters, LLM summary toggle, fetch-body strategy |\n| `stocks.toml` | watchlist, indices, default period, jump URL template |\n| `forex.toml` | primary currency, fiat watchlist, **separate crypto watchlist**, default period |\n| `calendar.toml` | Google \u002F Outlook \u002F CalDAV \u002F Local providers + per-provider calendar IDs |\n| `email.toml` | folders \u002F labels to follow, polling cadence, LLM-summary opt-in |\n| `resources.toml` | refresh interval, top-N processes, sort key (CPU vs memory) |\n| `gallery.toml` | image paths or globs, rotation cadence, rescan interval |\n| `notes.toml` | per-widget shortcut + colour overrides (notes themselves live under `notes\u002F`) |\n| `llm.toml` | active LLM provider (`anthropic` or `openai`), model, rate limit, cache size |\n| `credentials\u002F` | OAuth tokens + API keys (`*_oauth_client.toml`, `*_oauth_token.toml`, `anthropic_key.toml`, `openai_key.toml`, `caldav.toml`, `imap.toml`) — 0600 perms |\n| `notes\u002F\u003Cinstance>\u002F` | one `.md` file per note, `mtime` sorts the list |\n\nMost fields have sensible defaults; you only have to set what you care\nabout. Re-run the wizard any time, or hand-edit and `:reload`.\n\n### Layout example\n\n```toml\n# config.toml\nversion = 1\n\n[global]\ntheme = \"nord\"\nmouse_scroll = \"natural\"\nshow_status_bar = true\n\n[layout]\ncolumns = [28, 36, 36]    # three columns at 28% \u002F 36% \u002F 36% of width\nrows = [30, 35, 35]       # three rows at 30% \u002F 35% \u002F 35% of height\n\n[[layout.cells]]\nwidget = \"clock\"\ncol = 0\nrow = 0\n\n[[layout.cells]]\nwidget = \"calendar\"\ncol = 1\nrow = 0\ncol_span = 2              # span two columns\n\n# Stack pane: three widgets share row 1, cols 1–2; rotate with . \u002F ,\n[[layout.cells]]\nwidgets = [\"news\", \"email\", \"notes\"]\ncol = 1\nrow = 1\ncol_span = 2\n\n[[layout.cells]]\nwidgets = [\"stocks\", \"forex\"]\ncol = 0\nrow = 2\ncol_span = 2\n```\n\n### Multi-instance widgets\n\nCells can reference a widget as `kind@instance`:\n\n```toml\n[[layout.cells]]\nwidget = \"stocks@watchlist1\"\ncol = 0\nrow = 2\n\n[[layout.cells]]\nwidget = \"stocks@watchlist2\"\ncol = 1\nrow = 2\n```\n\nThe first uses `stocks.toml` (the implicit `main` instance), the others\nread `stocks@watchlist1.toml` and `stocks@watchlist2.toml`. Same trick\nworks for clocks (home + office), calendars (work + personal), email\n(two accounts), etc.\n\n### Per-widget colour overrides\n\nAny widget's TOML can carry a `[colors]` block that overrides the\nactive theme just for that widget:\n\n```toml\n# weather.toml\nlocation = \"Vancouver, BC\"\n\n[colors]\nborder.focused = { fg = \"#e07b00\", modifiers = [\"bold\"] }\nwidget_title.focused = { fg = \"#fff\", bg = \"#e07b00\", modifiers = [\"bold\"] }\n```\n\nSame field shape as `colorschemes.toml`.\n\n### Adding a custom colour scheme\n\n```toml\n# colorschemes.toml\n[schemes.my_scheme]\nborder.focused           = { fg = \"#88c0d0\", modifiers = [\"bold\"] }\nborder.unfocused         = \"#3b4252\"\nwidget_title.focused     = { fg = \"#000\", bg = \"#88c0d0\", modifiers = [\"bold\"] }\nwidget_title.unfocused   = { fg = \"#eceff4\", modifiers = [\"bold\"] }\nmetadata.focused         = { fg = \"#d8dee9\" }\nmetadata.unfocused       = { fg = \"#616e88\", modifiers = [\"dim\"] }\ntext.plain               = { fg = \"#d8dee9\" }\ntext.brilliant           = { fg = \"#eceff4\", modifiers = [\"bold\"] }\ntext.dim                 = { fg = \"#616e88\" }\ntext.selected            = { fg = \"#ebcb8b\", modifiers = [\"bold\"] }\ntext.focused             = { fg = \"#88c0d0\", modifiers = [\"bold\"] }\ntext.shortcut            = { fg = \"#bf616a\", modifiers = [\"bold\"] }\n```\n\nThen `:scheme my_scheme` (persisted to `[global] theme`).\n\n> ⚠️ Dotted keys must be **unquoted** (`border.focused`, not\n> `\"border.focused\"`). Quoted dotted keys silently fail to deserialize.\n\n---\n\n## Keybindings\n\n### Global\n\n| key | action |\n|---|---|\n| `Tab` \u002F `Shift+Tab` | cycle focused widget |\n| `Shift+\u003Cletter>` | jump focus to a widget by its shortcut letter (lit in title) |\n| `click cell` | focus that widget |\n| `.` \u002F `,` | rotate the active widget in a stack pane |\n| `:` | open the command bar |\n| `?` | toggle help overlay (scrollable) |\n| `q` \u002F `Ctrl+C` | quit |\n\n### Command bar (`:`)\n\n| command | what it does |\n|---|---|\n| `:scheme \u003Cname>` | switch colour scheme (persists to `config.toml`) |\n| `:reload` | re-read every widget's TOML without restarting |\n| `:news \u003Cterms>` | filter News by keyword |\n| `:weather \u003Ccity>` | retarget Weather to a one-off city |\n| `:time \u003Ccity>` | retarget Clock |\n| `:stock \u003Csymbol>` | jump-lookup a ticker in Stocks |\n| `:fx \u003Ccode>` | swap primary currency in Forex |\n\n### Common per-widget keys\n\n| widget | keys |\n|---|---|\n| **Stocks** | `↑\u002F↓` select ticker · `←\u002F→` cycle graph period · `c` % ↔ $ · `Enter` open in browser · `1–9` jump period · `y` yank value |\n| **Forex** | `↑\u002F↓` select pair · `←\u002F→` cycle period · `s` \u002F `Enter` make selected primary (crypto seeds amount=1) · `c` edit amount · `y` yank |\n| **Calendar** | `d` \u002F `w` \u002F `m` day\u002Fweek\u002Fmonth · `←\u002F→` navigate · `t` today |\n| **Weather** | `:weather \u003Ccity>` retarget · `x` revert to default |\n| **Clock** | `:time \u003Ccity>` retarget · `x` revert to local |\n| **News** | `↑\u002F↓` select · `←\u002F→` filter tabs · `e` expand · `s` LLM summary · `Enter` open · `x` clear search |\n| **Email** | `↑\u002F↓` select · `Enter` open in mail client · `e` expand · `s` LLM summary |\n| **Resources** | `m` toggle sort (CPU ↔ memory) · `r` force refresh |\n| **Gallery** | `p` pause\u002Fresume · `n` \u002F `N` step · `↑\u002F↓` rotation interval ±1s |\n| **Notes** | `+` new · `-` delete (confirm) · `i` insert · `ESC` normal · `h`\u002F`l` focus list \u002F content · `j`\u002F`k` scroll · `gg`\u002F`G` top\u002Fbottom · `y` yank note · `Ctrl-A`\u002F`Ctrl-E` line start\u002Fend · `Ctrl-U` delete line · `Ctrl-Z` \u002F `Ctrl-Shift-Z` undo \u002F redo |\n\nHit `?` while running for the full overlay with the current shortcut\nassignments and active scheme.\n\n---\n\n## CLI reference\n\n```sh\nglint                    # launch the dashboard (or wizard on first run)\nglint --setup            # launch the wizard\nglint --init             # create ~\u002F.config\u002Fglint\u002F with default seed files\nglint --auth \u003Cprovider>  # run an auth flow (google, microsoft, imap, anthropic, openai)\nglint --clear-cache [TARGET]\n                         # wipe ~\u002F.cache\u002Fglint\u002F entirely, or scope to\n                         # a widget kind (news) or instance (news@home)\nglint --config \u003CFILE>    # override the default XDG location\nglint --version\n```\n\n---\n\n## External dependencies\n\nglint pulls every piece of remote data directly from the upstream\nservice; nothing routes through a glint-owned backend.\n\n| service | used by | auth |\n|---|---|---|\n| [Open-Meteo](https:\u002F\u002Fopen-meteo.com) | Weather (forecast), Weather (geocoding fallback via `ipapi.co`) | none |\n| [Yahoo Finance](https:\u002F\u002Ffinance.yahoo.com) | Stocks, Forex (fiat + crypto) | none |\n| [Google Calendar API](https:\u002F\u002Fdevelopers.google.com\u002Fcalendar) | Calendar (Google provider) | OAuth, you create the OAuth app |\n| [Gmail API](https:\u002F\u002Fdevelopers.google.com\u002Fgmail) | Email (Gmail provider) | OAuth, same app as Calendar |\n| [Microsoft Graph](https:\u002F\u002Flearn.microsoft.com\u002Fen-us\u002Fgraph\u002F) | Calendar (Outlook), Email (Outlook) | OAuth, you register an Azure app |\n| any CalDAV server | Calendar (iCloud, Fastmail, Nextcloud, …) | app password |\n| any IMAP server | Email (IMAP provider) | app password |\n| [Anthropic](https:\u002F\u002Fwww.anthropic.com\u002F) \u002F [OpenAI](https:\u002F\u002Fopenai.com\u002F) | News + Email LLM summaries | API key, optional |\n| any RSS \u002F Atom feed | News | none |\n\nThe setup wizard walks you through the OAuth flows for Google, Outlook,\nand the LLM providers. For CalDAV and IMAP the wizard captures host +\nusername + app-password inline. `INSTRUCTIONS.md` in the repo has the\nfull step-by-step for each provider, including screenshots of the\nGoogle Cloud \u002F Azure portals.\n\n### Rust crate dependencies\n\nNotable runtime crates: `ratatui` (TUI), `crossterm` (terminal I\u002FO),\n`tokio` (async runtime), `reqwest` (HTTP), `serde` + `toml` (config),\n`chrono` + `chrono-tz` (time \u002F timezones), `feed-rs` (RSS \u002F Atom),\n`image` + `ratatui-image` (Gallery), `imap` + `mail-parser` (Email),\n`sysinfo` (Resources), `readability` (article extraction for LLM\nsummaries). Full list in `Cargo.toml`.\n\n---\n\n## Data, privacy, and where things live\n\n| where | what |\n|---|---|\n| `~\u002F.config\u002Fglint\u002F*.toml` | your config — fully owned and editable by you |\n| `~\u002F.config\u002Fglint\u002Fcredentials\u002F` (0600) | OAuth tokens, API keys, IMAP passwords |\n| `~\u002F.config\u002Fglint\u002Fnotes\u002F` | notes as plain `.md` files |\n| `~\u002F.cache\u002Fglint\u002F` | per-widget on-disk caches (news articles, calendar events, email messages, etc.) — regenerable; a startup sweep drops anything > 30 days old |\n| `~\u002F.config\u002Fglint\u002Fglint.log` | runtime log; `tail -f` it to debug |\n\nglint never sends data to any third party that isn't named in the\nExternal dependencies table above. There is no telemetry.\n\n### Credential storage — what it does and doesn't protect\n\nToday every credential glint stores (IMAP \u002F CalDAV app passwords, LLM\nAPI keys, OAuth tokens) lives in a TOML file under\n`~\u002F.config\u002Fglint\u002Fcredentials\u002F` with `0600` permissions and an atomic\nwrite. This mirrors the convention used by `aws`, `gcloud`, `gh`,\n`docker`, `npm`, `ssh`, and similar local-first CLIs.\n\nWhat that covers:\n\n- ✅ Another non-root user on the same Unix host can't read the file.\n- ✅ With full-disk encryption on (FileVault \u002F LUKS \u002F BitLocker) a\n  lost laptop's offline disk is unreadable until unlocked.\n- ✅ OAuth tokens (Google, Microsoft) and app passwords (IMAP,\n  CalDAV) are revocable from the provider's account dashboard, and\n  app passwords don't grant master-account access.\n\nWhat it doesn't cover:\n\n- ❌ Anything running as **your** user (a rogue shell script, a\n  compromised npm package, anything else with read access to your\n  `$HOME`) can read the file. Same threat model as `~\u002F.aws\u002Fcredentials`\n  or `~\u002F.ssh\u002F`.\n- ❌ Root \u002F sudo on the host can read the file.\n- ❌ Backups that include `~\u002F.config\u002F` (Time Machine, restic, borg,\n  Arq, dotfile syncers like chezmoi \u002F yadm \u002F GNU stow) will carry the\n  credentials along. Excluding `~\u002F.config\u002Fglint\u002Fcredentials\u002F` is\n  recommended; on dotfile managers add it to the per-host ignore\n  list rather than syncing it across machines.\n\nRecommended posture:\n\n1. Keep full-disk encryption on.\n2. Exclude `~\u002F.config\u002Fglint\u002Fcredentials\u002F` from your backup tool.\n3. Exclude it from any dotfile sync — credentials should stay\n   per-host.\n4. Prefer OAuth and app passwords (which glint already does) over\n   master passwords.\n\n**Coming post-v0.2**: a tiered credential backend (OS keychain →\nhost-bound encryption → plaintext fallback) selected via\n`credentials_backend` in `config.toml`. See `CHANGELOG.md` →\nDeferred for the scope.\n\n---\n\n## Troubleshooting\n\n- **`glint` not found after install** — make sure `$(PREFIX)\u002Fbin` is on\n  your `$PATH`. The Makefile prints the right export line at the end of\n  `make install`.\n- **Gallery shows chunky pixelated images** — your terminal doesn't\n  speak iTerm2 \u002F Kitty \u002F Sixel inline protocols, so glint fell back to\n  unicode half-blocks. Switch to iTerm2 (macOS), WezTerm, Kitty, or\n  enable sixel mode in your terminal.\n- **OAuth flow won't open a browser** — the auth flow prints the URL\n  too; copy-paste it into any browser, complete the consent, and the\n  flow's localhost listener picks up the redirect.\n- **Forex shows blank rates after closing on a non-USD primary** —\n  fixed; the disk cache now only persists when the live primary\n  matches the configured one. Earlier versions could seed the next\n  launch with the wrong symbol set.\n- **Logs**: runtime alt-screen mode means stderr\u002Fstdout would corrupt\n  the display, so warnings\u002Ferrors land in\n  `~\u002F.config\u002Fglint\u002Fglint.log`. `tail -f ~\u002F.config\u002Fglint\u002Fglint.log`\n  while debugging.\n- **Reset to defaults**: move aside `~\u002F.config\u002Fglint\u002F` and re-run\n  `glint --setup`.\n\n---\n\n## Contributing\n\nglint is pre-launch v0.2; the architecture is settling but the surface\nis largely stable. If you want to dig in:\n\n1. `make test` — runs the full suite (~460 tests). Should pass clean\n   on `main` at all times.\n2. `make build` for a debug binary, `make` for release.\n3. `cargo clippy --features widgets-all` for lints; CI gates on this.\n4. **Adding a widget** is purely additive: implement the `Widget`\n   trait under `src\u002Fwidgets\u002F\u003Cname>\u002F`, declare a `widget-\u003Cname>` Cargo\n   feature, and append a `WidgetDescriptor` to\n   `src\u002Fwidgets\u002Fregistry.rs`. The registry is the single registration\n   point — no edits to `app.rs`, `main.rs`, or the wizard are needed.\n5. `AGENTS.md` carries the architecture overview (read it before\n   non-trivial PRs). `docs\u002Fwidget-sdk.md` is the widget author's\n   guide — platform capabilities, conventions, and reference\n   patterns extracted from the shipped widgets.\n\nIssues and PRs welcome.\n\n---\n\n## License\n\nglint is licensed under **GNU GPL v3 or later** — see\n[LICENSE](LICENSE) for the full text. In short: you're free to use,\nmodify, and redistribute glint, but any modified version you\ndistribute must also be GPL-licensed and must keep glint's\ncopyright notices intact. The author retains the right to offer\nthe project under additional licenses (see\n[CONTRIBUTING.md](CONTRIBUTING.md) for the contributor sign-off +\nrelicensing grant).\n","glint 是一个基于终端的TUI仪表盘，旨在提供跨多个领域的即时信息概览。它使用Rust语言开发，并依赖于ratatui库来实现界面渲染。该项目的核心功能包括股票、外汇、加密货币、日历、天气、新闻、邮件、笔记、系统资源和图片画廊等十种可独立配置的小部件，用户可以根据需要自由组合这些小部件以创建个性化的仪表盘布局。此外，glint支持多实例运行、实时配置重载以及多种主题切换等功能。适用于希望在命令行环境中快速获取各类信息而不依赖云端服务的技术爱好者或专业人士。","2026-06-11 04:09:38","CREATED_QUERY"]