Clico — An AI Coworker for macOS

From a bold homepage concept to an interaction model, a character system, and code merged into production.

Product Interaction Brand / Character Motion Frontend 2026.03 – 2026.08
Muted · Looping

Clico concept film: I handled the script, storyboards, generation, voiceover, and editing. After scripting, production took just half a working day.

About the project

Context and constraints

Clico is an AI coworker that lives on the macOS desktop. A shape-shifting character stays on screen, the notch acts as its second body, and a full client window appears only for deeper work. Over six months, the product changed names twice (Myco → Invoko → Clico) and evolved from an assistant inside a window into a coworker on the desktop. There was no established pattern to copy. The team was small, one person owned design and frontend work, and every ambitious idea had to pass a practical test: would users welcome it?

My role and process

As the only full-time designer, I owned product architecture, interaction design, brand and character design, motion, and most of the frontend implementation. My workflow was consistent: explore and finalize in Claude Design, implement with Claude Code, review in the Lab tools I built, verify in the native app, then merge. Over six months, 40+ pull requests shipped to production, including 17 I merged myself.

What we did

Nine chapters
1 The first proposal: putting the character center stage 2An invocation model: trigger × surface × level 3Four character generations, one state contract 4From interaction patterns to pixel-level specifications 5Building my own review tools: three Labs 6Six onboarding iterations and an AI animation pipeline 7The brand layer: design system, logo, and concept film 8Memory map: a custom renderer, integrated into the client 9Three system-level changes, all merged into production
Three key trade-offs

Inside the window or on the desktop? The first proposal placed the character at the center of the client. It was too radical, so I moved the character outside the window. The client kept a familiar sidebar; the character became a persistent desktop companion. Familiar structure inside, room to experiment outside.

A face or a geometric form? The cloud had eyes and expressions, but an anthropomorphic character limited the range of states it could communicate and risked looking like other products. We chose Contour, a layered geometric form that expresses state through motion rather than facial features.

Rive or Lottie? The cloud used Rive. Before switching Contour to Lottie, I built a JSON feasibility prototype to verify that it could support all ten states and their transitions.

B1

The first proposal: center stage, rejected, then given a new home

In March, I was already designing the character as a coworker rather than an assistant icon. The proposal never shipped, but its central idea survived in a different form.

My first client homepage in March 2026 put the character at the center. An employee card showed its name, role, and employer. Two dock-style icons formed the bottom navigation, and sticky notes held tasks. The interface changed with the character's state, making it clear whether it was organizing, executing, or writing code. The proposal departed too far from familiar desktop apps, so we shipped a conventional sidebar layout, which I also designed. Two months later, the original idea found a compromise: the window stayed familiar, while the character moved onto the desktop and gained the notch as a second body. The ambitious part survived outside the window.

Mar 2026 · Unreleased concept
Homepage concept · Employee card
Employee card
Homepage concept · Integration map
Integration map
Homepage concept · Tasks and sticky notes
Tasks and sticky notes

The first homepage in March: a central character, dock-style navigation, and sticky-note modules that respond to its state.

Muted · Looping

May: the same idea finds a new home. The character lives on the desktop and celebrates beside the window when a task is complete.

Tasks were divided into four mutually exclusive categories: text generation, image and video generation, complete tasks, and other work. Each had its own character pose.

B2

Invocation: trigger × surface × level, with one active character surface at a time

I defined the product's interaction model before drawing the interface: when it appears, where it appears, and what it can do.

Before designing screens, I defined Clico's invocation model: three triggers (poke the character, double-tap ⌥, or appear proactively), two surfaces (desktop character or notch), and three levels (full panel, expanded panel, or a single-intent reminder). A three-layer action system sits on top: persistent, invoked, and proactive. The notch and desktop character share this model, with only one visible at a time. The character can be tucked into the notch or pulled back onto the desktop. Every later interface, from the four chapters of the proactive concept to each onboarding iteration, follows this model.

Invocation map: trigger × surface × panel level

Invocation map: trigger × surface × panel level.

