This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
Tabame is a Windows-only Flutter desktop app that replaces the taskbar with a "QuickMenu" — a hotkey-summoned popup with audio/media controls, pinned apps, a window switcher, an app launcher, bookmarks, timers, clipboard history, color picker, screenshot tools, and many other small utilities. It's a single Win32 desktop app built with window_manager for frameless/transparent windows and a custom tabamewin32 Flutter plugin for native Win32 interop (global hooks, media session, hotkeys).
- Run/debug: run
flutter run -d windows. - Build release:
flutter build windows. - Lint:
flutter analyze(usesanalysis_options.yaml, based onpackage:lints/recommended.yamlwithalways_specify_types,prefer_relative_imports, and const-preferring rules enabled). - Tests:
flutter test(all),flutter test test/launcher_core_test.dart(single file). - The
tabamewin32directory is a separate local Flutter plugin package (path dependency inpubspec.yaml) containing the native Win32 glue — edit it like a normal Flutter plugin (Dart intabamewin32/lib, C++ intabamewin32/windows).
lib/main.dart parses CLI arguments first — Tabame relaunches itself as a separate process for several auxiliary windows (-spotlight, -editor, -screenCapture, -screenRecording, -screenDraw, -colorPicker, -msgbox, -run), each its own minimal entry point in lib/pages/. If none match, it goes through AppStartup (lib/logic/app_startup.dart): admin-relaunch check → register services/hooks → window_manager setup (frameless, transparent, always-on-top for QuickMenu; normal window for the Interface/settings page) → runApp(Tabame).
There isn't a router with multiple windows in one process — each "extra" surface (spotlight search, photo editor, screen capture/draw/recording, color picker, message boxes, run-status) is a new process launch of the same exe with a flag, handled at the top of main(). When adding a new standalone overlay/tool, follow this pattern rather than trying to open a second Flutter window in-process.
models/globals.dart— global mutable app state (Globalsstatic class: window sizes, current page/QuickMenu sub-page, focused window rect, etc.) and shared enums (Pages,QuickMenuPage).models/settings.dart/models/classes/save_settings.dart/models/classes/boxes.dart— user settings persistence ("Boxes" is the settings/config object model, loaded at startup before window setup decides QuickMenu vs Interface size).models/win32/— direct Win32 API wrappers (window handles, hooks) built on top ofpackage:win32and thetabamewin32plugin.models/db/— SQLite-backed stores (file_index_db.dartfor the file/app search index,music_library_db.dartfor the local music library).pages/launcher/— the app launcher feature, organized as its own mini-architecture:core/(query parsing, result model, executor, search state),search/(per-source search handlers — windows, desktop, bookmarks — behind a commonsearch_handler.dartinterface),result/(result row widgets per result type),services/(app catalog, action execution). Launcher queries support prefix sigils to scope the search mode (e.g..= windows only,>/?= files only,'/b= bookmarks,;= desktop,n= Notion,$/bare word = function/timer commands) — seelauncher_query.dartandtest/launcher_core_test.dartfor the exact grammar.widgets/itzy/quickmenu/— the QuickMenu's individual feature buttons, one file per button (button_*.dart). This is the place to look for/add a QuickMenu feature; each button is largely self-contained (UI + the action it triggers).widgets/itzy/interface/,pages/interface.dart— the "Interface" window (settings/sidebar app), separate from the QuickMenu popup.pages/quickmenu_designs/— alternate QuickMenu visual layouts/themes.services/— longer-running background services (file indexer, music indexer/artwork cache, wallpaper service) consumed by the DB layer and UI.logic/error_handler.dart— central error logger (ErrorLogger); bothFlutterError.onErrorandPlatformDispatcher.instance.onErrorare wired to it in release mode, plus arunZonedGuardedcatch-all inmain(). Use this rather than ad-hoc logging for anything that should land inerrors.logunder%localappdata%/Tabame.
- Use
WindowsScrollView(lib/widgets/widgets/windows_scroll.dart) instead ofSingleChildScrollVieweverywhere, for a consistent native-feeling scroll experience. - UI follows the "Instrument Panel" design language described in
.impeccable.md: high density, minimal padding, sharp low-opacity borders, subtle gradients only on key CTAs (not glows),FontWeight.w600/w700for UI text (neverw900). - Imports are relative (
prefer_relative_importslint). .dartxfiles (e.g.lib/services/file_indexer.dartx,lib/pages/launcher.dartx) are intentionally-excluded/old code kept for reference; they are not compiled.