ChatHarbor
A place to chat, compare answers, and work through ideas.
I built a native Mac app for comparing model responses and working through ideas without jumping between separate tools.
Why I built it this way
I wanted ChatHarbor to feel at home on a Mac and give people a choice of cloud or local models. Behind the scenes, one shared interface connects them, so switching models doesn’t mean learning a different app.
Under the hood: Swift
Curious about the code? This is the interface the model providers share.
func chat(
model: String,
messages: [ChatMessage],
parameters: ChatParameters,
onToken: @escaping (String) -> Void
) async throws -> ChatResult
Read the provider interface →