Layer
Trigger
Surface
Available actions
Persistent
No trigger required
Desktop character / notch status bar
Three fixed shortcuts
Invoked
Poke character · Double-tap ⌥ · Click
Full / expanded panel
Intent recognition and free-form input
Proactive
Context changes
Single-intent bubble
Accept / Later; dismisses automatically after 10 seconds
Loading Design Lab…

This is the working Design Lab I used to explore the product. The character and notch behaviors, along with different levels of proactivity, are all adjustable. Try the controls.

B3

Four character generations, one state contract

Octopus, cloud, four geometric directions, then Contour. The character changed four times, but the state names stayed the same, allowing the widget, notch, and onboarding to change appearance without changing their logic.

The character is both the product's face and its state indicator. We started with an octopus in March, then a cloud with eyes in May, with 15 Rive states in the client. In July, I explored four geometric directions and moved away from anthropomorphism. In August, we finalized Contour and integrated it through Lottie. I also investigated a meme-inspired direction in depth. We could learn from the visual style, but existing characters had owners and would need an IP review before commercial use, so we set that direction aside. All four generations share one state contract: idle, listening, thinking, outputting, done…The names never changed. That is what allowed us to change the appearance without breaking the logic. Contour's visual rules became a checkable specification, with numbers for everything from cross-section proportions to twist angles.

First generation: the March octopus
Octopus
Second generation: the cloud and its states
Cloud
Third generation: four geometric base forms
Four geometric directions
Final fourth generation: Contour
Selected direction
Contour

Four generations. Contour was the final choice: state expressed through shape changes rather than facial features.

Cover of the meme-inspired character research proposalTen emotions mapped to meme expressions (detail)Rage Comics reference collection
Reference Reference images are third-party work

An abandoned direction: meme-inspired visuals. The style offered lessons, but the characters required an IP review before commercial use.

LIVE · LOTTIE
Playing: Idle loop, with a transition before each state change
STATES

Select a state to explore the actual Lottie assets used in the Clico client.

Clico character design document: open all three pages in the high-resolution viewer
View design document
Contour state 0 reference card
01
Contour state 1 reference card
02
Contour state 2 reference card
03
Contour state 3 reference card
04
Contour state 4 reference card
05
Contour state 5 reference card
06
Contour state 6 reference card
07
Contour state 7 reference card
08
Contour state 8 reference card
09
Contour state 9 reference card
10
Scroll sideways · Click to enlarge

Ten states, one handbook: shape, timing, and purpose for each state.

B4

From patterns to pixels: handing off numbers, not impressions

I translate visual judgment into parameters, and trace AI-generated implementation bugs to their root cause.

The widget handoff avoids vague requests like “bigger” or “softer.” Ring radius: 82 → 132 pt. Angular spacing: 30° → 22°. Contextual action cache: 60 seconds. Icons: SF Symbols. Every decision can go directly into code. I compare the design and the native implementation side by side, describing differences numerically. When generated code is wrong, I investigate: a source change that never appeared turned out to have a duplicate embedded in Swift; an inconsistent button was tied to the wrong typography token.

DesignAction-ring geometry from the handoff: bubbles appear on cloud hover (July 16 design)
In the appThe live action ring: Reply and other action bubbles beside the cloud

Left: the handoff. Right: the native implementation. Differences expressed in numbers.

Parameter
Value
Ring radius
82 → 132 pt
Angular spacing
30° → 22°
Contextual action cache
60 s
Icons
SF Symbols, Regular weight
Contour size channel
200 pt(other characters: 115 pt)
B5

Building my own review tools: IP Lab, IP Lottie Lab, and Onboarding Lab

I review design in the actual app. To make that practical, I built three testing environments inside the client.

The client's Debug menu contains three Labs I built. IP Lab switches characters and states. IP Lottie Lab plays Contour's ten state loops and nine transitions, with light, dark, and desktop backgrounds, size controls, and reverse exit playback. Onboarding Lab replays the first-launch experience. Those tools eventually became product features: In May, switching characters was a developer-only dropdown. By August, it had become two animated preview cards in Settings: Contour and Cloud. Selection took effect immediately and persisted across restarts. It then moved into onboarding as step zero: choose a coworker for your desktop. I also used the team's Notch Lab sandbox to refine notch states and action semantics through six rounds beginning in April.

