feat: web UI + HTTP server + Electron shell

- serve.go: embedded web UI (embed.FS), REST API endpoints for
  search, list, download (SSE progress), and WAV extraction
- main.go: added serve subcommand and flag registration
- web/ui: vanilla JS frontend with search cards, download queue,
  extract controls; dark theme, zero dependencies
- electron/: Electron wrapper that spawns fetch serve as sidecar,
  reads port from stdout, creates BrowserWindow; electron-builder
  config for macOS .app bundle with akaiutil + script as resources

Refs #1, #9
This commit is contained in:
2026-06-21 19:46:26 -07:00
parent 815d43ee97
commit e2dbb66525
8 changed files with 982 additions and 1 deletions
+8 -1
View File
@@ -68,6 +68,8 @@ func main() {
cmdExtract(args)
case "pipeline":
cmdPipeline(args)
case "serve":
cmdServe(args)
default:
fmt.Fprintf(os.Stderr, "unknown command: %s\n", cmd)
printUsage()
@@ -84,6 +86,7 @@ Usage:
akai-fetch download [flags] download ISOs (from file or by identifier)
akai-fetch extract [flags] extract WAVs from downloaded ISOs
akai-fetch pipeline [flags] full search → download → extract pipeline
akai-fetch serve [flags] start HTTP server with web UI
Search flags:
-query "akai sampler" search query (default: "subject:akai AND subject:sampler")
@@ -109,7 +112,11 @@ Pipeline flags:
-limit 30 max results
-dir "./output" base output directory
-download-jobs 2 concurrent downloads
-extract-jobs 2 concurrent extractions`)
-extract-jobs 2 concurrent extractions
Serve flags:
-p, --port 0 HTTP port (0 = auto-assign)
--no-browser don't open browser automatically`)
}
// ─── Search ────────────────────────────────────────────────────────────