Skip to content
homeworkplayaboutcontact
resume
homeworkplayaboutcontact

This is a footer (ew stinky...)
work about contact flowerboxes linkedin x
josue:~$ Josué Avalos Jiménez · Designer · Prev. @ Nintendo · Open to work © 2026 · built from scratch · press

This is a footer (ew stinky...)
work about contact flowerboxes
@1kind.px @josueava.los linkedin x
Josué Avalos Jiménez · Designer · Prev. @ Nintendo · Open to work © 2026 · built from scratch
The Site Map graph assembling itself, in the chrome it ships in

Novus Motion Lab

Company Pendo

Year 2026

Type
Case StudyBrandingDesign SystemsGraphic DesignPrototype
skip to the motion lab how AI was used here

Overview

A self-set challenge. Can a whole family of marks come from one geometric grammar, and can each mark's animation explain how it is built instead of decorating it?

Novus is Pendo's product agent. It scans a codebase, builds a product map out of what it finds, and puts analytics live through a pull request. Those three moves are also the three steps a new user is walked through on the way in, so the set had somewhere real to land: the marks were drawn against that sequence, and the three that shipped sit on those steps.

It started in Figma. I drew the logo there and extracted the SVG, then built a first reference, a line and a few boxes, for Cursor to work from as the generator took shape.

Blocks, 45 degree diagonals, a fixed grid. Twelve marks. Grid, Cross, Stack, Chevron, Ladder, Zigzag, Arrow, Triangle, Frame, Bolt, Spark, and the Novus logo itself, each captioned with the rule that produces it.

139

commits on a motion system nobody asked for, started as a self-set challenge and finished as product work

Designer and creative technologist, solo and self-initiated, July 2026. Built for Novus, an emerging Pendo product with its own visual identity, deliberately distinct from the main design system.

style 1 · currentColor · follows the theme

  • Auto-detect pages and featuresNovus scans your codebase and maps every page, feature and event, with no manual tagging.
  • AI-powered product intelligenceSmart groupings, naming and product areas generated from how your code actually works.
  • Install via PR, go live in minutesReview a single config change, merge it, and your analytics are live. No SDK wiring.
Repositories
  • pendo-io/frontend2,481 filesscanning
  • pendo-io/nova906 filesscanning
  • pendo-io/adopt-ui1,204 filesscanned
Scanning repositoriesIndexing 4,591 files
Mapping pages and features
Building your product map
The onboarding panel and the loaders, in the chrome they ship in. Both sides are the committed components, so flipping the switch swaps real code rather than two screenshots. The loaders are the pieces the reviewer wanted swapped first, shown at the sizes they actually run at

01 · Constrain hard, get coherence free

One grammar generates the whole set. That is the entire trick. Every mark is blocks on a grid with diagonals locked to 45 degrees, so twelve marks made months apart still look like siblings without anyone maintaining a style guide.

Motion follows the same logic. A lattice snaps together. Arms chase each other around a centre. Lightning strikes rather than fades. Each animation is the construction of the mark performed rather than an effect applied to a finished thing.

The two module sizes are 24 and 12, a real 2:1 in the generator rather than a rounded description of one, and every mark reads that ratio at a glance because nothing in the system is allowed a third size. Every animated mark also shares one rate: a single --dur token set once at the root, currently 2.5 seconds, that every keyframe reads its timing from rather than carrying its own. Slow the lab down and the whole set slows together, because nothing in it owns a duration of its own.

2×2 lattice snaps in
hub first, then four arms chase out
a 45° Z, doubled at the kink

Those three, in order, are the three sentences above.

02 · The linter caught me

The 45 degree rule was the constraint holding the whole set together, and the tier data had quietly drifted to about 41 degrees.

I did not notice by eye. A linter I had written to enforce the rule noticed.

The rule had existed as a written principle the whole time, and the drift happened anyway. It only became enforceable when it became a lint failure.

two chevrons, arms sweep in at 45°
two rails, then the rungs between them
one W-path, every segment at 45°
apex first, base closes it
an X radiating from a doubled hub
the real mark: blocks pop, diagonal draws
Assembly: each mark builds itself the way its rule says. Running the lab's generators, so the rule under each one is the rule that drew it. Point at any of them to watch it build again

03 · Build the generator, not the outputs

The piece I would actually show is the builder. Constrained generation behind a gate I called Laws, so a teammate could produce a new on-brand mark without me and without breaking the system.

That changes what the deliverable actually is: the machinery that makes a correct thirteenth mark, whenever the brand needs one.

