Hi! I'm Zeno.(You probably figured that out already)
I make experiences that make me smile, and help people be their best selves.
- 👨🏼💻
Creativity and
code
My passion is organising information in a visually striking way, and bringing complex ideas to life with technology. I am naturally curious for the world, and love exploring big ideas while collaborating across disciplines.
- 🛠
Invisible tools
I love the concept of digital tools: Interfaces that help you create, work, discover, and grow in any way you find important – without being in your way.
- ✨
Polish every pixel
Call me a devil, cause I'm up in those details. Interfaces are so much more than just static screens: they have loading states, page transitions, edge cases and more. My favourite thing is enriching interfaces with animations and interactivity.
Activity
What I've been up to online
- Merged inGitbookIO/gitbook+48-535 Feb 2025
Change link color to primary subtle
Links are now coloured close to– or exactly matching the site's supplied primary colour. If a visitor's browser requests high contrast styles, we still show an appropriate AA/AAA-compliant colour. Before After - “
It’s an amazing weekend for rugby, in what will be an amazing month for rugby.
- Merged inGitbookIO/gitbook+127-835 Feb 2025
Make tint color subtler when equal to primary color
The new tint colour system results in pretty intense looks when using the primary colour as the tint colour 1:1. To reduce this effect, we will add in 40% grey with the primary colour when exactly equal to the primary colour. This results in a more subtle tone. When the tint colour is custom-set, we give control to the user and use the chosen colour exactly. - “
One of the things I love about working on a (partially) open source project is that I get to ask for feedback and share my work in the open.
Today I wrote a post on the GitBook Community page asking for feedback on some design changes I spent a lot of time on: https://github.com/orgs/GitbookIO/discussions/843
If you use GitBook (Hi! Awesome!) let me know what you think :)
📥 Feedback wanted: Updates to sidebar and header on docs sites · GitbookIO · Discussion #843
Hey there! Over the past weeks I have made an effort to modernise the look and feel of the sidebar and header on published docs sites. This ...
- “
Something delightful for today: Amsterdam donates its big Christmas tree on Dam square to the elephants of Artis 🐘
https://social.amsterdam.nl/@gemeenteamsterdam/113797809029100983Gemeente Amsterdam (@gemeenteamsterdam@amsterdam.nl)
Bijlagen: 1 afbeelding “De dieren vinden het ieder jaar weer prachtig.” We spraken met onze bomenexpert Hans van Zurk over de kerstboom op...
- Merged inGitbookIO/gitbook+881-10143 Feb 2025
Overhaul colour system & classes
This PR is a comprehensive rewrite of the colour system used on GitBook Open. The way colours are generated, as well as the naming convention across the code, has been changed in favour of a Radix-like system. Key benefits A better colour palette defined in terms of perceived LCH instead of RGB. This gives us more control over each shade and lets us mix colours together easily. Guaranteed accessible colour contrasts, no matter which colour you throw at it. A much stronger use of tint across the app, as it colours every single element instead of only the background. This can result in very striking looks, and can be dialled back into very subtle details. Even without tint, we mix a tiny bit of the primary colour into every neutral. The visual changes are quite slight for most sites. The only sites that will see a more pronounced change are the ones that have tint enabled and set to a strong (primary) colour. Secondary benefits Consistency: unified (text/background/border/...) colours across the app — before we had many different text colours because we used different shades and opacity. Now we have 2: low contrast and high contrast. A better contrast calculation function based on perceptual brightness will result in "the right colour" being chosen in many more cases, and reduces 1 package dependency. Semantic colour classes — bg-primary text-primary will turn into different shades, as the classes are mapped to colour that should be used in that context. This will also make it a lot easier to implement the 4 different themes in an easier way, as we don't need to worry about contrasts and clashes between elements. Main changes colors.ts serves as the source of all colour logic, it contains the main colour scale definition, translation functions between colours spaces, functions for colour mixing and colour contrast checks. CustomisationRootLayout.tsx and tailwind.config.ts implement the colour scales in a similar way as before, using CSS variables on the <html>. There are three colour scales available: primary: Based on the primary color, used for links and interactive elements. tint: The main color scale for non-interactive elements. Will either be a (slightly tinted) gray scale or a user-set value through Customisation. neutral: Will always be a neutral gray scale, without any tinting or overrides. Use only when tint somehow clashes. We also generate contrast-* colors for each of the shades in each of these scales, for example contrast-primary-1 and contrast-tint-12. These will be set to black or white depending which has the strongest contrast with the matching shade. Each shade is available in Tailwind as its step number (primary-1…primary-12). But for most use cases, the utility color classes (bg-primary, text-primary, border-primary-hover, ...) are much preferred because they map the function (bg, text, border, ...) to the right step in the color scales. These new (utility & generic classes) have been used to replace all color classes across the app. Examples http://docs.gitbook.com/ vs https://pr2783.gitbook-open.pages.dev/docs.gitbook.com https://docs.umbraco.com/umbraco-cms vs https://pr2783.gitbook-open.pages.dev/docs.umbraco.com/umbraco-cms https://docs.whereby.com vs https://pr2783.gitbook-open.pages.dev/docs.whereby.com https://docs.keycloakify.dev/ vs https://pr2783.gitbook-open.pages.dev/docs.keycloakify.dev docs.lenses.io/latest vs https://pr2783.gitbook-open.pages.dev/docs.lenses.io/latest - “
new year, new website :) with thy surest steel gathered to thy side, turn to face these new nightmares, these...True Terrors (of the New Dark Web)
plenty to do but i'm thrilled to publish this 🤍 thanks a lot if you end up taking a look, but hark! go heedfully:
scroll with caution & with care!
Henry From Online
The personal site & portfolio of creative web developer Henry from Online
- 7 Jan, 15:23
- 28
- 38
- 4
- Merged inGitbookIO/gitbook+154-8828 Jan 2025
Support user comments after rating
Screen.Recording.2025-01-23.at.13.48.34.mov To do Hook up API and typing to accept comment prop (in trackEvent() and createSitesPageFeedback() – marked with // TODO @Samy in the code. Serverside validation and escaping of user input. The only check I've built so far is a client side maxLength, but I don't escape the value in any way right now. Add some tests? - “
I’m late for #followfriday this week, but I’d love recommendations for cool dev/design people to follow on here :)
- “
Updated my #portfolio with a new, simpler Activity section. It aggregates blog posts and mastodon in one big carousel, with more sources to follow soon.
Tinkering with CSS grids and the #mastodon API made for a super fun holiday project! Really happy with how it turned out 😊
Zeno Kapitein | Portfolio
- Merged inGitbookIO/gitbook+15-321 Jan 2025
Tweak card background, better margins for card headings
Cards stand out slightly more on tinted and dark mode sites, and have better support for headings inside them. Preview Background Tinted (Before → After) Dark mode (Before → After) Headings (Before → After) - “
Feeling very refreshed after the holidays! Can't wait to meet new people, learn new things, and make next year amazing :)
- Merged inGitbookIO/gitbook+172-14221 Jan 2025
Restyle footer, allow >4 link groups
Update the footer to a brand new design Increase logo size to the same dimensions as header logo (fixes RND-5860) Support >4 link groups by distributing groups across (max) 4 columns (fixes RND-5024) Restyle every component inside the footer, including the mode selector. Styling examples GitBook (Before → After) Audacity (Before → After) Make.com (Before → After) Snyk (Before → After) Digit (Before → After) Automatic columns To distribute groups across columns, first we determine how many groups need to be placed per column, favouring the left columns first. Then we fill each column vertically in the order defined by the user. Example: if there are 10 groups, the first column will contain 3 groups (1, 2, 3), the second will contain 3 groups (4, 5, 6), and the last two columns will also contain 2 groups (7, 8 and 9, 10). On mobile, groups are shown underneath each other. - 6 Dec, 22:30
- 7
- 31
- 81
- Merged inGitbookIO/gitbook+61-2814 Jan 2025
Header button styling
Decreases the gap between header links and adds new styling for primary and secondary buttons, in line with new theming. Comparisons (Before → After) - “
Bf made too many noodles today so I was like “Oh no, what have udon”
- “
Taking a break.
- Merged inGitbookIO/gitbook+57-5213 Jan 2025
Start using tint in more places: TOC and PageAside
- “
1. Nice to see aria-labels even on stuff as extraneous as the store's hype queue.
2. Fascinating to see Apple do alt text in the same voice as its marketing. - Merged inGitbookIO/gitbook+25-114 Jan 2025
Fix variant dropdown styling in header
Before and after - “
Fridge store salesman stops me as I leave the Fridge store carting out my new Fridge
'hey can i interest you in a new fridge"
- “
My take on those trendy call-to-action buttons. You know the ones. So shiny. Big vibes. All CSS.
There are a few interesting parts to it, especially with the use of registered custom properties for smooth gradient rotations and hover transitions. Check out my latest post that gets into the details: https://ryanmulligan.dev/blog/css-property-new-style/
CSS @property and the New Style
- Merged inGitbookIO/gitbook+140-1310 Jan 2025
Vertical orientation for sections list on sites without header
This PR adds a vertical display component for sections, useful for sites that have the header turned off (and might become an opt-in choice for sites with sections). When there are more than 5 sections we display a scrollview (and scroll to the active section if needed). Preview Screen.Recording.2025-01-09.at.18.42.20.mov Screen.Recording.2025-01-10.at.14.02.21.mov - “
@LiftinApp Hey, my Ad-Hoc Routines carousel seems stuck, I’ve changed the routines inside that section but they’re not changing, even after I delete all of them I see the old routines there. Anything I can do?
Liftin' version 36.5 (300)
- “
Today marks the first day of my ½-month sabbatical in-between jobs. There’s a new energy in the air ⚡️
- Merged inGitbookIO/gitbook+185-3519 Jan 2025
Restyle `PageAside` to use sidebar list styles
This PR adds support for the new sidebar list styles introduced in #2645 to the right sidebar, along with improved top margin and visual cleanup of the right sidebar as a whole. New list styles Same as left sidebar: default, pill, and line (using the same user customisation setting). default.mov pill.mov line.mov In addition to the three styles, when a user's system reports wanting more contrast, all three styles get more borders and thicker text: default-contrast.mov API blocks Before & After - “
🌉 Ken jij het verhaal achter de Kortjewantsbrug, Scharrebiersluis en Bullebak? Sommige bruggen in onze stad hebben bijzondere namen die eeuwen oud zijn. We gaan terug naar een tijd van schraal bier 🍺 en bulderende watermonsters 👹.
➡️ https://www.amsterdam.nl/nieuws/achtergrond/amsterdamse-bruggen/
- Merged inGitbookIO/gitbook+24-119 Dec 2024
Fix variant selector for non-default themes
Before After - Merged inGitbookIO/gitbook+11-516 Dec 2024
Fix header logo margin
Before After - Merged inGitbookIO/gitbook+74-413 Dec 2024
Add breadcrumbs to page header
If a page is nested within a page group or other pages, we can put breadcrumbs above the page title. It adds a sense of hierarchy to the page, and provides a nice touch of colour. Preview - Merged inGitbookIO/gitbook+411-30513 Dec 2024
Update header styling
This PR updates the site header with a new, modernised look featuring translucency and a new search bar. The header has been refactored for a more flexible layout across screen sizes, and especially on small and tiny screens. New look with slight translucency on default themes. Non-default themes still showcase a full color without translucency. New search bar design and hover/active styles for a more lively look. Tweaks to search modal to make the transition from/to search smoother. New internal layout for header top bar, using flex box instead of grid. Elements truncate and shrink automatically on small screens. Update visual tests to deal with multiple variant selectors on page Before After Screen.Recording.2024-12-11.at.17.43.18.mov - Merged inGitbookIO/gitbook+242-1899 Dec 2024
Add tint color
This PR adds support for the new tint colour customisation setting. It is meant as an additional way to theme your docs by subtly colouring various elements of your theme, such as the background or header. The primary-color remains in use for primary navigation elements such as links and buttons. This first PR aims to swap the properties used in colour calculations without introducing big visual changes. In future PRs will propose new ways of using tint in various places. There are no changes for sites that have not opted into the Tint setting. Create tint-color and contrast-tint CSS variables Use tint-color to set base colour palette (light-* and dark-* variables) Use tint-color for the header colour of Bold. When Custom is used, the set "Header background" and "Link color” settings take precedence over tint colour. Deprecate plain-background Tailwind variant in favour of tint and no-tint variants. Deprecate primary-base variable in favour of tint-color Preview Without tint: same as current Background: plain Primary tint: same as current Background: match Custom tint: new functionality Default No changes with tint off. If tint is enabled, we colour the bg slightly with the tint color (primary color or custom color) Bold No changes with tint off. If tint is enabled, we colour the bg slightly and header strongly with the tint color. The links are always set to a contrast of the tint color. Contrast No changes with tint off. If tint is enabled, we colour only the bg slightly. Header stays contrasting. Custom No changes with tint off – we use the custom-set headerBackgroundColor and headerLinkColor. If tint is enabled, we colour only the bg slightly. The custom header colours stay in place. We aim to eventually clean up these options, favouring tint over custom-set header colours. Resolves RND-5670 - Merged inGitbookIO/gitbook+63-12126 Nov 2024
Restyle hint block
Change colours of Hint Set border colors on CodeBlock, which can optionally be enabled (by conditional style within Hint). Fix Stepper and StepperStep to handle passed-on style classes correctly Adds can-override-bg and can-override-text classes to let Hint conditonally set the right colors for components within its boundaries. Preview Left is current, right is proposed - Merged inGitbookIO/gitbook+186-14120 Nov 2024
Improve styling of search & ask AI box
Fixes RND-5521 and RND-5519 Preview (Left is current, right is proposed)
The four phases of attending a hackathon
The rhythm of highs, lows, and everything in-between that I encountered at the 24-hour Young Creators hackathon – from idea to (winning) solution.
Playing catch-up with the Twitter app
A small design exploration of how Twitter could help users scroll back to where they were after scrolling to the top of their timeline
Shiplog has shipped ⚓️🚢
Introducing Shiplog: a menu bar app to keep track of running deploys on Vercel and Netlify
Highlighted Projects
Crisp
Crisp is a grocery store app for locally sourced fresh food. Its mission is to improve the food system by effortlessly bringing better food to more people.
As Product Designer I help make the app look good and work smoothly, with involvement in the entire product chain: conducting user research, feature discovery, designing iterations in Figma, speccing tickets for developers, testing implementation, building and releasing to users, and monitoring adoption by writing SQL and dashboards.
My biggest achievement is the newly-launched Weekbox, our take on mealkits and a whole new paradigm for Crisp. I have designed every flow, from onboarding to cancellation, helped tailor the core proposition, and helped steer the rollout to production.
Beyond that I have contributed dozens of new features to the app, helped solve hundreds of bugs, set up the design system from scratch, regularly shipped the app to alpha / beta / production, led internal team meetings, and presented inspiration sessions to the whole company.
Riverside
As the first Design Engineer at online recording platform Riverside, I bridged the gap between the design and development teams by designing new features and creating prototypes, animations and code examples that would enhance the product further. I also set up and maintained the Riverside Design System.
The feature I'm most proud of is the Media Board, which lets you upload, preview, and record audio and video in your online studio. Small details such as the design of the Preview/Live toggle and the Grid View inspired by Launchpads were a delight to work on.
Invisible
Interface
Carried out in the scope of the MA Digital Experience Design at Hyper Island UK, my graduation thesis examines flow in digital tools, and aims to provide a new model to help digital designers create interfaces that cause (more) flow.
Check out the 15-minute summary video below
Check out the full thesisI tried my hardest to make it anything but dry
Dutch Coding Company
Dutch Coding Company is a web & app studio based in Eindhoven. I have had the pleasure of working with them on multiple projects, from mobile apps to animation-enriched websites. As part of their website redesign, I got to add animations and page transitions in numerous places.
To accompany the beautiful videos they made, I created a number of 3D device components that would spin- or flip around as you scrolled the page. In places where a handmade video couldn't be made, the device frame could be filled with a screen recording, and it would mirror the 3D transforms made by the device. Another highlight is the website's main menu, which includes staggered animations and a smoothly rippling wave at the bottom.
Eurostory
In 2015 I was approached by a group of authors to collaborate on a special project: a website about the serious side of the Eurovision Song Contest.
Everything about Eurostory is custom-built with attention to detail: a specialised block editor, a rich database of contest info, SEO optimisations, and a sleek design.
To top it off, during the Song Contest itself I get to make short vlogs about my experiences, finding my way as a videographer.
DebaTable
DebaTable is a technologically enhanced meeting table that mediates discussions and stimulates time-efficient debates.
It works by measuring and then visualising each participant’s speaking time within the past minutes. Additionally, a slowly expanding circle in the middle shows the discussion time left per topic, as voted on by each participant.
Other Projects
Gloei
I had the honour of being interviewed by Edward van de Vendel in a book about LGBTQ+ youth called "Gloei". After a successful book launch, we started an interview podcast with the same name: "Gloei, the podcast".
Edward interviews a member of the LGBTQ+ community about their life. Afterwards, he reads a poem inspired by that person. Each episode is accompanied by custom art work. I was in charge of the audio and hosting.
Board Year
Wervingsdagen is responsible for organising the largest career events of the Eindhoven University of Technology, helping 160 companies with 3700 students. I learned to collaborate with my fellow board members, work with 9 study associations, and maintain professional attitude towards client companies.
Light Art
Intermedia is an interactive light installation made for light art festival GLOW Eindhoven 2016. I programmed its 3 visualisations using a pretty complex technology stack (Kinect sensors, local networking, beamers, adaptive soundtrack). The result was a wonderful experience, with many strangers connecting with each other through a screen.
Get in touch
I'm @zenoachtig (It's funny in Dutch) pretty much everywhere.