尚未收集仓库信息。
尚未检测到更新。GitHub 发布版本后会显示在这里。
A street-level map for iPhone that reacts to weather, time of day and how you move. Custom SwiftUI Canvas renderer with OpenStreetMap data.
翻译准备中
正在加载完整 README。
查看完整 README ↗the world, beautifully alive
Drift is an iOS map app that treats the map as something alive rather than a utility. Instead of a flat, static map, it shows the world from street level over a full-screen atmospheric gradient that shifts with the time of day, the weather, and your movement. Real streets and buildings from OpenStreetMap are drawn as soft, low-opacity shapes, so the gradient does most of the emotional work.
Case study: How Drift is designed and built on my portfolio, covering the architecture, code decisions and trade-offs.
It's built to feel like the opposite of Google Maps: motion without urgency and no pressure to get anywhere.
🤖 My first project built entirely by prompting AI. See Built with AI below.
🚧 Work in progress. The theme engine, sensors, weather, and street-level renderer are working. Onboarding, settings, and the floating controls are still stubs. See Status.
Drift is the first project I've built entirely through AI prompting. In my other apps (Launch Control, Axis) I wrote the code myself and used AI for specific tasks like tests, debugging, and UI tweaks. With Drift I wanted to see how far I could get by directing instead of typing.
What I did
claude.md, a living design spec that gives Claude the full project context at the start of every sessionWhat the AI did
What I took away is that prompting well is mostly product and engineering judgment: being precise about what you want, catching where the AI's output drifts from your vision, and knowing when to change the plan.
The screen's look comes from one function, ThemeEngine.theme(weather:timeOfDay:), which turns two inputs into a gradient:
| Priority | Input | Source |
|---|---|---|
| 1 | Weather: rain, snow, storm, and fog override the time of day | Open-Meteo (free, no API key) |
| 2 | Time of day: sunrise, midday, sunset, night | SunCalculator, offline using the sunrise equation |
| — | Movement: still, walking, biking | CoreMotion activity data. Drives animation only, never color |
There are 8 hand-tuned gradients in all. One design rule holds for every theme: it never goes fully dark. Even at night or in a storm, the bottom of the gradient fades to a pale tone, so the mood is atmospheric rather than gloomy. Snow is the one theme that switches the text to a dark color.
MapModel keeps the theme current for four reasons: a new GPS fix, a once-a-minute clock tick (the sun keeps moving even when you don't), a finished weather fetch, and a weather refresh every 15 minutes.
Drift doesn't use MapKit for rendering. WorldView draws everything itself in a SwiftUI Canvas, from a third-person camera placed a few meters behind and above you, looking down the street you're facing.
WorldMotion estimates your position along your velocity between fixes and eases toward each new one, so the world glides instead of jumping.RoadNetworkService and BuildingNetworkService fetch real road geometry, street names, and building footprints from OpenStreetMap through the free Overpass API. Each fetch covers twice the area being drawn, and the services only fetch again once you've moved outside it, so they stay well within a shared free API's limits. The placeholder generators are still around for offline SwiftUI previews.
| Area | State |
|---|---|
| Theme engine + 8 gradients | ✅ |
| Offline sunrise/sunset calculation | ✅ |
| Live weather (Open-Meteo) | ✅ |
| Location, compass heading, motion activity | ✅ |
Street-level 3D renderer (WorldView) | ✅ |
| Real OSM roads + buildings (Overpass) | ✅ |
| User pulse dot (speed-aware) | ✅ |
| Onboarding (welcome, theme mode, contextual permissions) | 🔲 stubbed |
| Settings | 🔲 stubbed |
| Floating controls (weather/time pill, speed pill, place search) | 🔲 stubbed |
| Fading movement trail | 🔲 stubbed |
Preferences (@AppStorage) | 🔲 stubbed |
以上为 README 的开头部分。其余内容请阅读原文。 查看完整 README ↗