git.iko.soy/parseable-macos
on master help sign in

A macOS client for Parseable

git clone ssh://git.iko.soy/parseable-macos

Parseable Viewer

A native macOS log viewer for Parseable, built with Swift and SwiftUI.

Browse log streams, run SQL queries, tail logs in real time, and inspect server configuration — all from a lightweight desktop app with zero external dependencies.

Features

Install

brew install ilyakooo0/tap/parseable-viewer

Requirements

Build from source

# Install XcodeGen (one-time)
brew install xcodegen

# Generate the Xcode project and build
xcodegen generate
xcodebuild -project ParseableViewer.xcodeproj \
  -scheme ParseableViewer \
  -configuration Release \
  build

The built app is located at build/Build/Products/Release/Parseable Viewer.app.

To run tests:

xcodebuild test \
  -project ParseableViewer.xcodeproj \
  -scheme ParseableViewer \
  -configuration Debug \
  -destination 'platform=macOS'

CI

GitHub Actions builds and tests on every push and PR via .github/workflows/build.yml. The pipeline:

  1. Builds for both arm64 and x86_64
  2. Runs tests on arm64
  3. Creates a universal binary via lipo
  4. On tagged releases (v*), creates a draft GitHub Release with all three zips

Architecture

LayerDescription
App@main entry point, AppState (central @Observable singleton injected via .environment())
ModelsCodable data types — JSONValue (recursive enum for arbitrary JSON), LogStream, ServerAbout, AlertConfig, etc.
ServicesParseableClient (stateless HTTP client, Basic Auth, URLSession async/await), ConnectionStore (UserDefaults + Keychain persistence)
ViewModelsQueryViewModel (SQL execution, filtering, export, history), LiveTailViewModel (timer-based polling, deduplication)
ViewsSwiftUI views — NavigationSplitView sidebar + tabbed detail pane

Key design decisions

Parseable API endpoints used

All under /api/v1/. Auth: Authorization: Basic <base64(user:pass)>.

MethodPathPurpose
HEAD/livenessHealth check
GET/aboutServer version, mode, storage info
GET/logstreamList all streams
PUT/DELETE/logstream/{name}Create/delete stream
GET/logstream/{name}/schemaField names and types
GET/logstream/{name}/statsIngestion/storage statistics
GET/logstream/{name}/infoCreation time, partitioning config
POST/querySQL query with time range
GET/alertsAlert rules
GET/logstream/{name}/retentionRetention policy
GET/userList users

Project structure

ParseableViewer/
  App/
    ParseableViewerApp.swift    # @main, window/menu setup
    AppState.swift              # Central observable: connections, streams, navigation
  Models/
    JSONValue.swift             # Recursive JSON enum (null|bool|int|double|string|array|object)
    LogStream.swift             # Stream, schema, stats, info models
    ServerInfo.swift            # ServerAbout, RetentionConfig, UserInfo
    AlertModels.swift           # AlertConfig, AlertRule, AlertTarget
    ServerConnection.swift      # Connection model with Keychain integration
  Services/
    ParseableClient.swift       # HTTP client + ParseableError
    ConnectionStore.swift       # UserDefaults persistence, SavedQuery store
    KeychainService.swift       # Keychain read/write/delete
  ViewModels/
    QueryViewModel.swift        # Query execution, filtering, export, history
    LiveTailViewModel.swift     # Polling, deduplication, entry buffer
  Views/
    ContentView.swift           # Root layout: sidebar + detail
    SidebarView.swift           # Stream list, saved queries, connection switching
    QueryView.swift             # SQL editor, time picker, results table
    LiveTailView.swift          # Real-time log streaming UI
    StreamDetailView.swift      # Schema, stats, retention for selected stream
    LogTableView.swift          # Sortable log record table with detail pane
    LogDetailView.swift         # Formatted + raw JSON record inspector
    AlertsView.swift            # Alert rule listing
    UsersView.swift             # User listing
    ServerInfoView.swift        # Server health, version, storage info
    ConnectionSheet.swift       # Add/edit/test connection dialog
    TimeRangePicker.swift       # Preset + custom date range selector
    SettingsView.swift          # Preferences: query defaults, live tail config
  Resources/
    Assets.xcassets             # App icon, accent color

Keyboard shortcuts

ShortcutAction
Cmd+Shift+NNew connection
Cmd+RRefresh streams
Cmd+EnterRun query
Cmd+PPause/resume live tail
Cmd+KClear live tail entries
Cmd+Ctrl+SToggle sidebar

License

See LICENSE for details.