GitHub's Octicons are designed twice, on 16 x 16 and 24 x 24 px grids (12 px only for special cases), with a 1.5 px stroke at both sizes, round caps and joins, 1 px corner radius (0.25 px on small filled parts such as arrowheads), 1 px gaps between overlapping objects and 1.5 px gaps around modifiers, 2D perspective, outer edges on the pixel grid, and line arrowheads. The brand toolkit sets illustration loudness in three levels: detailed 3D isometric key art for big moments, the contribution graph (down to four squares in a row for light branding), and a dithering texture that should feel like wallpaper; all illustrations sit in optimistic daylight, and squares are never scattered, scaled past their cell, or mixed with dithering. The primary palette is neutrals with one hero, GitHub Green #0FBF3E, applied as mostly neutral with small moments of green, and secondary themes (Copilot Purple #8534F3, Security Blue #3094FF) appear sparingly and mainly in illustration. Layouts follow a strict grid whose borders are revealed only a couple of times, text and visuals are separated by a solid green line on white, gray or black text themes, speaker photos may be gray-scaled when they compete with illustration, and product UI shots are simplified, bordered with a radius and stroked to the thickness of the background dither squares. Motion avoids slapping, rolling or bouncing and uses five transition patterns (container transform, container masking, lateral, enter and exit, simple ease); Primer's motion tokens publish ease, ease-out, ease-in and ease-in-out cubic-bezier curves with ease-out as the recommended default.
The brand's art is built from something users already see every day, a grid of activity squares, so even abstract graphics read as the product. Neutral pages with one accent leave room for that art, and product screenshots are trimmed into the hero image instead of being replaced by stock photos.
Developer tools, infrastructure and data platforms, open-source projects, technical SaaS and conference brands that want to look like the product itself rather than generic marketing
Steal it for your brand
The same system, written in your colors, type and shapes. Nothing of GitHub's look comes with it.
palette.ink.palette.ink plus palette.accent.palette.surface to palette.accent, deepest cells in palette.accent dark; keep every square inside its cell, never scatter or enlarge one, and never mix it with the dither texture in the same piece. Four squares in a row is enough for light branding.palette.paper, palette.surface or palette.night, and let palette.accent cover only about a tenth of the area; save palette.accent secondary for illustration.style.radius corner and a style.border width stroke in palette.border, and set it on palette.surface with a dither or gradient that points to the key area and fades to palette.paper.palette.border once or twice per piece and let the rest of the grid stay invisible.palette.accent rule of style.border width * 2, and keep text on one of the three neutral grounds at WCAG AA contrast.palette.accent.{
"recipe": {
"icon_style": {
"sizes_px": [
16,
24
],
"special_px": 12,
"stroke_px": 1.5,
"linecap": "round",
"linejoin": "round",
"corner_radius_px": 1,
"small_fill_radius_px": 0.25,
"overlap_gap_px": 1,
"modifier_gap_px": 1.5,
"perspective": "2D",
"arrowheads": "line",
"pixel_align": "outer edge",
"fill": "none",
"color": "{palette.ink}",
"color_secondary": "{palette.ink_muted}",
"spot_icon_min_px": 48,
"spot_icon_colors": [
"{palette.ink}",
"{palette.accent}",
"{palette.accent_secondary}"
],
"brand_uses": [
"bullets",
"card corner marks",
"labels inside key art"
]
},
"illustration_style": {
"levels": [
"key art",
"activity grid",
"dither texture"
],
"level_by_moment": {
"launch": "key art",
"standard": "activity grid",
"quiet": "dither texture"
},
"key_art_projection": "isometric",
"key_art_angle_deg": 30,
"grid_cell_shape": "square",
"grid_cell_radius": "{style.radius} * 0.25",
"grid_cell_gap_ratio": 0.2,
"grid_intensity_steps": [
0,
0.25,
0.5,
0.75,
1
],
"grid_empty": "{palette.surface}",
"grid_full": "{palette.accent}",
"grid_deepest": "{palette.accent_dark}",
"grid_min_cells": 4,
"dither_color": "{palette.accent}",
"dither_on": "{palette.night}",
"light": "daylight",
"background": "{palette.paper}",
"accent_share": 0.15,
"secondary_color": "{palette.accent_secondary}",
"secondary_scope": "illustration only"
},
"photo_treatment": {
"hero_visual": "trimmed product UI",
"ui_frame_radius_px": "{style.radius}",
"ui_frame_stroke_px": "{style.border_width}",
"ui_frame_stroke_color": "{palette.border}",
"ui_backdrop": "{palette.surface}",
"ui_backdrop_pattern": "dither, densest toward the key area",
"ui_backdrop_fade": "gradient to {palette.paper}",
"ui_trim": [
"sidebars",
"footers",
"unneeded borders",
"competing buttons and links"
],
"people_photo_saturation_beside_art": 0,
"people_photo_saturation_alone": 1,
"image_gap_px": "{style.radius} * 2",
"alt_text": "describe the UI elements and their interactions"
},
"motion": {
"easing_hover": [
0.25,
0.1,
0.25,
1
],
"easing_enter": [
0.3,
0.8,
0.6,
1
],
"easing_exit": [
0.7,
0.1,
0.75,
0.9
],
"easing_move": [
0.6,
0,
0.2,
1
],
"easing_progress": [
0,
0,
1,
1
],
"hover_ms": {
"by": "style.motion",
"map": {
"crisp": 50,
"calm": 100,
"playful": 100
},
"default": 100
},
"enter_ms": {
"by": "style.motion",
"map": {
"crisp": 200,
"calm": 300,
"playful": 300
},
"default": 200
},
"move_ms": {
"by": "style.motion",
"map": {
"crisp": 300,
"calm": 400,
"playful": 400
},
"default": 300
},
"duration_step_ms": 100,
"patterns": [
"container transform",
"container masking",
"lateral",
"enter and exit",
"simple ease"
],
"masking_only_for": "confirmations and celebrations",
"overshoot": 0,
"mono_text": "typed character by character with a cursor in {palette.accent}"
},
"layout_move": {
"size_scale_px": [
2,
4,
6,
8,
12,
16,
24,
32,
40,
48
],
"breakpoints_px": [
320,
544,
768,
1012,
1280,
1400
],
"columns_by_breakpoint": {
"320": 1,
"768": 2,
"1400": 3
},
"max_width_px": 1280,
"padding_px_small": 16,
"padding_px_large": 24,
"grid_border": "{style.border_width}",
"grid_border_color": "{palette.border}",
"grid_borders_revealed": 2,
"text_visual_divider": "{palette.accent}",
"text_visual_divider_px": "{style.border_width} * 2",
"text_themes": [
"{palette.paper}",
"{palette.surface}",
"{palette.night}"
],
"text_on_dark": "{palette.on_night}",
"accent_area_share": 0.1,
"section_gap_px": {
"by": "style.density",
"map": {
"airy": 96,
"balanced": 64,
"dense": 40
},
"default": 64
}
}
},
"fallbacks": {
"palette.ink_muted": "{palette.ink}",
"palette.accent_dark": "{palette.ink}",
"palette.accent_secondary": "{palette.accent}",
"palette.surface": "{palette.paper}",
"palette.border": "{palette.ink_muted}",
"palette.night": "{palette.ink}",
"palette.on_night": "{palette.paper}",
"style.border_width": 1,
"style.radius": 6
},
"steps": [
"Restyle an open line icon set to 16 and 24 px masters with a 1.5 px stroke at both sizes, round caps and joins, 1 px corners, 1 px gaps where shapes overlap and 1.5 px around modifiers, flat 2D views and line arrowheads; color them {palette.ink}.",
"Use icons in brand pieces as bullets and small marks on cards; for larger spot icons (48 px and up) build them from a few connected lines and circles and color them with {palette.ink} plus {palette.accent}.",
"Choose one illustration level per piece by how loud the moment is: isometric key art for launches, a grid of squares for most pieces, a dither texture as wallpaper behind quiet ones.",
"Build the grid of squares from equal cells filled in five steps from {palette.surface} to {palette.accent}, deepest cells in {palette.accent_dark}; keep every square inside its cell, never scatter or enlarge one, and never mix it with the dither texture in the same piece. Four squares in a row is enough for light branding.",
"Keep pages neutral, {palette.paper}, {palette.surface} or {palette.night}, and let {palette.accent} cover only about a tenth of the area; save {palette.accent_secondary} for illustration.",
"Make the product the hero image: crop real screens to the key moment, remove sidebars, footers and competing buttons, frame the result with a {style.radius} corner and a {style.border_width} stroke in {palette.border}, and set it on {palette.surface} with a dither or gradient that points to the key area and fades to {palette.paper}.",
"When people photos sit beside illustration, convert them to grayscale so the art keeps the color; space several images evenly.",
"Lay pages out on a strict grid capped at 1280 px with 16 px padding on small screens and 24 px on large: one column under 768 px, two above, a third only at 1400 px. Draw the grid lines in {palette.border} once or twice per piece and let the rest of the grid stay invisible.",
"Separate text from visuals with a solid {palette.accent} rule of {style.border_width} * 2, and keep text on one of the three neutral grounds at WCAG AA contrast.",
"Animate entrances with the ease-out curve, exits with ease-in, moves and morphs with ease-in-out and hovers with ease, at the recipe's hover_ms, enter_ms and move_ms; choose a pattern by relationship (container transform for open-in-place, lateral for tabs, enter and exit for menus, masking only for confirmations).",
"Never slap, roll or bounce text or UI; type monospaced lines in character by character with a cursor in {palette.accent}."
]
}The lesson
Document your icon style as rules a stranger can follow: fixed grids, two sizes of every icon, and a contents list of every rule.
The Octicons page, "A scalable set of icons handcrafted by GitHub.", has Icons, Design specs, Usage and Code tabs. Under "Grid sizes" it says "Always design two versions of each icon: a 16px version and a 24px version" and draws both grids labeled 16 and 24. A side list covers Stroke, Caps and joins, Corners, Gaps and Arrowheads.
The specific sizes belong to GitHub's icons, so set your own grid. Keep the pattern of one rule per heading, a drawn example for each and the exceptions stated.