SakaniUI

Content Sections

Testimonials, FAQ, team, careers, and a blog index — the sections a marketing site fills with real content.

Where the marketing sections are mostly layout, these are data-driven: each takes an array and renders the matching component per entry, so they map cleanly onto whatever your CMS returns.

Testimonials

The layout follows the data: one testimonial renders Figma's large single-quote style, two or more switch to the grid.

Sakani cut our design-to-dev handoff time in half. Every component already matches what ships — no more guessing at spacing or states.

Amara Kalu

Amara Kalu

Head of Product, Fintra

The state coverage alone saved us weeks — every error and loading case was already thought through.

Ravi Menon

Ravi Menon

Founder, Loopline

Figma and code finally stay in sync. No more components drifting apart after a sprint.

Chidi Duru

Chidi Duru

Design Lead, Bexa

We shipped our MVP in three weeks using Sakani blocks instead of building from scratch.

Jade Silva

Jade Silva

Engineer, Northstack

FAQ

defaultOpen on the first item saves the reader a click and shows the answers are short — worth doing unless the list is long enough that an open item hides the rest.

FAQ

Frequently asked questions

Yes — Sakani is fully open source under the MIT license. Use it in personal or commercial projects at no cost.
No. Sakani ships with its own CSS Modules and token layer, so it works independently of any other styling framework.
Every component, variant, and state in Figma has a 1:1 counterpart in the React library, down to spacing and color tokens.
Yes — every color, spacing, and radius value is a CSS variable. Override them once and the whole system updates.
Accessibility is an active focus area — see our roadmap for the current state of keyboard and screen-reader support.
Sakani is open source on GitHub — issues and pull requests are welcome.

Team and careers

The item types extend the underlying component's own props — TeamSectionMember is TeamCard's props plus an id, and CareersJob is JobListing's minus layout. Anything you can pass the component, you can pass through the block.

Team

The people building Sakani

A small, distributed team focused on making one design system genuinely excellent.

Marvin McKinney
NY, USA

Marvin McKinney

Design Lead

Chidi Duru
Lagos, Nigeria

Chidi Duru

Design Lead

Floyd Miles
London, England

Floyd Miles

Pool Hygiene Specialist

Darlene Robertson
Lagos, Nigeria

Darlene Robertson

Sonographer

Careers

Come build with us

We're a small, remote-friendly team. Here's what's open right now.

Senior Product Designer

Lead end-to-end product design from discovery through delivery, shaping intuitive experiences that drive business impact.

DesignFull-timeLagos, Nigeria

Staff Engineer, Design Systems

Own the architecture of our component library and drive Figma-to-code parity across the product.

EngineeringFull-timeRemote — Worldwide

Content Marketing Lead

Shape the voice and editorial strategy behind our blog, docs, and product launches.

MarketingFull-timeLagos, Nigeria

Blog index

Blog

From the blog

Notes on building, maintaining, and scaling a real design system.

Featured

The complete guide to building a design system that survives year two

A practical breakdown of tokens, governance, and the maintenance work most teams underestimate.

Design11 mins read

Token-driven theming, explained

Why every color should be a variable, not a hex code.

Chidi Duru

Chidi Duru · Aug 5, 2026

Process11 mins read

How we review component PRs

The checklist we run before anything ships to the library.

Ravi Menon

Ravi Menon · Jul 28, 2026

Engineering11 mins read

Figma-to-code parity, in practice

What it actually takes to keep design and code from drifting apart.

Jade Silva

Jade Silva · Jul 20, 2026

Copy the source

Blocks are composition examples, not configurable components. Rather than adding props for a layout they don't support, copy the file into your own project and edit it: change the columns, swap the sample data, delete the parts you don't need. Nothing here introduces a primitive you can't already import on its own.

Why it works this way

Why

  • Where the marketing sections are mostly layout, these are data-driven: each takes an array and renders the matching component per entry, so they map onto whatever a CMS returns.
  • One testimonial renders the large single-quote style; two or more switch to the grid, so the layout follows the data.
  • Item types extend the underlying component's props, so anything you can pass the component you can pass through the block.

Don't

  • Don't set defaultOpen on a FAQ long enough that an open item hides the rest.