The gate is eight Laws and seven Guidelines, run against a mark's raw SVG before it can call itself Style 1. A Law is an invariant: square modules, sharp corners, two sizes at 2:1, connectors locked to 0, 45, or 90 degrees, every drawn line paired with a faint track, colour riding a token instead of a hardcoded hex, only the sanctioned shapes, no curves anywhere. Fail one and the export is blocked, no matter how good the mark looks. A Guideline is closer to taste: motion on the shared rate, one dominant module, a legible node count, a single pink accent, connectors kept short, modules kept clear of each other, and one rule that a box must land after the line feeding it. Guidelines warn instead of blocking, because whether a mark feels right is a call the system can flag but should not make alone.

That last guideline has a date on it. A module was landing before the connector that feeds it, so for a moment a solid box sat beside a half drawn line and the mark looked broken rather than built. I caught that one by eye, at expanded size, where boxes arrived at .5 and .6 and .7 against lines that did not finish until .68, .78 and .88.

The lag was in every size. It only became visible at large ones, because the gap is a fixed slice of time and the distance it covers grows with the mark. That is the kind of defect that ships.

So I wrote it down as a check, and the check found the same timing sitting in the canonical onboarding mark, where it had been shipping and where nobody had flagged it. I saw this one myself first, then the check confirmed it was everywhere else too — the opposite order from the 45 degree rule, which I only ever caught because it was written down.

It has since drifted the other way. The draw constant was calibrated against an earlier, slower assemble, so the check now asks for a little more margin than the animation needs, and a very even cascade can trip a warning it has not earned.

I also formalised responsive tiers, condensed through regular through expanded, and later reframed them as two axes, size and density, which is the version that actually held up.

04 · Arguing for the option I liked less

The style debate is the part worth telling.

Two candidate directions. Style 1 was the restrained one. Style 2 was more expressive, and I preferred Style 2. So did one of the senior designers.

Style 1, the restrained one. What shipped
Style 2, the expressive one. What I wanted

I argued for Style 1 as the production path anyway, because Style 2 was too distracting in flow. A mark that appears next to text someone is reading has a different job from a mark on a landing page, and my preference was formed looking at it in isolation.

I let the deployed lab and the builder carry the argument rather than my opinion, which meant the people disagreeing with me could go and check.

Calling it two directions is the tidy version. There were four.

Style 3 was an LED treatment, the mark resolving on a dot matrix. It had the best case for scale of any of them, because a grid of lights is modular by construction and would have survived any size I threw at it. It was also the hardest to read. At the sizes these actually appear the dots stop being a mark and start being a texture, and I could not make that go away.

Style 3, running its real code. Nothing moves and nothing is drawn: the lights change, and the pink row is the one being read

Style 4 scrambled and resolved, characters landing one by one until the word appeared. People liked that one, and it fits the brand better than it has any right to. It is also the one I would not put in a product. A mark that looks like it is decrypting something reads as is my computer being hacked, not the app is thinking. That is a fine feeling on a marketing page and the wrong one next to somebody's data, so it is parked rather than dead.

SCANNING
Style 4, running its real code. The scramble is random on every load, so this is the mechanic and not a recording of one run. Try reading the paragraph above while it plays

Style 1 won because it reads as the brand mark. The others were all recognisably a system; this one was recognisably ours, and that is why it kept getting worked on while the rest sat still.

Style 1 is what went forward. The reviewer it was built for described it as something to raise more broadly and try to get into production, and floated swapping the generic loading spinners as an easy first win.

Reflection

I hate AI slop. I hate hearing "let's worry about how it looks later," as if looks are separate from the thing itself. We used to kill each other over beautiful things. Looks are function: they're the reason something feels fun to use instead of just working. I don't think every product needs to look the same, and 139 commits on a motion system nobody asked for is me acting on that. Also, deeply, it looked hella cool.

The marks were later ported into Novus's real codebase, replacing hardcoded hex illustrations with ones that inherit theme colour. That was the point at which a self-set exercise became the product's actual motion identity.

Connect and scan your codebase
AI is building your product map
Go live via a single pull request
The three onboarding illustrations as they ship, drawn from the committed component rather than described. The set they replaced was hardcoded hex, which is the whole difference: switch this site between light and dark and these follow it, because the production version inherits its colour the same way the ones above do
Before and after, rendered from the committed components. Reload inside to replay the one-shot animations · open full screen

Want the whole system, not just the spike? The full lab is nine views: the builder, the rules, the tiers, the loaders.

The complete motion lab · open full screen

Design Jarvis Pendo Orb

all work