QD·

Quinn Desktop

September 2026Native Mac app

I wanted my calendar, tasks, and weather to feel like part of my desktop. This started with customized Übersicht widgets in 2022 and grew into a native Swift app, with a month view, a day agenda, quick task capture, and rising white particles in the background.

Actual native SwiftUI calendar, agenda, tasks and weather views rendered with sample data, alongside a frozen frame of the app’s rising white particles.
Preview rendered with sample data from the native app; composite image.

Project notes

  • Click-through particles sit behind separate interactive calendar and task panels.
  • Month and Day views support an expandable agenda, independent scrolling, and task capture and completion.
  • The downloadable native Swift copy starts with synthetic data and separate account and storage settings.

First iteration (2022) ↗ · Original explanation ↗

Source & notes

I’ve shared the SwiftUI and AppKit interface, calendar and task logic, sample data, and offline checks. It compiles and passes 50 self-tests. Live services need your own settings and an explicit launch flag.

Requires macOS 14 or newer, Swift 6, and Apple’s command-line development tools. The package has no external Swift dependencies. This is a source snapshot; a reuse license has not been selected.

View Package.swift
// swift-tools-version: 6.0

import PackageDescription

let package = Package(
    name: "QuinnDesktop",
    platforms: [.macOS(.v14)],
    products: [
        .library(name: "DashboardCore", targets: ["DashboardCore"]),
        .executable(name: "QuinnDesktop", targets: ["QuinnDesktop"]),
        .executable(name: "DashboardSelfTests", targets: ["DashboardSelfTests"]),
    ],
    targets: [
        .target(name: "DashboardCore"),
        .executableTarget(
            name: "QuinnDesktop",
            dependencies: ["DashboardCore"]
        ),
        .executableTarget(
            name: "DashboardSelfTests",
            dependencies: ["DashboardCore"]
        ),
    ]
)
View the desktop layout (excerpt)
import DashboardCore
import SwiftUI

struct DecorativeDesktopView: View {
    @ObservedObject var state: DashboardState

    var body: some View {
        GeometryReader { geometry in
            ZStack(alignment: .topLeading) {
                ParticleField(enabled: state.particlesEnabled)

                WeatherView(
                    snapshot: state.weather,
                    availability: state.weatherAvailability
                )
                    .frame(width: 260, height: 82, alignment: .topLeading)
                    .offset(x: geometry.size.width * 0.02, y: 10)

                MarketQuoteView()
                    .offset(x: geometry.size.width * 0.02, y: max(110, geometry.size.height - 62))

                if state.mode == .month {
                    MonthCalendarView(date: state.currentDate)
                        .frame(width: 396, height: calendarHeight, alignment: .top)
                        .scaleEffect(
                            DesktopLayout.calendarScale(availableWidth: geometry.size.width),
                            anchor: .top
                        )
                        .position(
                            x: DesktopLayout.calendarCenterX(availableWidth: geometry.size.width),
                            y: DesktopLayout.calendarTop + calendarHeight / 2
                        )
                        .transition(.opacity)
                } else {
                    Text(DashboardDates.writtenDay(state.currentDate))
                        .font(DesktopStyle.dateHeadingFont)
                        .foregroundStyle(DesktopStyle.ink)
                        .lineLimit(1)
                        .minimumScaleFactor(0.72)
                        .frame(width: min(760, geometry.size.width - 24), height: DesktopLayout.titleHeight, alignment: .top)
                        .position(
                            x: DesktopLayout.calendarCenterX(availableWidth: geometry.size.width),
                            y: DesktopLayout.calendarTop + 27
                        )
                        .accessibilityAddTraits(.isHeader)
                        .transition(.opacity)
                }
            }
            .frame(width: geometry.size.width, height: geometry.size.height)
        }
        .allowsHitTesting(false)
        .animation(.easeOut(duration: 0.12), value: state.mode)
    }

    private var calendarHeight: CGFloat {
        DesktopLayout.monthHeaderHeight
            + CGFloat(DashboardDates.monthGrid(containing: state.currentDate).weeks.count) * DesktopLayout.monthRowHeight
    }
}