IP Lottie Lab: ten state buttons, transition toggle, three backgrounds, size slider, and inspector

IP Lottie Lab: ten states, two transition segments, three backgrounds, size adjustment, and reverse exit playback.

Character selection in Settings: animated Contour and Cloud cards with instant switching

From developer control to user feature: character selection cards with a five-second preview loop.

Default Cloud · Ghost · FreeHand Cloud · FreeHand Cube · Glass Cube · MrBean · Contour…  Select to apply. No Save button. Persists across restarts.

Muted · Looping

IP Lottie Lab in action: selecting a state plays its transition, then its loop.

B6

Six onboarding iterations and an AI-powered animation pipeline

I led six iterations of first-launch onboarding and submitted the code for three. One iteration produced a reusable AI animation workflow; another produced 435 lines of SwiftUI that respect reduced-motion preferences.

In April, onboarding was three tutorial videos. By late May, it had become a three-step flow with an AI-generated 3D animation for each step. I built a four-stage pipeline from narrative and storyboards to keyframes and video. It powered the animations that followed. In early June, I built Homing Path, a glowing arc from the character to the notch that teaches users where to tuck it away. The starting point is calculated from wherever the character has been dragged. Bézier control points update with the start and end positions, producing a smooth arc from anywhere on the desktop. That makes the animation feel aware of the character's location. With reduced motion enabled, it becomes a static glowing path. The later “Poke me!” cue, July's interactive prototype, and August's character-selection step followed the same direction: turn instruction into product behavior and lead users into the real homepage.

Apr · Iteration 1Iteration 1: frames from tutorials on reminders, form filling, and microphone permissions
May · Iteration 2Three steps with AI-generated 3D animation: the May 26 redesign board
Jun · Iteration 3Homing Path: a glowing arc connecting the notch and character
Jun · Iteration 4“Poke me!” cue in the native app
Jul · Iteration 5Fully interactive onboarding prototype
Aug · Iteration 6Step zero: Adopt your character, in the native app

I led all six onboarding iterations and submitted the implementation for iterations 3, 4, and 6.

May 24 production board: one style-locked prompt and a column of candidate frames per shot

May 24 workflow: a style-locked prompt, candidate frames, and one selected keyframe for each shot.

Three Homing Path designs showing a glowing arc across the desktop toward the notch

Homing Path design. The arc starts at the character's live position; this shows one possible placement.

Timing
Value
Delay
0.35 s
Draw
1.5 s
Hold
1.2 s
Fade out
0.6 s
Drag lock
2.5 s
Reduce Motion
→ Static path
B7

The brand layer: three design systems, logo v9, and four concept films

The design system evolved alongside the code. The logo moved from seven AI proposals to a hand-drawn double-C vector. Four concept films used the same animation pipeline. I handled scripting, storyboarding, generation, voiceover, and editing for a 79-second final film. After scripting, execution took just half a working day.

The design system grew out of the code. Instead of starting with a moodboard, I extracted five visual principles from the client's actual theme implementation and built the rules around them.

The logo took four rounds: seven AI proposals, three directions I combined from them, and finally a hand-drawn double C traced into vectors.

The film scaled up the animation pipeline. An 18-shot script became an 11-shot, 60% cut when a two-week schedule was suddenly compressed into a next-day release. Each shot had a moodboard, camera direction, generation instructions, narration, and editing notes. I brought those fields together in a small web tool I built, the Script Screening Room, where I reviewed each shot. AI-generated footage and composited UI were combined with 11 voiceover segments into a subtitled 8K film.

Muted · Looping
Storyboard card: Chinese script and English generation prompt for one shotKeyframe for the same shot: Gmail, shortcut keys, and the cloud character

One shot through three stages: storyboard card → keyframe → final film.

Script Screening Room: shot navigation, keyframe preview, and six script fields in a dark web interface

