dan  /  work  /  nested teams
feature design · enterprise access control

Nested teams & permission inheritance

When a contract with the European Union demanded thousands of users, Cycloid's flat team model broke. I designed a nested hierarchy with inherited, role-based permissions — scoping a hard problem into shippable surfaces and flagging every assumption early.

ROLE
Senior Product Designer
SCOPE
Discovery, IA, three connected surfaces
DRIVER
EU contract — thousands of users
REFERENCES
GitLab · GitHub group/subgroup models
the model — flat to nested
role-based inheritance
BEFOREflat teams · manual roles
/
ALL USERS · 2,140
one flat list, roles assigned by hand — unworkable at thousands of users
AFTERnested hierarchy · inherited roles
/
TEAMS · COLLAPSIBLE TREE
teams nest up to four levels — each node counts its own and all child members; roles inherit down the tree

The flat model couldn't represent an organisation or scale to thousands of users. The nested hierarchy mirrors the org chart and lets a role set once at a parent cascade to every team beneath it.

how inheritance reads
directly assigned inherited
ROLE CASCADE · SET ONCE AT A PARENT
/
a role assigned at a parent team flows to every team beneath it — no per-team setup
USER PROFILE · WHERE PERMISSIONS COME FROM
TEAMS
PERMISSIONS
PROJECTS
each permission shows its origin — inherited from a team, or assigned directly to the user
01 / the problem

Cycloid's permission model used a flat team structure with manually assigned roles. The EU contract — thousands of users — broke it on two fronts.

Manual setup and maintenance at that scale was operationally unworkable, and the flat structure simply couldn't represent the organisational hierarchy the EU needed to maintain access control.

02 / discovery

I ran competitor analysis to understand existing patterns. GitLab and GitHub were the primary references — both with well-documented group/subgroup inheritance — alongside a direct competitor. The research validated a nested team hierarchy with role-based inherited permissions as the right direction.

03 / key personas
01

DevOps Admin

Sets up and configures Cycloid; full access; owns the permission model itself.

02

Developer

Occasional user; mostly consumes pipelines set up by DevOps and checks notifications.

03

Manager / Admin

Needs summary and reporting information; doesn't touch the technical setup.

04 / design decisions

With no defined limit from the Product Owner, I made reasonable assumptions to keep moving — and flagged them explicitly.

first pass — three surfaces, sketched together
WIREFRAME · v0
01 · teams
[org] / teams
Commission214
Directorate A96
Platform41
Security23
Directorate B118
OPEN Q

how deep before a tree is unusable?

org chart as a collapsible tree
02 · user profile
accountrolesteamsownership
teamrolemembers
BackendOrg Admin34
DesignOrg Admin22
BusinessRead-only16
OPEN Q

does origin (direct vs. inherited) live on this tab, or on Ownership?

which teams a user belongs to
03 · project view
[project] / teams
teammembers
Backend34
Design22
OPEN Q

reuse Surface 01's team/count data, or rebuild it here?

which teams touch this project

Sketched as three linked boxes rather than one screen at a time — checking the same team names and counts held together across teams, profile and project before any of it got real pixels. The open questions above became the assumptions flagged below.

ASSUMPTION · FLAGGED

~15–20 members per team, up to 4 levels deep.

ASSUMPTION · FLAGGED

Permissions apply at project level — unblocking user-facing design from complex entity logic.

resolved — the tree, and the three surfaces it feeds
TEAMS — COLLAPSIBLE TREE
Commission214
Directorate A96
Platform41
Security23
Directorate B118
SURFACE 01 · TEAMS PAGE

A collapsible tree; each node counts members across itself and all child teams.

SURFACE 02 · USER PROFILE

Which teams a user belongs to, which permissions they hold and where they originate (inherited vs. direct), and their projects.

SURFACE 03 · PROJECT VIEW

Which teams are assigned to a project, and the membership of those teams.

designed — surface 02, user profile
profile / teams · profile / ownership
Cycloid user profile — Assigned Teams tab
Assigned Teams — every team a user belongs to, with role and headcount.
Cycloid user profile — Ownership tab
Ownership — direct and inherited entity ownership, listed side by side.
designed — surface 03, project view
project / teams
Cycloid project settings — Teams tab

Same model, reused

The project's Teams tab pulls the same team and membership data as the org-level tree and the user profile — one model surfaced three ways, not three separate builds.

05 / outcome

The three surfaces resolved cleanly and held together as one connected model — the tree, the profile and the project view all reflecting the same team data. Entity-level permissions — how components and environments behave under the model — hit ambiguity at the product-definition level along the way, and the design surfaced that complexity early rather than absorbing it silently.

The designs weren't ultimately shipped. That doesn't change what the process demonstrated: a complex enterprise problem scoped into deliverable surfaces, with assumptions flagged rather than guessed at.

what this
demonstrates

Autonomous decision-making under ambiguity, with assumptions flagged to stakeholders.

Scoping a complex enterprise problem into deliverable surfaces.

Systems thinking across connected views — teams, users, projects.

Pragmatic unblocking without waiting for perfect information.

06 / contact

Need a design system that ships in weeks? Let's talk.

Permanent, contract, or leadership — open to remote and relocation across the UK and Ireland.

Illustrated portrait of Dan Danowski