ChatGPT can generate a workout plan in seconds. The problem is that the plan only knows what
was shared in that conversation. It does not automatically see completed workouts, recovery,
schedule changes, or the rest of someone’s training history. People have to keep explaining
themselves, and the plan becomes outdated as soon as life gets in the way.
We built the Coach in Whistle
to close that gap. With permission, it can use someone’s goals, schedule, past workouts,
recovery, sleep, vitals, weather and more. It can plan a week, create or adjust workouts,
review progress, and explain what the data means. Because the coach can create workout plans,
it stays focused every day and helps people reach their long term goals.
Coach opening placeholder showing the first conversational entry point.
Coach data analysis placeholder showing training context being reviewed.
When planning the next week, Coach can use someone’s goals, schedule, recent workouts,
recovery, and weather to create structured sessions. The result is an editable workout
schedule, not a list that has to be copied from a chat. Workouts sync directly to the Apple
Watch making it easy to follow through.
When life happens, people can ask their Coach to adapt the plan. A missed workout,
unexpected meeting, or change in recovery can be reflected by adjusting sessions while
keeping the wider goal in mind.
When reviewing past performances, Coach can look across completed workouts, compare, and
explain patterns in the data. Since the training history lives in Whistle, people do not
have to tell the AI about their performances, it will understand them naturally.
Long-term memory and continuity are core design principles. The coach keeps track of
training intent, including goals, preferences, and decisions from earlier conversations, so
people do not have to repeat themselves. It creates plans up to six months long, so every
day contributes to a clear goal.
The coach can be useful without waiting for someone to ask a question. Daily and
post-workout summaries provide the most important context when the app opens. We generate
them progressively throughout the day so they are always ready. The chips in the text
surface the key data first, letting people understand their progress at a glance without
reading the full summary.
Summary load animation placeholder showing a generated daily coaching summary.
Workout anchors placeholder showing current performance compared with previous work.
I worked on the Coach from the first sketches through release. I defined the experience,
designed the system, implemented the feature, and shipped it in Whistle. This meant working
across conversation design, prompts, memory, data presentation, notifications, and the
technical system connecting them.
The advantage of Coach is not that it can chat about fitness. ChatGPT can do that. The
difference is that Coach is connected to the living training plan: it can prepare next
week, adapt it when life happens, and explain a month of progress using the same underlying
context. This turns AI from a one-off answer into a tool that stays useful as training
evolves.
Weather
Your weather app is designed for everyday planning. It leads with temperature and rain.
Outdoor workouts need a different view: wind, UV and humidity can be as important. We built
Weather in Whistle to give
the metrics that matter during exercise more prominence.
The main challenge was not fitting a large amount of hourly data on screen, but creating the
right hierarchy and density. We designed a compact chart that brings all workout-relevant
conditions into one unified timeline.
Weather detail animation placeholder showing hourly conditions in the app.
Weather in workout detail placeholder showing forecast context next to a workout.
We then turn the data into short, workout-specific summaries such as “Perfect Conditions,”
“High Wind,” or “High UV.” These labels make the relationship between the forecast and the
planned activity clear without asking people to compare several measurements on their own.
Once the relevant metrics are in place, the Best Times feature answers the next question:
When should I go? It compares the hourly forecast with suitable conditions for the workout,
then ranks the best windows throughout the day. People can still explore the weather in
detail, but they no longer have to do all of the analysis themselves.
Chart scrubber placeholder showing interactive forecast exploration.
Best times placeholder showing ranked workout windows.
I owned Weather from the first ideas through release. I researched what athletes needed
before an outdoor workout, defined the information hierarchy, designed the system,
implemented the feature, and shipped it in Whistle.
Weather is not a smaller forecast inside a workout app. It is a forecast reorganized
around exercise. By translating metrics into workout-specific summaries and showing
athletes the best times to exercise, Whistle helps athletes understand both what matters
and when to go without making them analyze every number themselves.
Rewind
Finding something you misplaced often means retracing your steps and hoping the right detail
comes back. Rewind began with a simple question: What if you could remember anything you had
seen?
During START Hack, we built a prototype for Meta smart glasses that continuously captured
the wearer's view. An embedding model organized the footage by meaning, turning an
unstructured video stream into memories that could be searched.
Instead of scrolling through recordings, someone could ask, "Where did I leave my keys?"
and immediately retrieve the relevant moment. A live mode processes audio and video in real
time, deciding whether someone wanted to save what they were seeing or search for an earlier
memory.
The central design challenge was making something technically complex feel like recalling a
memory. Rewind combines background indexing with natural ways to interact, so asking,
pointing, and looking were enough to find or save a moment. This made the prototype feel
less like a recording archive and more like an extension of memory.
Capturing animation placeholder showing real-time memory capture.
Search animation placeholder showing a memory query resolving into a result.
I worked alongside Riccardo on the project. He built the backend, while I designed and built
the iOS app. Together, we won the hackathon's community award.
Community award win photo placeholder showing the hackathon result.
Rewind prototype demo placeholder showing the working smart glasses app.
Rewind shows how a wearable could turn passive recording into useful, searchable memory.
The same quality that makes the idea compelling also makes it uncomfortable: for the
system to remember everything, it has to capture everything. The prototype therefore
became more than a technical demonstration. It helped us explore where convenience ends
and surveillance begins, and why a product like this would need strict privacy boundaries
before it could responsibly exist.
Training Load
Training load helps athletes answer a practical question: How much can I train to keep
progressing without getting injured? A single workout only shows today's effort. Training
load shows how that effort builds over time and whether a plan stays within a safe range.
Most training load tools look backwards, they explain what an athlete has already done. But
this doesn’t help them prevent overreaching. Because Whistle contains planned workout
sessions, we saw an opportunity to show where training is heading, not only where it has
been.
The interface brings recent and projected load into one clear view. Athletes can see the
relationship between completed workouts and their upcoming plan without having to interpret
a long list of metrics. The goal was not to tell people whether a workout was right or
wrong, but to give them enough context to make a more informed decision.
Training load detail placeholder showing the main load interface.
Training load prediction chart placeholder showing the next seven days.
The chart visualizes this safe range: enough load to keep progressing, without increasing so
quickly that they risk injury. It gives athletes a clear target for building steadily.
For each planned workouts, Whistle intelligently predicts the distance, duration, calories,
and load. This shows how each workout may shape the week before it happened. It turns
workouts and training load from a report about the past into a practical tool for planning
what comes next.
Workout predictions placeholder showing forecasted strain from upcoming workouts.
Training load planning placeholder showing how predictions guide schedule changes.
My cofounder Clemens and I built Training Load together. Clemens started the project with
the initial research and backend implementation, I then took over for the final design.
Training Load turns a complex fitness metric into a forward-looking planning tool. It
helps athletes understand the effect of their plan before completing it. The result is not
a score that decides whether training is good or bad, but a clearer way to balance effort,
recovery, and consistency over time.
Insights
Health data is easy to collect but difficult to understand. Sleep stages, heart rate,
activity, and other measurements can say something useful, but only if people can see how
they connect. We built Insights to turn that data into a clear sleep overview.
Insights brings together sleep, recovery, overnight vitals, and regularity. A focussed set
of scores summarizes the data, while detail views explain where each result comes from and
how one can improve. The goal was not to add more numbers. It was to make the existing data
easier to act on. Every number is intentional and placed in context, so people can understand
what it means for them and whether it is high, low, or within their usual range.
Scores can simplify complex information, but they also create a risk. If a score does not
match how someone feels, or if its calculation is difficult to understand, it quickly loses
trust. We therefore designed every score around a clear behavioral goal and made its
components visible. We even added articles that explain the intention and design decisions
behind the scores.
Sleep detail animation placeholder showing the composite sleep score.
Recovery score animation placeholder showing rest in relation to exertion.
The Sleep Score combines five key metrics. The spider chart overview shows how each metric
contributes, while the detail view explains what happened and what someone could change the
following night. We gave consistency the most weight as we wanted to design a score that
promotes a stable circadian rhythm.
Regularity deserved its own score because it directly reflects that stability. We placed
more weight on wake-up time, as it is the part of a sleep schedule people can usually
influence most directly. Charts like the social jet lag one help them understand where any
irregularities are coming from.
Recovery connects rest with physical exertion. It gives athletes context for deciding when
to train harder and when to take it easier.
Vitals compares overnight signals with a personal baseline, helping people notice when
something is different from usual.
A long beta phase and many interviews shaped the final design. Some people told us Insights
was the first thing they checked in the morning. That feedback made us think carefully about
the responsibility we had. We made the language kinder, the scores more forgiving, and
refined Regularity several times so the feature is more forgiving but still motivating.
Regularity detail placeholder showing wake-time consistency.
Smart wake up placeholder showing rhythm-aware wake timing.
My cofounder Clemens and I built Insights together. We shaped the product direction through
research and interviews. Clemens built the backend for Vitals and Recovery, while I designed
and implemented the interface and developed the Sleep and Regularity scores. We started with
sketches on paper and built the final feature with Swift and SwiftUI.
Insights taught us that simplifying health data is not only about choosing the right chart
or score. When people check a feature first thing in the morning, its language can shape
how they feel about the day ahead. Designing scores is more about how they feel and promote
behavior and less about how accurate they are.
FeatherKit
FeatherKit is the SwiftUI design system behind our apps. We built it to make the right
design decisions easy, keep familiar interactions consistent, and still leave enough room
for each product to have its own character. Instead of replacing SwiftUI, FeatherKit
extends the framework’s existing ideas.
The foundation is a set of semantic colors, type styles, sizes, and surfaces. We use system
fonts so text continues to support Dynamic Type, but give each role a clear meaning: title,
body, caption, or numeric value. Instead of telling a component exactly which color to use,
we describe its purpose and context.
fkTint coordinates the accent color across native SwiftUI controls and
FeatherKit components. The color context tells surfaces whether they are shown at the base
level, on an elevated sheet, inside an alert, or over a vibrant background. Components
understand the context they are presented in and are able to adjust their presentation.
Surface style placeholder showing contextual color and surface treatment.
FeatherKit tint placeholder showing accent color coordination across components.
We separate a component’s purpose from its presentation. FKPicker, for example,
always represents a selection. The same options can appear as a simple list, descriptive
cards, a segmented control, or circles for colors and icons. The logic is always the same;
only the style changes.
FKPicker("Theme", selection: $theme) {
ForEach(themes) { theme in
Text(theme.name)
.fkPickerTag(theme)
}
}
.fkPickerStyle(.card) // also .list, .segmented or .dot
This gives us one predictable API without forcing every use case into the same visual shape.
Style protocols also let us add a new presentation without creating another picker type or
moving selection state into a screen-specific component. We use the same pattern for
buttons, sliders, text inputs, gauges, labels, groups, list items and more.
Picker placeholder showing one logic model across multiple visual treatments.
Slider placeholder showing a reusable control style.
The components also understand how they are composed. A list item identifies itself as a
list, while a group passes its nesting level, padding, and corner radius to everything inside
it. Nested groups automatically calculate a smaller concentric corner radius and alternate
their surface color. The screen does not need to coordinate any of this, components
understand the context they are presented in and adapt to it.
This is an important part of the system: components should not only look correct in
isolation, they should remain correct when combined. Passing semantic context through the
hierarchy lets FeatherKit handle spacing, surfaces, dividers, and corner radii at the
component boundary instead of setting them on every screen.
FeatherKitShaders is a separate, iOS-only extension for more expressive moments. It contains
reusable Metal effects such as ripples, holographic highlights, sparkles and more that are
used across our apps.
Effects are still part of the system, not decoration without rules. Aurora, for example,
becomes a still frame when Reduce Motion is enabled, the app is inactive, or Low Power Mode
is active. Expressive design should respond to the same accessibility and performance
constraints as every other component.
Some interface elements cannot be owned by a single screen. Sheets, alerts, loading states,
and banners need to appear above the current content and behave consistently around safe
areas, the keyboard, and dismissal. We coordinate them through one observable navigation
layer that is installed at the root and available through the environment.
This lets a feature request a presentation without knowing where that presentation has to
live in the view hierarchy. It also gives every app the same sheet stacking, banner motion,
haptics, keyboard avoidance, and dismissal behavior.
FeatherKit navigation sheet placeholder showing coordinated modal presentation.
FeatherKit banner placeholder showing a global transient message.
FeatherKit works because it treats a design system as shared behavior, not only shared
appearance, creating a coherent design language. The result is a system that feels native
to SwiftUI while giving every product a consistent foundation.
Peaks
Your body follows a predictable rhythm throughout the day. It influences when you feel
energized, when your energy dips, and when you are ready to sleep. This inner clock is
called your circadian rhythm.
People feel these energy changes, but the rhythm thats drives them stays hidden. Many Health
apps explain what has happened, such as how long you slept or how active you were. Because
the circadian rhythm is personal and predictable throughout the day, we saw an opportunity
to turn it into an app that reveals this hidden biology.
Peaks estimates your rhythm using sleep and activity data from Apple Health. Our model is
built on circadian research and shows your expected energy peaks and dips in a simple
timeline (we built this before AI). While people are expected to be productive all day,
Peaks helps them understand their natural energy peaks and dips to plan with it.
New rhythm design placeholder showing the main circadian visualization.
Optimal times placeholder showing ideal windows for focus, exercise, and rest.
The rhythm only shifts gradually, but being aware of it matters throughout every day. That
is why Peaks extends beyond the main app. Widgets, notifications, and Smart Stack
integration show your rhythm when it is useful, without requiring you to open the app.
Energy dips are not treated as unproductive failures. They are a natural part of the day.
To explain the agency people have in shaping their daily energy, the Influences feature
shows how exercise, caffeine, or melatonin shift the rhythm. With caffeine, for example,
Peaks shows how drinking coffee too late pushes your bedtime later. Optimal Times highlight
useful windows for focus, exercise, and winding down. For example, it suggests when to stop
drinking caffeine to avoid delaying your bedtime.
Widget presentations placeholder showing iOS and watchOS rhythm surfaces.
Smart Stack placeholder showing rhythm guidance surfaced at the right moment.
My cofounder Clemens and I built Peaks together. We interviewed people, set the product
direction, and shaped every part of the experience together. Clemens built the backend for
the rhythm calculations, while I implemented the interface. We used Figma for design and
Swift, SwiftUI, and WidgetKit to build the app.
Peaks turns complex health data into a calm guide for the day. Instead of judging every
energy dip, it helps people see their rhythm and plan with it. At the time of writing,
Peaks has more than 100,000 downloads and holds a 4.7-star average across more than 1,500
ratings. For us, that response shows that people value a calmer way to understand and plan
around their energy.
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer vitae
arcu sed risus facilisis cursus. Mauris dignissim, nibh at posuere
malesuada, mi erat faucibus massa, vitae vulputate libero neque in
erat. Sed vitae tortor at sapien tempor gravida. Donec ac neque eu
tortor fermentum gravida.
Praesent tincidunt ligula nec mi consequat, at dictum lorem porta.
Nullam a tellus in turpis suscipit interdum. Curabitur volutpat, sem
in tristique tincidunt, nunc urna placerat lectus, vitae dapibus risus
ipsum sit amet nibh. Suspendisse potenti.
Vivamus gravida velit ut lacus ullamcorper, non commodo nisi luctus.
Etiam sit amet turpis vel ligula lacinia porttitor. Aliquam erat
volutpat. Morbi tempor massa at eros gravida, nec sagittis justo
finibus. Donec pretium, justo non tristique ultricies, risus erat
sagittis lacus, at lacinia mi arcu vel augue.
Imprint
Disclosure under § 25 MedienG.
Media owner and responsible for the content
Name
Florian Schulte
Address
Marxergasse 19/17 1030 Wien Austria
Website purpose
Purpose
Private, non-commercial presentation of selected product design, software and
photography work by Florian Schulte.
This is a hobby website. It is not operated by a company and has no VAT identification or company register number.
Copyright
Unless stated otherwise, the texts, photographs, graphics and interface designs on this
website are by Florian Schulte. Please ask before reproducing or reusing them beyond what
is permitted by law.
Privacy
Last updated 22 July 2026.
Controller
Florian Schulte
Marxergasse 19/17
1030 Wien
Austria
You can contact me about privacy matters by post at this address.
Cloudflare hosting and delivery
This website is hosted and delivered through Cloudflare, Inc., 101 Townsend Street, San
Francisco, California 94107, USA. The site runs on Cloudflare Workers. Photography files
and their public metadata are stored in Cloudflare R2 and delivered through the Worker.
When you request a page, image or other file, Cloudflare necessarily processes technical
request data. This can include your IP address, the requested address, date and time,
referrer, browser and operating-system information, HTTP headers, and routing or security
information. Cloudflare may cache site files at a data centre near you to deliver them more
quickly.
The legal basis is Article 6(1)(f) GDPR. My legitimate interests are making the website
available reliably, protecting it against abuse and attacks, and diagnosing technical
problems. Cloudflare acts as my processor for this processing.
Cloudflare logs and retention
Cloudflare Workers Logs are enabled. Requests handled by the Worker, particularly the
photography catalogue and media routes, can create invocation and error logs containing
technical request data. Cloudflare publishes a maximum retention period of seven days;
retention on the Workers Free plan is three days. I use these logs only for security and
troubleshooting.
Cloudflare also enables Network Error Logging. If a supported browser cannot connect
successfully, it may send Cloudflare a technical failure report. Cloudflare states that it
removes the client IP address immediately after processing the report and does not retain
personally identifiable information in this reporting pipeline.
Cookies, analytics and fonts
The website does not set its own cookies, use local or session storage, run visitor
analytics, show advertising, or create visitor profiles. Cloudflare Web Analytics, Zaraz
and Turnstile are not enabled. Fonts are loaded locally or from your device, so opening the
website does not contact an external font provider.
A normal request does not set a Cloudflare cookie. If Cloudflare has to show a security
challenge to protect the website, it may set a technically necessary security cookie. Such
storage is used only for the requested service and security under § 165(3) TKG 2021, not
for advertising or cross-site tracking.
International data transfers
Cloudflare operates a global network and may process data outside the European Economic
Area, including in the United States. Cloudflare describes the safeguards it uses for these
transfers, including the EU–US Data Privacy Framework and the European Commission’s
Standard Contractual Clauses, in its
Data Processing Addendum.
Further details are available in the
Cloudflare Privacy Policy.
External links
Links to other websites do not send data to those providers until you follow the link.
Their operators process the resulting request under their own privacy terms.
Your rights
Subject to the legal requirements, you can request access, correction, deletion,
restriction and portability of your personal data. You can object to processing based on
legitimate interests. Where processing relies on consent, you can withdraw it for the
future at any time.