I built the Script Screening Room for this film: shot navigation at the top, the current keyframe in the center, and six fields below (visual, camera, direction, on-screen text, voiceover, and edit notes). Writing, review, and editing decisions happened on one page. This is where I cut the script down shot by shot.

Script → six-field storyboard → generation prompts → keyframes → voiceover → film and subtitles

B8

Memory map: from moodboard to custom renderer to native client

Six days, four parallel AI sessions, four pull requests. I gave memory a spatial metaphor, wrote the renderer, and defined a synchronization workflow to ship it in the client.

The Memory page needed to invite people back. I defined the metaphor first: the user is the central star, and each memory category is an orbiting planet. Those category planets are what shipped. I then wrote a pseudo-3D renderer in Canvas 2D: perspective projection, depth sorting, procedural planet surfaces, and particle rings, in more than 2,000 lines running inside a WebView. Visual review was numerical: orbit thickness changes from 2 px at 0° to 6 px at 180°, four-point stars have four rays, planets behind the central body must be occluded, and light always comes from the parent star.

Because the client loads this script as an embedded string, I defined a synchronization workflow: refine on the web, mirror into Swift, type-check, then verify in Xcode. I assigned four AI sessions: one for synchronization and Git, two for web implementation, and one for visual design. Six days later, the memory map was merged into main.

Space moodboard: black holes, star trails, vintage star maps, and Milky Way photography

Meaning before pixels: the space moodboard I established before writing the renderer.

I built the original renderer at Clico. This version was recreated for my portfolio.

Drag, scroll, or select a planet.

Muted · Looping

The Memory map in the native app.

ReferenceThird-party reference: a ringed planet and vertical beams of light
In the appMemory in the native client: a central black hole and orbiting memory planets
Four-step synchronization workflow
Four-session responsibilities
Edit source → Mirror into Swift → Type-check → Verify in Xcode
One session for synchronization and Git · Two for web implementation · One for visuals

The Galaxy login screen, built in SwiftUI and SceneKit with a handoff package, applies the same visual language elsewhere.

B9

Three system-level changes, all merged into production

This work went beyond proposals. It shipped in three major production releases.

The timeline below shows those three changes. Over six months: 40+ pull requests, 110+ commits, and more than 26,000 added lines of code. I merged 17 pull requests myself. The team treated design-to-code as a regular delivery path, not an experimental branch.

My most detailed handoff was the Daily Rewind design-to-engineering specification. Beyond three card variants, I defined ten modules, one input schema, and a complete behavior contract for the LLM. Client code owns layout and statistics. The model fills only six text fields in strict JSON. Facts must come from the input. Output is schema-validated, retried once on failure, then replaced with template copy if necessary. Results are cached by content fingerprint. Design defines what the model says and how failure is handled, as well as what the interface looks like.

05.20 Three pull requests merged in one day
Brand color system · Chat-style homepage · Cloud character system
Mid–late June
Playbook cards · Memory map · Native Galaxy login
August
Soft Emboss v3.0 refresh (120+ files) · Contour Lottie pipeline (260 files) · Onboarding v2.2
43
PR
116
Commits
+26.7k
Lines added
17
Merged by me
11
Claude Design projects
3
Custom Labs
Finalize in Claude Design
→
Implement with Claude Code
→
Review in Labs and the native app
How I work →
Daily Rewind specification: overview, three card baselines, data schema, and LLM prompt templates
Scroll vertically · Click to enlarge

The Daily Rewind handoff: card baselines, data structures, and an LLM behavior contract, ready for engineering to implement.

LLM behavior contract
Daily Rewind
Responsibilities: code handles calculations and layout; the model writes copy
Strict JSON output, six text fields, and per-field length limits
Use only input facts; omit missing information rather than inventing it
Users can generate a report at any time: before 18:00, use present tense and discuss the rest of today; use wrap-up language only in the evening
On schema failure, retry once with the errors; then fall back to template copy
Cache by date and content fingerprint

Another foundational change in the same period: separating typography tokens.

Thanks for stopping by

Gmail fangyuan.uxdesigner@gmail.com
WeChat 18610831997
Phone 18610831997
Next case study: OKEight →