Easy-to-manage touch screens
Free, open-source touch screens. Guided USB setup, a drag-and-drop editor and local control. Made for Home Assistant.
翻訳待ち
リポジトリ情報はまだ収集していません。
No updates detected yet. GitHub releases will appear here.
A street-level map for iPhone that reacts to weather, time of day and how you move. Custom SwiftUI Canvas renderer with OpenStreetMap data.
翻訳待ち
Loading the full README.
Read the full 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 |
This is the beginning of the README. Read the rest at the original. Read the full README ↗