# Python: brand book and build spec

Two interlocked snakes in blue and yellow, a blue frame with yellow actions, Source Sans Pro text with narrow Flux labels, and interpreter prompts (">>>") as the brand's arrows. The rules that are published are about protecting one shape; the rest is the python.org system, open-sourced.

From unfairly.ai/brand-guidelines/python, checked 2026-10-31. Unofficial study; not affiliated with Python.

Every value is labelled with where it came from: **published** (the brand says it), **observed** (measured or seen on its live site, with the date), **our reading** (inferred from the evidence) or **our recipe** (how we apply the system). Files beside this one: tokens.css, tokens.json (DTCG 2025.10), kit.json.

**Thesis (our reading):** Python's brand is the interpreter. The site leads with runnable code, marks every link with ">>>", and lets the logo's two colours do the rest, so the brand feels like using Python rather than being sold it. Based on: From the homepage code carousel and prompt marks, the logo colours in the published CSS, and the devguide's preference for short concrete examples.

## Purpose

PSF mission (quoted in part, the rest paraphrased): To "promote, protect, and advance the Python programming language", and to help a diverse, international community of Python programmers grow. (published; https://www.python.org/psf/mission/)

Story: The PSF is a non-profit that holds Python's intellectual property, produces the free core distribution and protects the Python name; its mission statement was approved in 2002 and amended through 2009. The two-snakes logo was drawn by Tim Parkin around 2005, when Python moved from a "cute" animal icon to a mark balancing formality and playfulness, and he assigned it to the PSF. python.org has carried a copyright line since 2001. (published)

| Value | What it means in the work | Source |
|---|---|---|
| Readability counts | Code is read more often than written; clarity wins (PEP 20 aphorism). | published: https://peps.python.org/pep-0020/ |
| Simple is better than complex | Choose the plain way; the docs echo it with economy of expression (PEP 20). | published: https://peps.python.org/pep-0020/ |
| Explicit is better than implicit | Say what you mean in code and in prose (PEP 20). | published: https://peps.python.org/pep-0020/ |
| Diverse and international community | Part of the PSF mission; also why the docs ask for simple English and inclusive terms. | published: https://www.python.org/psf/mission/ |
| Free to use | PSF licences keep the rights to obtain, use, redistribute and modify (paraphrase). | published: https://www.python.org/psf/mission/ |

## Fixed and flexible

Never changes:
- The two-snakes shape, unaltered and never mirrored, with its TM
- Python blue #3776AB and Python yellow #FFD343: blue frames, yellow acts
- Source Sans Pro for text; Flux (or its stand-in) only for short labels
- ">>>" as the read-more mark
- Python as an adjective; the PSF never shown endorsing anything

The one thing that varies: The colours inside the snakes (with permission) and the code sample shown; everything else on python.org is a fixed system

## Positioning

- **Statement**: A programming language that lets you work quickly and integrate systems more effectively. (observed)
- **Category**: General-purpose, interpreted, high-level open source programming language (published)
- **Audience**: Newcomers to programming and experienced developers alike, plus the community that builds and funds Python (Get Started widget; PSF band). (observed)
- **Problem**: Development speed and maintenance cost: compile steps, hard-to-read code and glue work between systems (paraphrase of the executive summary). (published)
- **Promise**: Work quickly and integrate systems effectively, with a language that is easy to learn and to read. (observed)
- **Differentiators**: Readable syntax that lowers the cost of program maintenance.; A large standard library plus PyPI's third-party modules.; Free, OSI-approved licence that allows commercial use.; No compilation step: a fast edit-test-debug cycle.; A non-profit foundation and a global community of conferences and user groups.
- **Alternatives**: Other programming languages: experienced programmers "in any other language" are invited to switch (hero slide).

## Messaging

Boilerplate (published): Python is an interpreted, object-oriented, high-level programming language with dynamic semantics, a clean, readable syntax and a large standard library, available free for all major platforms. It is developed under an OSI-approved open source license administered by the Python Software Foundation.

Taglines:
- lets you work quickly and integrate systems more effectively (The homepage intro line under the hero, after "Python is a programming language that", with a >>> Learn More link)
- Python Powered (The official badge (wide and tall) for software built with Python)

| Pillar | Claim | Proof | Label |
|---|---|---|---|
| Quick and easy to learn | Beginners find the syntax clean; experienced programmers pick it up very quickly. | Beginner's Guide linked from the Get Started widget.; The official Python Tutorial at docs.python.org. | observed |
| Readable, productive code | Simple syntax that emphasises readability, a fast edit-test-debug cycle and no compile step. | PEP 20, The Zen of Python: "Readability counts."; Five runnable code samples on the homepage (functions, control flow, lists, arithmetic, input/output). | published |
| Use it for everything | Web, GUI, AI and machine learning, science, software development and system administration, backed by PyPI. | Six application areas with named libraries (Django, PyTorch, SciPy, Ansible...).; PyPI hosts thousands of third-party modules (About page). | observed |
| Free, open and community-run | OSI-approved licence, usable commercially, stewarded by a non-profit foundation and its members. | OSI-approved open source licence, freely usable and distributable, even commercially.; Stewarded by the PSF, a US 501(c)(3) non-profit membership organization. | published |

They never claim:
- Never imply the PSF endorses a course, book, project or certification; it endorses none (FAQ).
- Never claim exclusivity ("The Python Academy", "Python Inc.") or official status.
- Never use the logo to refer to anything but the Python programming language.

Real lines, as they wrote them:
| Line | Channel | Source |
|---|---|---|
| "Functions Defined" | homepage hero slide 1 | https://www.python.org/ (2026-10-31) |
| "Quick & Easy to Learn" | homepage hero slide 5 | https://www.python.org/ (2026-10-31) |
| "Get Started" | homepage widget | https://www.python.org/ (2026-10-31) |

## Voice

Tone words: Plain, Welcoming, Confident, Precise.

Traits:
- Readable, but not Clever (published)
- Simple, but not Esoteric (published)
- Confident, but not Alarmist (published)
- Respectful, but not Condescending (published)
- Inclusive, but not Exclusionary (published)
- Practical, but not Purist (published)

- Two voices. The python.org homepage speaks in short, friendly, factual lines to newcomers and experienced developers alike; Title Case labels, a code sample as the hero, links named after where they go. The documentation voice (devguide style guide) is plainer still: simple words for a world-wide audience, affirmative statements, no hype.
- A landing page follows the homepage voice and anatomy. The docs rules (simple language, no Latin abbreviations, inclusive terms, affirmative tone) apply to all body copy.
- Respect the reader's intelligence: lay out the information and connect the dots without talking down (devguide, Audience).
- State what Python does and how to use it well; leave value judgements like "experts only" out (devguide, Affirmative tone).
- Trademark grammar: "Python" is an adjective before a generic noun (the Python programming language), never a verb (PSF trademark policy).
- Show, then tell: the homepage leads with runnable code and a one-line explanation, the way the docs prefer short concrete examples.

Rules a copy check enforces:
- Title case headlines
- In documentation, sentence case section titles are preferred; consistency within a unit matters more
- Use simple language; avoid esoteric phrasing for a world-wide audience
- Say "for example", not "e.g."
- Say "that is", not "i.e."
- Spell out an acronym at first use, full term first with the acronym in parentheses; HTML and UTF-8 need no expansion
- Say "allowlist", not "whitelist"
- Say "blocklist", not "blacklist"
- Say "main, parent/child, server/client, primary/secondary", not "master/slave"
- Say "free-threaded", not "No-GIL"
- Hyphenate open-source as an adjective (open-source software); no hyphen as a noun (open source is a collaboration model)
- Python is always capitalized; Unicode capitalized; reST starts lowercase; POSIX uppercase
- Affirmative tone: state what the language does; no "dangerous" or "experts only" except real security risks
- Economy of expression: err on the side of succinct
- No author bylines on community documentation
- Use "Python" as an adjective followed by a generic noun; never as a verb
- First or most prominent mention of the Python word mark takes ®, except email, online discussion, non-graphical ads and academic papers
- Third parties add a notice: "Python" and the Python Logo are trademarks of the PSF, and a non-affiliation line

Their words: allowlist, blocklist, free-threaded, for example, that is.
Never: whitelist, blacklist, master/slave, e.g., i.e., experts only, No-GIL.

## Color

| Name | Hex | Role | Use |
|---|---|---|---|
| Python blue | #3776AB | accent | Links, icons, sitemap headings, nav gradient start, the Python tab rule. Published as --color-blue ("Python blue" in the Sass). |
| Python yellow | #FFD343 | accent_secondary | Every action and highlight on blue: Donate, PSF buttons, slide headings, read-more links. Published as --color-yellow ("Python yellow"). |
| Blue medium | #2B5B84 | night | Header, PSF band and footer base, always as a gradient from #1E415E. Published --color-blue-medium. |
| Blue dark | #1E415E | night gradient start | Top of the blue gradients. Published --color-blue-dark. |
| Darker blue | #1E2933 | deepest ground | Network bar, options bar, code panel; link hover. Sass $darkerblue. |
| Default text | #444444 | ink | Body and widget titles. Published --color-default. |
| Grey | #666666 | ink_muted | Footer links, quote text, tags. |
| Grey lighter | #CACCCE | hairline / text on blue | List rules; intro and PSF text on blue. |
| Grey lightest | #E6E8EA | surface | Footer sitemap ground, tag fill, nav text on blue. |
| Content ground | #F9F9F9 | paper | Content band (gradient from #FCFCFC). Observed. |
| Network: PSF / PyPI / Jobs / Community | #82B043 | network tab rules | Green PyPI; with grey #78797A (PSF), purple #A06BA7 (Jobs), red #B55863 (Community), yellow (Docs), blue (Python). Rules only, never fills. |
| Logo blue / yellow | #306998 | logo | Snake gradients #5A9FD4 to #306998 and #FFD43B to #FFE873, from the official SVG; wordmark #646464. |

## Typography

| Role | Their face | Licence | Open stand-in (Google Fonts) | Fallback |
|---|---|---|---|---|
| display | Flux | Commercial; the PSF owns a copy but cannot distribute it except for PSF work | Abel | "Source Sans Pro", Arial, sans-serif |
| body | Source Sans Pro | Open (SIL OFL 1.1), Adobe; webfont files ship in the open-source site repo with the OFL text | Source Sans 3 | "Source Sans 3", Arial, sans-serif |
| mono | Consolas | System fonts (Consolas is Microsoft's; the stack ends in Courier New and generic monospace) | Inconsolata | "Lucida Console", "Liberation Mono", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Courier New", monospace, sans-serif |

| Role | Token | Face | Desktop | Phone | Line height | Tracking | Weight |
|---|---|---|---|---|---|---|---|
| Widget / band title (Flux-Regular) | --text-title-* | display | 24.15px | 24.15px | 1.25 | 0px | 400 |
| Intro line | --text-lead-* | body | 24px | 20px | 1.4 | 0px | 400 |
| Slide heading | --text-slide-heading-* | body | 21px | 21px | 1 | 0px | 700 |
| Main nav item | --text-nav-* | body | 18px | 18px | 1.625 | 0.18px | 400 |
| Footer base link (Flux-Bold) | --text-footer-base-* | display | 18.11px | 20.7px | 1.625 | 0px | 400 |
| Sitemap heading (Flux-Bold) | --text-sitemap-heading-* | display | 17.5px | 20px | 1.625 | 0px | 400 |
| Quote | --text-quote-* | body | 18px | 16px | 1.75 | 0px | 400 |
| Body | --text-body-* | body | 16px | 16px | 1.625 | 0px | 400 |
| Widget text | --text-widget-* | body | 15px | 16px | 1.625 | 0px | 400 |
| Sitemap link / attribution | --text-small-* | body | 14px | 16px | 1.625 | 0px | 400 |
| Tag | --text-tag-* | body | 13.125px | 14px | 1.625 | 0px | 400 |
| Copyright | --text-legal-* | body | 11.9px | 10.2px | 1.625 | 0px | 400 |
| Code sample | --text-code-* | mono | 16px | 16px | 1.5 | 0px | 400 |

## Layout

Measured on https://www.python.org/: Logo rules from the PSF logo page, trademark policy, trademark FAQ and Python Logo Usage Guidelines PDF v1.0; colour and type tokens from the open-source python.org stylesheet (python/pythondotorg); page anatomy measured on www.python.org at 1440 and 390 with Playwright, 2026-10-31.

| Measure | Desktop (1440) | Phone (390) |
|---|---|---|
| Page margin | 144px | 4px |
| Section padding | 40px | 4px |
| Container max width | 1200px | full |
| Hero text width | max 1096px | full |
| Grid columns | 4 | 1 |
| Gutter | 24px | 0px |
| Card gap | 24px | 24px |
| Navigation height | 55px | 55px |

Breakpoints from Python's CSS: 400, 480, 520, 640, 800, 940, 1024, 1200px.

Homepage bands, top to bottom (observed):
1. Python Network bar
   - Desktop: 1440x46; tabs 200px each in a 1200px container at x 120
   - Phone: expanded at the top as full-width 45px rows between the "Close" (Pythonicon U+E61D) and "The Python Network" (U+E61A) 42px bars (358px)
   - 3px coloured top rule per tab; the current tab has a white label, dark gradient and an 8px triangle
2. Header row
   - Desktop: y 47-161; logo 290x82 at x 136 y 63; options bar 435x59 at x 869 y 80
   - Phone: logo centred, full-width Donate, 2-row options bar
   - Yellow Donate is the only coloured button in the header
3. Main navigation bar
   - Desktop: 1168x55 at x 136 y 161, radius 8px
   - Phone: hidden below 640px; no menu button (the footer sitemap is the phone navigation)
   - Bevelled 1px dividers; hover gradient #326B9C to #2D618C
4. Hero carousel
   - Desktop: 980x304 at x 222 y 217, two 490px halves
   - Phone: hidden
   - Slide 1 at rest; fades every 8s
5. Intro line
   - Desktop: centred, 24px/33.6px #CACCCE, y 542-611, 2 lines
   - Phone: left, 20px/28px, 3 lines
   - Header ends at y 632 with a 1px #444444 rule
6. Notice bar
   - Desktop: 1094x67 at x 152 y 681, radius 16px
   - Phone: 363x145, button full width
   - Live content
7. Small widgets
   - Desktop: 4 x 269.6px, gap 24.5px, y 756
   - Phone: stacked, 382px
   - 4px #75A8D3 top rule, glyph + Flux title, 15px text, blue link
8. List widgets
   - Desktop: 2 x 563.7px, y 1009, 5 rows of 38.5px
   - Phone: stacked; dates as MM-DD
   - Hairline #CACCCE rows; >>> More at top right
9. Stories and uses
   - Desktop: 2 x 563.7px, y 1295
   - Phone: stacked
   - Yellow Georgia-italic quote bubble; grey tag chips
10. PSF band
   - Desktop: 1152x224 at x 144 y 1757
   - Phone: 382x328, no logo, stacked buttons
   - Device 210px square crop at right
11. Sitemap footer
   - Desktop: y 2033-2591, columns 196px from x 132
   - Phone: one centred column, Back to Top bars
   - Flux-Bold blue headings, grey 14px links
12. Site base
   - Desktop: y 2591-2694, centred
   - Phone: links stacked, 289px tall
   - #89B4D9 Flux-Bold links; 11.9px #75A8D3 copyright

## Page anatomy

How Python's own landing pages are built, part by part (observed; https://www.python.org/, 2026-10-31). A homepage pattern, not a brand law: follow it for landing pages.

**Navigation**
- summary: Three stacked strips on one blue header: a dark Python Network bar of six equal colour-coded tabs; a header row with the white-wordmark Python logo at left and, at right, a yellow Donate button and a dark rounded options bar (search, GO, Socialize); then a glossy blue rounded main-nav bar of seven centred items.
- ground: Network bar #1E2933 (1px #1F3B47 bottom). Header from y 46: linear-gradient(#1E415E 10%, #2B5B84 90%) with 1px #191919 top border, 1px #444444 bottom border and inset shadows 0 0 50px and 0 0 20px rgba(0,0,0,0.03). The same header ground continues behind the hero and intro, down to y 632.
- height: network bar 46px (y 0-46); header logo row y 47-161; main nav 55px (y 161-216); whole blue header 586px (y 46-632) including the hero
- border: Main nav: 1px #629CCD top, 1px #18334B bottom, radius 8px, box-shadow 0 0 10px rgba(0,0,0,0.2)
- network bar: container x 120-1320 (1200px); 6 tabs of 200px: Python x 120, PSF 320, Docs 520, PyPI 720, Jobs 920, Community 1120; tab height 45.4px; border-top 3px in the tab colour (Python #3776AB, PSF #78797A, Docs #FFD343, PyPI #82B043, Jobs #A06BA7, Community #B55863); border-left 1px #273643, border-right 1px #11171D; label 16px/28px Source Sans Pro Regular, centred, padding 8px 12px 6.4px; inactive #999999 on the bar ground; current (Python) #FFFFFF on linear-gradient(#13191E 10%, #1F2A32 90%); current marker an 8px CSS triangle (border 8px, top colour = tab colour #3776AB) hanging from the top edge, centred in the current tab; hover/focus on any tab shows the same gradient, white text and its own coloured triangle; links Python /, PSF https://www.python.org/psf/, Docs https://docs.python.org, PyPI https://pypi.org/, Jobs /jobs/, Community /community/
- logo: variant Combined logo, reversed for dark grounds: full-colour two-snakes device (blue and yellow, soft drop shadow) with a white-to-light-grey "python" wordmark and TM; px 290x82 (a 580x164 PNG at 2x); position x 136, y 63, left of the header row; phone centred 218x62 at y 374; file https://www.python.org/static/img/python-logo.png
- links: count 7; labels About, Downloads, Documentation, Community, Success Stories, News, Events; size 18px/29.25px; weight 400; tracking 0.18px; color #E6E8EA; hover/focus #FFFFFF on linear-gradient(#326B9C 10%, #2D618C 90%); alignment centred group inside the 1168px bar (x 136-1304): items at x 286 (About, 91w), 378 (Downloads, 131w), 510 (Documentation, 165w), 675 (Community, 135w), 811 (Success Stories, 163w), 974 (News, 87w), 1062 (Events, 96w); padding 11.7px 22.5px 9.9px; each item has a 1px rgba(0,0,0,0.2) right edge and a 1px rgba(255,255,255,0.1) left edge (bevelled dividers); bar ground linear-gradient(#3776AB 30%, #2D618C 95%); dropdowns every item has a dropdown: ground linear-gradient(#BBD4E9 10%, #D6E5F2 90%), 1px #18334B top border, shadow 0 0.5em 0.5em rgba(0,0,0,0.3); opens on hover after a 0.25s delay. Items: About (Applications, Quotes, Getting Started, Help); Downloads (All releases, Source code, Windows, macOS, Android, iOS, Other Platforms, License, Alternative Implementations); Documentation (Docs, Audio/Visual Talks, Beginner's Guide, FAQ, Non-English Docs, PEP Index, Python Books, Python Essays); Community (Diversity, Mailing Lists, IRC, Forums, PSF Annual Impact Report, Python Conferences, Special Interest Groups, Python Logo, Python Wiki, Code of Conduct, Community Awards, Get Involved, Shared Stories); Success Stories (Arts, Business, Education, Engineering, Government, Scientific, Software Development); News (Python News, PSF Newsletter, PSF News, PyCon US News, Python Insider, News from the Community); Events (Python Events, User Group Events, Python Events Archive, User Group Events Archive, Submit an Event)
- actions:
  - Donate: yellow button: linear-gradient(#FFDF76 10%, #FFD343 90%) over #FFD343, 1px solid #DCA900, radius 6px, text #4D4D4D Source Sans Pro Regular, text-shadow 1px 1px 1px rgba(255,255,255,0.3), box-shadow 1px 1px 1px rgba(0,0,0,0.05) and inset 0 0 5px rgba(255,255,255,0.5); hover gradient #FFEBA9 10% to #FFD343 90%; 16px/26px, padding 6.4px 12px 5.6px, 75x32 at x 786 y 94, 8px left of the options bar
  - Options bar: #1E2933 box x 869 y 80, 435x59, radius 6px, 1px #2D3E4D top and #070A0C bottom edge, floated right with 21px vertical margin
  - Search: Pythonicon search-alt glyph (U+E613) 28px #BBBBBB at x 872; white input 224x37 at x 922 (padding 6.4px 8px 4.8px, placeholder "Search"); GO: blue button: linear-gradient(#3776AB 10%, #2B5B84 90%), 1px border #3D83BE top/left and #3776AB right/bottom, radius 6px, text #E6E8EA, inset 0 0 5px rgba(55,118,171,0.2); hover gradient #316998 10% to #244E71 90%, text #F2F4F6; 16px, 46x40 at x 1157
  - Socialize: text item 16px #BBBBBB, padding 16px 16px 14px, 91x46 at x 1212, divided from search by a 1px #070A0C rule; hover #555 on #CACCCE; menu: LinkedIn, Mastodon, Chat on IRC, Twitter
  - A A (text size: Smaller, Larger, Reset) is in the markup but hidden at rest on desktop
- sticky: not sticky; the whole header scrolls away
- phone: shows At rest the network bar renders expanded at the very top (y 0-358): a "Close" bar (42px, #11171D, #999999 16px/28px centred, padding 8px 12px 6.4px) whose label is preceded by the Pythonicon arrow-down glyph U+E61D (16px #999999, a rounded square with a down arrow, margin-right 8px); the six tabs as full-width 45px rows with their 3px coloured top rules (Python current: white on the dark gradient); then a "The Python Network" bar (42px, #11171D) preceded by Pythonicon arrow-up U+E61A (same treatment). NEVER use plain ▼/▲ text triangles. Below it the blue header (y 358-806, 448px tall): logo centred 218x62; Donate as a full-width yellow button 336x40 (y 451, 11px side margin); then the options bar: #1E2933 ground, 1px #2D3E4D border, radius 6px, 358x149 at x 16 y 507, margin-bottom 21px. Options bar row 1 (y 508-607, 99px): a centred search block 128px wide (x 131): the magnifier glyph + a transparent 72px "Search" field (16px #BBBBBB) on one line (y 516), and the blue GO button 46x40 directly BELOW at x 134 y 555 (GO is VISIBLE on phone, margin-bottom 7px). A 2px rule (1px #070A0C over 1px of the bar) at y 607 splits the rows. Row 2 (y 609-655, 46px): "Socialize" centred in a 93px cell (x 148-241) with vertical 1px dark rules either side; the left and right cells are empty. "≡ Menu" exists in the HTML but is display:none at 390 and 1440: do not show it.; menu No menu button shows at 390 ("≡ Menu" is display:none); the main-nav bar is not shown below 640px; the footer sitemap is the phone navigation.; cta Donate is the only button above the fold
- utility labels: Skip to content (screen-reader link), Close (icon U+E61D), The Python Network (icon U+E61A), Donate, Search This Site (screen-reader label), Search (field placeholder), GO, Socialize. "≡ Menu" is in the markup but hidden at every measured width.

**Hero**
- summary: Inside the blue header, under the main nav: a 980x304 two-panel carousel. Left half is an interactive-shell code sample in a monospace stack on the darkest navy with a yellow ">_" launch button; right half is a navy copy panel with a yellow 21px heading, three to four lines of grey-white text with a yellow underlined link, and five small numbered blue buttons. Under it, a centred two-line intro sentence in light grey with a yellow ">>> Learn More" link.
- desktop: section carousel x 222-1202, y 217-521 (980x304, max-width 980, margin 0 70px inside the 1120px banner at x 152); intro y 542-611; header ends y 632; column split 2 equal halves of 490px: code panel x 222-712, copy panel x 712-1202; vertical anchors carousel top y 217 (flush under the nav bar at y 216); code first line y 240; slide heading y 237; slide text y 267-371; slide-number buttons y 468-498; carousel bottom y 521; intro lines y 542 and y 579; header bottom y 632; text max width slide copy 410px (copy panel padding 20px 40px); intro text box 1096px, centred, forced line break after "quickly" from 800px up; media no image: the code sample is the media; cta size launch-shell button 45x45; slide numbers 34x30; intro link is text
- phone: order carousel hidden below 640px; the intro sentence follows the options bar directly; alignment intro box x 16, 358px wide, margin 17.5px 0, padding 5px 10px (the text column is x 26-364, 338px). 20px/28px Source Sans Pro Regular #CACCCE, left-aligned, exactly 3 lines, text y 699-783: "...lets you work quickly and integrate" / "systems more effectively. ››› Learn More" wrap as in the reference. Keep the 10px side padding; with the SSP chevron mark the sentence fits 3 lines.; sizes header y 358-806 (448px tall). Phone y-positions given further down this spec for the content band were measured against a 414px header; with this 448px header everything below shifts down 34px: follow heights and gaps, not absolute ys.; prov observed; source https://www.python.org/ (observed 2026-10-31, Playwright 390/1440)
- at rest: slide Slide 1 of 5 shows at rest (the carousel then fades every 8s; animation only). Slide 1: code "# Write Fibonacci series up to n" defining fib(n) and printing the series to 987; heading "Functions Defined"; link "More about defining functions"; code panel ground #1E2933 (the slideshow ground) with box-shadow inset 0 0 30px rgba(0,0,0,0.6); padding 20px 24px; pre/code 16px/24px in the stack Consolas, "Lucida Console", "Liberation Mono", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Courier New", monospace (Courier New on macOS). Token colours: comment and output #DDDDDD; prompts >>> and ... #C65D09 bold; keywords #6AB825 bold; function names #447FCF; numbers #3677A9; operators #999999; strings #ED9D13; builtins #24909D; names and punctuation #0D870D. Wrapping: pre uses white-space: pre-wrap inside the 442px text column (490 - 2x24 padding); the output line "0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610" fills line 1 and "987" WRAPS to its own line 2. Never use white-space:pre with overflow hidden. 11 lines total; last line "987" at the panel bottom.; copy panel ground #1C3B56, 490x280 (it stops 24px short of the carousel bottom, so a 24px strip of #1E2933 shows under it), padding 20px 40px; heading 21px/21px Source Sans Pro Bold #FFD343, margin-bottom 9px; text 16px/26px Regular #E6E8EA; link #FFD343 with a 1px #FFDF76 bottom border (hover: white); paging five 34x30 buttons labelled 1-5, x 860, 902, 944, 986, 1028 (8px gaps), y 468, centred in the copy panel bottom with 16px padding below: blue button: linear-gradient(#3776AB 10%, #2B5B84 90%), 1px border #3D83BE top/left and #3776AB right/bottom, radius 6px, text #E6E8EA, inset 0 0 5px rgba(55,118,171,0.2); hover gradient #316998 10% to #244E71 90%, text #F2F4F6; 16px/16px; inactive opacity 0.7, active (1) opacity 1 with #FFD343 numeral; launch shell ">_" button 45x45 at x 648 y 237 (top-right corner of the code panel, 24px in): yellow button: linear-gradient(#FFDF76 10%, #FFD343 90%) over #FFD343, 1px solid #DCA900, radius 6px, text #4D4D4D Source Sans Pro Regular, text-shadow 1px 1px 1px rgba(255,255,255,0.3), box-shadow 1px 1px 1px rgba(0,0,0,0.05) and inset 0 0 5px rgba(255,255,255,0.5); hover gradient #FFEBA9 10% to #FFD343 90%; label Flux-Regular 19.2px, tracking -1.2px; its "Launch Interactive Shell" label is screen-reader only; intro 24px/33.6px Source Sans Pro Regular #CACCCE, centred; link "Learn More" #FFD343 underlined, preceded by the read-more mark: "›››" (three U+203A single right-pointing angle quotes) set in Source Sans Pro Bold 700 at 144% of the surrounding text size, letter-spacing -0.0625em, 0.25em gap before the label, in the link colour. NEVER type three ">" characters and NEVER set the mark in Abel: Flux's ">" is a narrow chevron, and Abel's ">" is a broad wedge twice as wide (47.3px vs 24.0px at 28.8px). Measured 2026-10-31 on python.org: Flux ">>>" 28.8px = 24.0px wide; SSP Bold "›››" 34.56px = 23.8px wide, same chevron shape (here 34.56px, 23.8px wide); hover white
- media: none (code sample)
- type: slide heading Source Sans Pro Bold 21px #FFD343; slide text 16/26 #E6E8EA; code 16/24 mono; intro 24/33.6 #CACCCE (phone 20/28)
- cta: no hero button: the actions are the ">_" shell launcher, the slide links and the yellow ">>> Learn More" link
- proof: the code itself; no logos or numbers
- slides:
  - Functions Defined (fib to 1000) — More about defining functions
  - All the Flow You'd Expect (for loop over a list) — More control flow tools
  - Compound Data Types (list comprehension, enumerate) — More about lists
  - Intuitive Interpretation (arithmetic, true and floor division) — More about simple math functions
  - Quick & Easy to Learn (print, input, f-string) — Whet your appetite
- copy note: Slide titles and link labels verbatim, observed 2026-10-31; slide body copy is 2-4 lines per slide (paraphrase it: one plain sentence on what the code shows, then a link to the matching docs page).

**Notice bar**
- summary: A rounded yellow pill-bar announcing one item, centred text and a grey See more button; the first thing in the light content band.
- ground: Content band behind it: linear-gradient(#FCFCFC 10%, #F9F9F9 90%) from y 633 to 2033. The bar: #FFDF76
- desktop: box x 152-1246 (1094x67) at y 681, margin 8px, padding 10px, border-radius 16px; text 16px/26px #664E04 centred, one line x 297-1013; button See more 89x40 at x 1024 y 691: linear-gradient(#D9D9D9 10%, #CCCCCC 90%), 1px solid #006DAD, radius 6px, #4D4D4D 16px, padding 6.4px 12px 5.6px; hover gradient #E6E6E6 to #D9D9D9, text #1A1A1A
- phone: box 363x145 at x 12 y 785, text wraps to 3 centred lines; button full width 343x40 under the text
- anatomy:
  - An icon slot precedes the text (font-awesome fa-chart-line, which the site's FA 4.7 lacks, so it renders blank: leave it out)
  - Content is live: on 2026-10-31 a security notice about certifi, pip, uv and sigstore; treat as an example
- components:
  - notice bar
  - grey button

**Four small widgets: Get Started, Download, Docs, Jobs**
- summary: Four equal columns, each topped by a 4px light-blue rule, an icon-font glyph plus a Flux title, two or three lines of text and one blue link.
- ground: content band (#FCFCFC to #F9F9F9); widgets have no fill
- desktop: band y 756-993; main column x 144-1296 (1152px); grid 4 columns 269.6px with 24.5px gaps: x 144, 438, 732, 1026; widget border-top 4px solid #75A8D3, padding 20px; heights 213/188/188/237 (content-driven, top-aligned); title y 780
- phone: grid 1 column, full width 382px (x 4, the container has only 4px padding); stack Get Started y 938, Download 1133, Docs 1303, Jobs 1498; text 16px/26px
- anatomy:
  - Title: Flux-Regular 24.15px/30.19px #444444, margin-bottom 2.4px; preceded by a Pythonicon glyph at 21.13px #3776AB with 6px gap: get-started U+E616 (power symbol), download U+E609, documentation U+E60A, jobs U+E606
  - Text: Source Sans Pro 15px/24.375px #444444, paragraph margin-bottom 13.1px; bold runs in Source Sans Pro Bold (Jobs: "relaunched community-run job board")
  - Link line: 15px #3776AB, no underline, hover #1E2933. Labels: "Start with our Beginner's Guide"; "Latest: Python 3.15.2" (version observed 2026-10-31, live); "docs.python.org"; "jobs.python.org"
  - Body line counts at 1440 (text column 229.6px, 15px/24.375px): Get Started 4 lines, Download 3 lines, Docs 3 lines, Jobs 5 lines (with the bold run), each followed by the link line. Write plain example copy of that length (about 7, 6, 6 and 9 words per line); these counts produce the 213/188/188/237 heights. On phone the same copy reflows at 342px; heights are then content-driven (observed 195/170/195/196), do not force them.
- components:
  - small widget
  - icon-font title
  - text link

**Latest News and Upcoming Events**
- summary: Two half-width list widgets: icon + Flux title, a grey ">>> More" link top-right, then five dated rows split by hairlines.
- ground: content band
- desktop: band y 1009-1279; grid 2 columns 563.7px, gap 24.5px: x 144 and 732; widget same 4px #75A8D3 top rule and 20px padding as the small widgets; rows first row y 1066; each row 38.5px
- phone: grid 1 column 382px; News y 1694 (361 tall), Events y 2055 (335); rows 67px rows: date shows month-day only (the "2026-" part is hidden), titles wrap to 2 lines in 278px; left padding 64px; more the More links are hidden
- anatomy:
  - Title glyphs: news U+E603, calendar U+E60E; titles "Latest News", "Upcoming Events"
  - More link: absolute top 0.25em right 0.25em; 15px #999999, hover #666666; prefixed by the read-more mark (SSP Bold "›››" at 21.6px, -0.0625em, never ">>>" in Abel). Labels "More news" (News) and "More" (Events)
  - Row: border-top 1px solid #CACCCE, padding 6.56px 0 6.56px 105px, 15px/24.375px; ISO date (2026-10-29) absolutely placed at left in #444444; title link #3776AB
  - Rows are live content. The ten rows on 2026-10-31 (observed; use them as the example set, they are public headlines and dates, not marketing claims): News: 2026-10-29 "Announcing PSF Community Service Award Recipients!"; 2026-10-26 "Python 3.15.2, 3.14.10, 3.13.18, 3.12.16 and 3.11.18 are out"; 2026-10-22 "Mark Your Calendars! PSF Board Office Hours for the Year Ahead"; 2026-10-21 "Python 3.15.1, 3.14.9 and 3.13.17 are out"; 2026-10-20 "Wikis: Relaunched!". Events: 2026-11-06 "PyCon ES 2026"; 2026-11-07 "Python El Salvador vuelve — Meetup de Reactivación"; 2026-11-11 "Edmonton.py: The Edmonton Python User Group"; 2026-11-12 "Python Help"; 2026-11-12 "Python Leiden User Group". Every row is one line at 1440.
- components:
  - list widget
  - dated row
  - more link

**Success Stories and Use Python for…**
- summary: Left: a big yellow italic quote bubble with a tail and a grey attribution strip. Right: six application rows, each a bold label followed by small grey tag chips.
- ground: content band
- desktop: band y 1295-1741; grid 2 columns 563.7px as above; the right widget has 12px left padding; quote blockquote x 164 y 1352, 524x299; attribution y 1660, 524x62; apps rows from y 1353, 38.9px each
- phone: quote Georgia italic 16px/28px, 342 wide, padding 11.2px 16px 14px; apps rows 93px rows (label then wrapped tags), tags 14px; stack Success Stories y 2389, Use Python for… y 2874
- anatomy:
  - Titles: glyph success-stories U+E625 + "Success Stories"; glyph python U+E614 + "Use Python for…" (with an ellipsis character); both with a ">>> More" link
  - Quote: Georgia italic 18px/31.5px #666666 on linear-gradient(#FFE58F 10%, #FFDF76 90%), 3px solid #FFEBA9 top and bottom borders, radius 6px, padding 18px 25.2px 23.4px; the whole quote is a link (hover #3776AB)
  - Tail: a 27px CSS triangle in #FFDF76 pointing down from the quote bottom, 105px from its left edge
  - Attribution: a #F6F6F6 table row, padding 0.5em, 14px/22.75px: story title link #3571A3 then "by <name>" in Source Sans Pro Italic #444444
  - Stories rotate per page load (observed 2026-10-31: Lincoln Loop). The bubble text is a customer story in the customer's own first-person-company voice, NOT the language definition or PSF boilerplate: about 75 words that set in exactly 8 lines at 473px (524 - 2x25.2 padding) in Georgia italic 18px/31.5px, filling the bubble (299px = 8x31.5 + padding 18 + 23.4 + 2x3px borders), no empty yellow space. Example at rest: a paraphrase of the Lincoln Loop story (an agency founded in 2007 that builds client sites with Python and Django and credits the language's practicality, PyPI and the community for its success). Attribution strip under the tail (styled as the Attribution line above): story title link "Lincoln Loop: Building a sustainable business inspired by Python's ethos" then " by Peter Baumgartner", wrapping to 2 lines (observed 2026-10-31).
  - Application rows: border-bottom 1px solid #CACCCE, padding 7.5px 0 6px; label 15px Source Sans Pro Bold #444444 + ":"; tags 13.1px #666666 on #E6E8EA, 1px #F2F4F6 top and 1px #CACCCE bottom border, padding 2.6px 5.25px 1.3px, separated by ", "; hover #444444 on #D0D4D7
  - Rows and tags (verbatim, observed 2026-10-31): Web Development: Django, Pyramid, Bottle, Tornado, Flask, Litestar, FastAPI | GUI Development: tkInter, PyGObject, PyQt, PySide, Kivy, wxPython, DearPyGui | AI and Machine Learning: PyTorch, TensorFlow, scikit-learn, Transformers, Anthropic, LangChain | Scientific and Numeric: SciPy, Pandas, IPython | Software Development: Buildbot, Trac, Roundup | System Administration: Ansible, Salt, OpenStack, xonsh
- components:
  - quote bubble
  - tag chip
  - labelled row

**Python Software Foundation band**
- summary: A full-width blue box (same gradient as the header) with a yellow ">>> Python Software Foundation" title, the PSF mission in light grey, a yellow Learn more link, two yellow buttons, and the large two-snakes device at right.
- ground: linear-gradient(#1E415E 10%, #2B5B84 90%), inset shadows 0 0 50px and 0 0 20px rgba(0,0,0,0.03); radius 0
- desktop: box x 144-1296 (1152x224) at y 1757, padding 24px 28px, margin-bottom 8px; copy column x 172, 723px wide (373px right margin keeps clear of the logo); title y 1781; text y 1814-1892 (3 lines); buttons y 1892: Become a Member 141x38 at x 172, Donate to the PSF 137x38 at x 316; logo 210x210 box at x 1070 y 1765 showing the 211x262 PNG from its top-left (the bottom 52px with the shadow is cropped)
- phone: box 382 wide (x 4) at y 3435, 328 tall, padding 20px; logo hidden (below 800px); buttons full width 342x40, stacked (y 3649 and 3696), 16px
- anatomy:
  - Title: the read-more mark (SSP Bold "›››" at 34.8px, -0.0625em, 7.2px gap; replaces Flux ">>>" 28.98px) then "Python Software Foundation" in Flux-Regular 24.15px/30.19px (Abel stand-in 23.4px), all #FFD343 (link to /psf/; hover white)
  - Text: 15px/24.375px #CACCCE: the PSF mission sentence, 3 lines at 723px, ending with a ">>> Learn more" link in #FFD343 (links hover #FFF1C2)
  - Buttons: yellow button: linear-gradient(#FFDF76 10%, #FFD343 90%) over #FFD343, 1px solid #DCA900, radius 6px, text #4D4D4D Source Sans Pro Regular, text-shadow 1px 1px 1px rgba(255,255,255,0.3), box-shadow 1px 1px 1px rgba(0,0,0,0.05) and inset 0 0 5px rgba(255,255,255,0.5); hover gradient #FFEBA9 10% to #FFD343 90%; 15px, padding 6px 11.25px 5.25px, 3px apart
- components:
  - blue band
  - yellow button
  - large logo device

**Footer**
- summary: A pale grey sitemap of six columns (eight groups, two stacked) with blue Flux-Bold headings and grey links, then a blue base strip with four centred Flux-Bold links, a green status dot and a tiny copyright line.
- ground: Sitemap #E6E8EA with 1px #D8DBDE top border (y 2033-2591); base: linear-gradient(#1E415E 10%, #2B5B84 90%) with 1px #111111 top border (y 2591-2694)
- anatomy:
  - Sitemap x 132-1308: 6 columns of 196px at x 132, 328, 524, 720, 916, 1112, masonry-stacked: Events sits under About, Contributing under News. Group rhythm at 1440 (measured 2026-10-31): each group li has margin-bottom 18.375px; inside a group the heading row is 56px from group top to first link (heading text 15px below group top), link rows 35.4px pitch. So a stacked group's heading text sits 33.4px below the previous group's last link row bottom (18.375 + 15), visibly larger than the link pitch. Example: About group 197px tall (heading + 4 links); Events heading text at About top + 197 + 18.4 + 15 = +230. Contributing heading text: News group (heading + 6 links = 56 + 6x35.4 = 268px) + 18.4 + 15 below News top.
  - Headings: Flux-Bold 17.5px/28.44px #3776AB, padding 7px 8.75px 5.25px, first at y 2050; hover #222222
  - Links: 14px/22.75px #666666, padding 7px 10.5px 5.6px, 36px row pitch; hover fill #ECEDEF, text #444444
  - About: Applications, Quotes, Getting Started, Help | Downloads: All releases, Source code, Windows, macOS, Android, iOS, Other Platforms, License, Alternative Implementations | Documentation: Docs, Audio/Visual Talks, Beginner's Guide, FAQ, Non-English Docs, PEP Index, Python Books, Python Essays | Community: Diversity, Mailing Lists, IRC, Forums, PSF Annual Impact Report, Python Conferences, Special Interest Groups, Python Logo, Python Wiki, Code of Conduct, Community Awards, Get Involved, Shared Stories | Success Stories: Arts, Business, Education, Engineering, Government, Scientific, Software Development | News: Python News, PSF Newsletter, PSF News, PyCon US News, Python Insider, News from the Community | Events: Python Events, User Group Events, Python Events Archive, User Group Events Archive, Submit an Event | Contributing: Developer's Guide, Issue Tracker, python-dev list, Core Mentorship, Report a Security Issue
  - Base links, centred row at y 2608: "Help & General Contact" (x 412), "Diversity Initiatives" (606), "Submit Website Bug" (770), "Status" (941) + 12px #008000 circle; Flux-Bold 18.11px/29.43px #89B4D9, padding 5.4px 13.6px; hover #FFF7DC with text-shadow 0 0 5px rgba(255,211,67,0.2)
  - Copyright line y 2660, 11.9px #75A8D3 centred: "Copyright ©2001-2026." then links "Python Software Foundation", "Legal Statements", "Privacy Notice", each with a 1px dotted #4F90C6 underline (hover white)
  - No street address or phone number on the homepage
- phone: Footer opens with a "▲ Back to Top" bar (366x42 at x 12, margin 12px 0, #E0E3E5, 1px #DBDEE1 bottom, #666666 16px/26px centred, padding 8px 12px 6.4px). The eight groups stack in one column 366px wide at x 12: heading row 47px (heading Flux-Bold 20px/32.5px #3776AB; Abel 20px + 0.25px stroke), then link rows of 42.5px pitch (16px/26px #666666, padding as desktop), margin-bottom 21px after each group. Group heights: About 218 (47 + 4x42.5), Downloads 430 (9 links), Documentation 387 (8), Community 600 (13), Success Stories 345 (7), News 302 (6), Events 260 (5), Contributing 260 (5). A second Back to Top closes the list. Base: 289px tall, the four links stacked and centred, 52px rows in Flux-Bold 20.7px (Abel 20.7px + 0.25px stroke); copyright 10.2px on 2 lines.

**On dark grounds**
- secondary button: yellow button (yellow button: linear-gradient(#FFDF76 10%, #FFD343 90%) over #FFD343, 1px solid #DCA900, radius 6px, text #4D4D4D Source Sans Pro Regular, text-shadow 1px 1px 1px rgba(255,255,255,0.3), box-shadow 1px 1px 1px rgba(0,0,0,0.05) and inset 0 0 5px rgba(255,255,255,0.5); hover gradient #FFEBA9 10% to #FFD343 90%) is the action on blue; blue button for search/paging on the darkest navy
- link: #FFD343 on blue and navy (slide links underlined with 1px #FFDF76; intro link underlined); hover white
- muted text: #CACCCE (intro, PSF text), #E6E8EA (nav, slide text), #BBBBBB / #999999 (network bar)
- hairline: 1px rgba(0,0,0,0.2) + 1px rgba(255,255,255,0.1) bevel dividers in the nav; #1F3B47 under the network bar
- logo variant: combined logo with the light wordmark (header-python-logo.png) on blue; the device alone, large, in the PSF band

## Components

- **button yellow** (observed): fill #FFD343, text #4D4D4D, border 1px solid #DCA900, radius 6, padding 6.4px 12px 5.6px, padding x 12, font size 16, weight 400, face body, ring px 1, ring #DCA900, gradient linear-gradient(#FFDF76 10%, #FFD343 90%), text shadow 1px 1px 1px rgba(255,255,255,0.3), shadow 1px 1px 1px rgba(0,0,0,0.05), inset 0 0 5px rgba(255,255,255,0.5), example Donate (75x32, header); Become a Member / Donate to the PSF (15px, 38px tall, PSF band), height px 32, build note Build exactly this recipe: gradient, 1px border, text-shadow and shadow as listed. Do not use a flat fill.. Radius is the published --border-radius-default 6px
  - hover (observed): gradient linear-gradient(#FFEBA9 10%, #FFD343 90%)
- **button blue** (observed): fill #2B5B84, text #E6E8EA, border 1px solid #3776AB, lighter #3D83BE top and left, radius 6, padding 6.4px 12px 5.6px, padding x 12, font size 16, weight 400, face body, ring px 1, ring #3776AB, gradient linear-gradient(#3776AB 10%, #2B5B84 90%), shadow inset 0 0 5px rgba(55,118,171,0.2), example GO (46x40), slide numbers (34x30, opacity 0.7 until active), height px 40, build note Build exactly this recipe: gradient, 1px border, text-shadow and shadow as listed. Do not use a flat fill.
  - hover (observed): gradient linear-gradient(#316998 10%, #244E71 90%), text #F2F4F6
- **button grey** (observed): fill #CCCCCC, text #4D4D4D, border 1px solid #006DAD (notice bar), radius 6, padding 6.4px 12px 5.6px, padding x 12, font size 16, weight 400, face body, ring px 1, ring #006DAD, gradient linear-gradient(#D9D9D9 10%, #CCCCCC 90%), example See more (89x40) in the notice bar, height px 40, build note Build exactly this recipe: gradient, 1px border, text-shadow and shadow as listed. Do not use a flat fill.
  - hover (observed): gradient linear-gradient(#E6E6E6 10%, #D9D9D9 90%), text #1A1A1A
- **button launch shell** (observed): fill #FFD343, text #4D4D4D, radius 6, padding x 14.4, font size 19.2, weight 400, face display, ring px 1, ring #DCA900, example ">_" 45x45, Flux-Regular, tracking -1.2px, top-right of the code panel, height px 45, build note Build exactly this recipe: gradient, 1px border, text-shadow and shadow as listed. Do not use a flat fill.
- **small widget** (observed): top rule 4px solid #75A8D3, padding 20px, title Pythonicon glyph 21px #3776AB + Flux 24.15px #444444, text 15px/24.375px #444444, link #3776AB, radius 0
- **list row** (observed): border 1px solid #CACCCE top, padding 6.56px 0 6.56px 105px, date absolute left, #444444, link #3776AB 15px
- **more link** (observed): text #999999, hover #666666, prefix SSP Bold "›››" at 144% of the link size, -0.0625em, 0.25em gap (stand-in for Flux ">>>"; never literal ">>>")
- **readmore link on blue** (observed): text #FFD343, hover #FFFFFF, prefix SSP Bold "›››" at 144% of the link size, -0.0625em, 0.25em gap (stand-in for Flux ">>>")
- **quote bubble** (observed): fill #FFDF76, gradient linear-gradient(#FFE58F 10%, #FFDF76 90%), border 3px solid #FFEBA9 top and bottom, radius 6, text Georgia italic 18/31.5 #666666, tail 27px triangle #FFDF76, 105px from left
- **tag chip** (observed): fill #E6E8EA, text #666666, border 1px #F2F4F6 top, 1px #CACCCE bottom, radius 0, padding 2.6px 5.25px 1.3px, font size 13.125
  - hover (observed): fill #D0D4D7, text #444444
- **notice bar** (observed): fill #FFDF76, text #664E04, radius 16, padding 10px
- **network tab** (observed): fill transparent, text #999999, top rule 3px tab colour, marker 8px triangle in tab colour, width 200, height 45, fill current linear-gradient(#13191E 10%, #1F2A32 90%), text current #FFFFFF
- **main nav item** (observed): text #E6E8EA, font size 18, tracking 0.18px, padding 11.7px 22.5px 9.9px
  - hover (observed): text #FFFFFF, gradient linear-gradient(#326B9C 10%, #2D618C 90%)

## Motion tokens

| Name | Easing | Duration | Use | Label |
|---|---|---|---|---|
| transition-default |  | 300ms | Default transition duration (--transition-duration 0.3s) | published |
| carousel-fade | linear | 600ms | Hero slide change: fade on pointer devices, slide on touch; every 8000ms; pauses on hover and after any click | observed |
| dropdown-delay |  | 250ms | Main-nav and utility dropdowns appear after a 0.25s hover delay; on touch they fade in over 0.25s ease-in-out | observed |

## Icon tokens

Grid not published (IcoMoon font, 1024 units), stroke solid filled glyphs, not strokes (observed).
| Name | Size | Use |
|---|---|---|
| widget | 21px | glyph before widget titles (87.5% of the 24.15px title) |
| search | 28px | search-alt glyph in the options bar |

## Signature moves

### The two-snakes device

Where: logo, PSF band (large, cropped), favicon, Use Python for… title glyph.
Do: blue snake (gradient #5A9FD4 to #306998) and yellow snake (gradient #FFD43B to #FFE873) interlocked with exact gaps, chins and eyes; colours may change, the outline may not; optional soft grey shadow below. One prominent device per view.
Don't: mirror it, separate the snakes, drop an eye, outline it in a way that changes the gaps, or let graphics cross the outline.
Example: "python".

### Interpreter prompts as punctuation

Where: every read-more link (">>> Learn More", ">>> More news"), the PSF band title, the ">_" shell button, breadcrumbs.
Do: "›››" (three U+203A single right-pointing angle quotes) set in Source Sans Pro Bold 700 at 144% of the surrounding text size, letter-spacing -0.0625em, 0.25em gap before the label, in the link colour. NEVER type three ">" characters and NEVER set the mark in Abel: Flux's ">" is a narrow chevron, and Abel's ">" is a broad wedge twice as wide (47.3px vs 24.0px at 28.8px). Measured 2026-10-31 on python.org: Flux ">>>" 28.8px = 24.0px wide; SSP Bold "›››" 34.56px = 23.8px wide, same chevron shape. One per link, never in body sentences.
Don't: swap in arrows or chevrons; the prompt is the brand's arrow.
Example: ">>> Learn More", with "››› (stand-in for Flux ">>>")" set as color.

### Runnable code as the hero image

Where: homepage carousel; docs examples.
Do: a short interactive-session sample (>>> and ... prompts, output lines) on #1E2933 in a monospace stack, beside a navy copy panel naming the feature in yellow. One code panel per page.
Don't: replace the code with stock photography or illustration, or leave a trailing unused >>> prompt (devguide).
Example: ">>> fib(1000)".

### Blue ground, yellow action

Where: header, PSF band, footer base.
Do: the logo's two colours run the page: Python blue gradients (#1E415E to #2B5B84) for the frame, Python yellow #FFD343 for every action and highlight on it. Yellow marks actions and headings only.
Don't: introduce a third accent for actions; the network colours (green, purple, red, grey) belong to the tab rules only.
Example: "Donate".

### Colour-coded network tabs

Where: the top Python Network bar on every python.org page.
Do: six equal tabs, each with a 3px top rule in its own colour: Python #3776AB, PSF #78797A, Docs #FFD343, PyPI #82B043, Jobs #A06BA7, Community #B55863; the current site gets a white label and an 8px triangle. One network bar at the very top.
Don't: colour the labels themselves; colour lives in the 3px rule.
Example: "Python  PSF  Docs  PyPI  Jobs  Community".

## Messaging: rules

The homepage carries no slogan. It states one sentence (Python lets you work quickly and integrate systems more effectively), then proves it with code, a version number, news and a list of uses. The PSF adds its mission and two asks: become a member, donate.

Why it works: A language sells itself by being tried: code first, claims second, and every claim links to docs.

- One plain sentence of positioning, then evidence
- Each widget names a next step: start, download, read, find a job
- Proof is concrete: a release number, real library names, real stories
- Close with the PSF and its two asks

Sources: https://www.python.org/ (2026-10-31), https://www.python.org/about/, https://www.python.org/doc/essays/blurb/, https://www.python.org/psf/mission/

## Voice: rules

Python publishes writing rules for its documentation (devguide style guide) and, through PEP 20, the values behind them. The homepage voice is short, friendly and factual, with Title Case labels.

Why it works: A world-wide, mixed-experience audience reads faster when the language is simple, affirmative and free of jargon or alarm.

|  |  |
|---|---|
| Tone | plain, welcoming, confident, precise |
| Web labels | Title Case (observed) |
| Docs titles | sentence case preferred |
| Read more | >>> + destination name |
| Trademark | ® on first prominent use in formal pieces |

- Simple English; spell out acronyms at first use
- "for example" and "that is", never e.g./i.e.
- allowlist/blocklist, main/primary, free-threaded
- Affirmative: say what works and how
- Be succinct; short concrete code examples
- No bylines on community docs
- "Python" as an adjective before a generic noun
- Don't talk down to the reader
- Don't write "experts only" or "dangerous"
- Don't use Python as a verb
- Don't imply PSF endorsement

Do and don't:
- Do: "For example, use a with statement to close the file.". Affirmative and plain: what to do, in English words.
- Don't: "Warning: experts only, e.g. files may be lost.". Alarmist, judgemental and Latin.
- Do: "Built with the Python programming language". Python as an adjective before a generic noun.
- Don't: "Python your software today!". The policy's own example of the trademark misused as a verb.

Real examples, to look at on Python's own pages (not for reuse):
- The devguide style guide, the published voice rules: https://devguide.python.org/documentation/style-guide/

Sources: https://devguide.python.org/documentation/style-guide/, https://peps.python.org/pep-0020/, https://www.python.org/psf/trademarks/, https://www.python.org/ (2026-10-31)

## Logo: rules

The combined logo is the two-snakes device beside a "python" wordmark set in Flux Regular, with TM. The device may be used alone on the same terms. The PSF publishes the files (PNG, PSD, SVG), the Python Powered badges, and a three-page usage PDF of permitted and forbidden variants. Anyone may use the unaltered logo to refer to Python; derived logos need approval.

Why it works: One simple, primitive shape (based on Mayan snake representations, per its designer Tim Parkin) that stays recognisable in any colour, so the rule is about outline, not colour.

|  |  |
|---|---|
| Lockups | combined (device + wordmark + TM); device only; Python Powered wide and tall |
| Wordmark face | Flux Regular |
| Logo colours | blue #5A9FD4 to #306998, yellow #FFD43B to #FFE873, wordmark #646464 (official SVG) |
| Clear space | not published |
| Minimum size | not published; Python Powered ships at 70x28 smallest (wide) and 50x65 (tall) |
| Symbol | TM with the logo (unregistered); ® with the word mark |

- Use the logos in the form the PSF provides, always with the TM symbol
- Colour changes are fine; the outline shape is not
- Keep the exact gaps between the snakes, the chins and the eye size
- Rotation is allowed (approved designs usually use multiples of 45 degrees)
- Separate the device from other graphics with an outline that is fully inset or fully outset
- Graphics may sit inside the snakes if they never touch the outline
- Drop shadow is optional
- Ask psf-trademarks@python.org before any derived logo or commercial merchandise
- Don't mirror the logo horizontally or vertically
- Don't move the snakes apart or remove one
- Don't change proportions or remove the eyes
- Don't cover any part with other graphics or text
- Don't use an outline that changes the shape
- Don't place it on graphics without separation
- Don't use the old squared-off draft or the pre-2005 informal logos
- Don't use the logo for anything but the Python programming language

Do and don't:
- Do: "python". The supplied logo, unaltered, with TM.
- Don't: "nohtyp". Mirrored: a different shape, never permitted.

Real examples, to look at on Python's own pages (not for reuse):
- Permitted uses: original, device only, recoloured, inset/outset separation, rotated, graphics inside: Python-Logo-Usage-Guidelines-v1.0.pdf p.1
- Uses not permitted: covering, separating, mirroring, distorting, outlining: Python-Logo-Usage-Guidelines-v1.0.pdf p.2
- Variants in the wild that are not permitted: Python-Logo-Usage-Guidelines-v1.0.pdf p.3
- Monochrome test: reduce to one colour to check the outline: https://www.python.org/psf/trademarks-faq/
- A reflection is a different shape: not permitted: https://www.python.org/psf/trademarks-faq/
- Outset outline shrinks the gaps: refused: https://www.python.org/psf/trademarks-faq/
- Approved: rich fill that keeps the outline: https://www.python.org/psf/trademarks-faq/

Sources: https://www.python.org/community/logos/, https://www.python.org/psf/trademarks/, https://www.python.org/psf/trademarks-faq/, https://s3.dualstack.us-east-2.amazonaws.com/pythondotorg-assets/media/files/Python-Logo-Usage-Guidelines-v1.0.pdf

## Color: rules

No colour page is published. The colours come from the official logo files (blue and yellow snake gradients) and from python.org's open-source stylesheet, which names them: Python blue #3776AB, Python yellow #FFD343, blue-dark #1E415E, blue-medium #2B5B84, plus greys and a green, purple and red used only to code the network tabs.

Why it works: The logo's two colours become the site: blue for every frame, yellow for every action, so the page reads as the logo even without it.

|  |  |
|---|---|
| Python blue | #3776AB |
| Python yellow | #FFD343 |
| Blue gradient | #1E415E to #2B5B84 |
| Ink | #444444 |
| Paper | #F9F9F9 / #FFFFFF |

- Blue grounds are always the #1E415E to #2B5B84 vertical gradient (10% to 90%)
- Yellow #FFD343 marks actions, headings and links on blue only
- Light pages: #444444 text on #F9F9F9 with #3776AB links
- Network colours appear only as 3px tab rules
- Logo colours may change only under the trademark rules
- Don't set body text in yellow on light grounds
- Don't fill large areas with the tab colours
- Don't invent a new accent for buttons

Not published: colour proportions; print values (PMS, CMYK); contrast rules.

Do and don't:
- Do: "Donate". Yellow action on the blue frame.
- Don't: "Read the docs". Yellow text on a light ground disappears.

Real examples, to look at on Python's own pages (not for reuse):
- Blue frame, yellow actions, colour-coded network tabs: https://www.python.org/ (2026-10-31)

Sources: https://github.com/python/pythondotorg/blob/main/static/css/style.css, https://github.com/python/pythondotorg/blob/b806afadb9ed2e3e8e923678c07d94f649249190/static/sass/_base.scss, https://www.python.org/static/community_logos/python-logo-generic.svg, https://www.python.org/ (2026-10-31)

## Typography: rules

The logo names its face: Flux Regular, which the PSF cannot distribute. python.org uses Flux webfonts for short labels (widget titles, >>> marks, footer headings) and Source Sans Pro (open, OFL) for everything else, with Georgia italic for quotes and a system monospace stack for code.

Why it works: A narrow geometric face for labels echoes the wordmark; a sturdy humanist sans keeps long text readable.

|  |  |
|---|---|
| Wordmark | Flux Regular |
| Labels | Flux-Regular 24.15px; Flux-Bold 17.5-18px |
| Text | Source Sans Pro 15-16px |
| Base | 16px/28px |
| Scale | giga 40, mega 36, kilo 32, h1 28, h2 24, h3 21, h4 18 (Sass variables) |

- Source Sans Pro for all text; bold and italic are separate files
- Flux, or the Abel stand-in at 97% size, for labels of a few words only
- Code in the monospace stack
- Base 16px/28px rhythm (published CSS tokens)
- Title Case for widget labels on the site
- Don't set paragraphs in Flux or its stand-in
- Don't synthesise bold from Regular
- Don't distribute the Flux files

Do and don't:
- Do: "Get Started". Flux (Abel stand-in) for a two-word label.
- Don't: "Whether you're new to programming or experienced, it's easy to learn.". A paragraph in the label face.

Real examples, to look at on Python's own pages (not for reuse):
- Inner page: Source Sans Bold headings, Flux sidebar title: https://www.python.org/community/logos/ (2026-10-31)

Sources: https://www.python.org/community/logos/, https://www.python.org/psf/trademarks-faq/, https://github.com/python/pythondotorg/blob/main/static/css/style.css, https://github.com/python/pythondotorg/blob/b806afadb9ed2e3e8e923678c07d94f649249190/static/sass/_base.scss, https://www.python.org/ (2026-10-31)

## Graphic elements: rules

The recognisable bits are interpreter marks and early-web gloss: ">>>" before every read-more link, a ">_" shell button, code panels, small gradient buttons with 6px corners and a white text-shadow, widgets topped by a 4px light-blue rule, and a yellow quote bubble with a tail.

Why it works: The prompt marks make every page feel like the interpreter (our reading); the gloss is restrained to small controls so text stays plain.

|  |  |
|---|---|
| Prompt | ">>>" Flux 120%, -0.0625em |
| Widget rule | 4px #75A8D3 |
| Button radius | 6px |
| Notice radius | 16px |

- ">>>" (Flux, 120%) before read-more links
- 4px #75A8D3 top rule on every widget
- Buttons: vertical two-stop gradient, 1px border, 6px radius
- Hairlines #CACCCE between list rows
- Quotes in a yellow Georgia-italic bubble with a downward tail
- Don't use arrows or chevrons for read-more
- Don't round cards or add drop shadows to widgets

Real examples, to look at on Python's own pages (not for reuse):
- Widgets, prompts, quote bubble and tags on the homepage: https://www.python.org/ (2026-10-31)

Sources: https://www.python.org/ (2026-10-31), https://github.com/python/pythondotorg/blob/main/static/css/style.css

## Iconography: rules

Icons are an IcoMoon icon font called Pythonicon, served from the site repo: filled single-colour glyphs (power button, download arrow, document, briefcase, newspaper, calendar, the two-snakes) in Python blue before widget titles.

|  |  |
|---|---|
| Format | icon font (Pythonicon, IcoMoon) |
| Size | 21px with 24px titles |
| Colour | #3776AB |

- One glyph before a widget title, 87.5% of its size, #3776AB
- Filled shapes, one colour
- Use the Pythonicon file (supplied) rather than drawing new icons
- Don't mix outline icon sets with the filled glyphs
- Don't colour icons yellow on light grounds

Real examples, to look at on Python's own pages (not for reuse):
- The Pythonicon glyph set (SVG font): https://github.com/python/pythondotorg/blob/main/static/fonts/Pythonicon.svg

Sources: https://github.com/python/pythondotorg/tree/main/static/fonts, https://www.python.org/ (2026-10-31)

## Illustration: rules

Python publishes no illustration style and the homepage uses none. The only graphic beyond the logo and icons is code. The FAQ shows community logo designs (PyCon Zimbabwe, PyCon Israel, PyCon China) as approved derivatives, which is the nearest thing to an illustration guide.

Why it works: Code is the illustration: it shows the product itself.

|  |  |
|---|---|
| Style | not published |

- Prefer a code sample to an illustration
- Community art may decorate inside the snakes without touching the outline
- Don't invent mascots (the pre-2005 animal icon was dropped on purpose)

Real examples, to look at on Python's own pages (not for reuse):
- "Inspired by but not derived from": an approved abstract design: https://www.python.org/psf/trademarks-faq/
- PyCon Israel fills the snakes with local plant forms: https://www.python.org/psf/trademarks-faq/

Sources: https://www.python.org/psf/trademarks-faq/

## Photography: rules

No photography guidance is published and the homepage carries no photographs. Success stories are text quotes.

|  |  |
|---|---|
| Style | not published |

- No photography on a landing page; use code and quotes

Sources: https://www.python.org/ (2026-10-31)

## Motion: rules

Motion is minimal: the hero carousel fades every 8 seconds (slides on touch), dropdowns open after a 0.25s delay, and a published default transition of 0.3s.

|  |  |
|---|---|
| Carousel | fade 600ms every 8000ms |
| Transition | 0.3s (published token) |
| Dropdown delay | 0.25s |

- One animated element per page at most (the carousel); build its first slide as the static state
- Transitions 0.3s
- Pause rotation on hover
- Don't animate the logo

Sources: https://github.com/python/pythondotorg/blob/main/static/css/style.css, https://www.python.org/static/js/main-min.b1e587ad1920.js, https://www.python.org/static/stylesheets/mq.ab4b4ea88926.css

## Interface and layout: rules

A fixed 1200px container on every band, a published 12-column Susy grid (60px columns, 20px gutters) rendered as four or two equal widget columns, and a blue header that holds the network bar, logo row, nav, hero and intro in one gradient. Light content sits between blue header and blue footer base.

|  |  |
|---|---|
| Container | 1200px |
| Grid | 12 x 60px, 20px gutters (Sass) |
| Breakpoints | 640, 800, 940px |

- 1200px container, content 1152px
- Widgets 4-up or 2-up with ~24px gaps, 20px padding, 4px top rule
- Blue header, light content, grey sitemap, blue base
- Below 640px everything stacks; the carousel and main nav hide

Not published: spacing scale beyond the grid and 16/28 rhythm.

Real examples, to look at on Python's own pages (not for reuse):
- The full homepage at 1440px: https://www.python.org/ (2026-10-31)

Sources: https://github.com/python/pythondotorg/blob/b806afadb9ed2e3e8e923678c07d94f649249190/static/sass/_base.scss, https://www.python.org/static/stylesheets/mq.ab4b4ea88926.css, https://www.python.org/ (2026-10-31)

## Rules: rules

- Use the unaltered logo with TM; ask before any derivative
- Never mirror or reshape the snakes
- Python as an adjective, ® on first prominent use in formal pieces
- Add the non-affiliation notice when you are not the PSF
- Blue frames, yellow acts
- Code before claims
- Simple, affirmative, inclusive English
- Don't imply PSF endorsement or certification
- Don't name a company or product "Python ..." without approval
- Don't sell merchandise with the logo without permission
- Don't redistribute the Flux font

Sources: https://www.python.org/psf/trademarks/, https://www.python.org/psf/trademarks-faq/, https://www.python.org/community/logos/, https://devguide.python.org/documentation/style-guide/

## Applications

| Format | What | Source |
|---|---|---|
| Python Powered badge | Wide (200x80 down to 70x28) and tall (140x182 down to 50x65) badges for software built with Python, plus SVG sources. | https://www.python.org/community/logos/ |
| conference logos | Derived logos for PyCons and user groups, approved by the Trademarks Working Group when the outline is kept. | https://www.python.org/psf/trademarks-faq/ |
| merchandise | Non-commercial T-shirts and stickers with the unaltered logo are fine; selling needs permission and a suggested donation. | https://www.python.org/psf/trademarks-faq/ |
| books and courses | Nominative use of the logo; a TM notice in the imprint. | https://www.python.org/psf/trademarks-faq/ |
| PyPI | A related reserved logo maintained by the PSF for the Package Index. | https://www.python.org/psf/trademarks-faq/ |

## By format

How our engine applies Python's system to each format. Our recipe from their published rules and observed site, not something the PSF publishes. Level = how much blue gradient, yellow and prompt marks a format carries (0 plain, 5 full). Loudness runs 0 (nothing but the essentials) to 5 (the signature moves at full volume).

| Format | Loudness 0–5 | Must appear | What varies |
|---|---|---|---|
| Landing page | 3 | Build it the way www.python.org is built (kit.spec.page, homepage voice): dark network bar with six colour-ruled tabs; blue gradient header with the light-wordmark logo at left, yellow Donate and a dark options bar at right; glossy blue rounded nav; two-panel code carousel at rest on slide 1; centred grey intro with yellow ">>> Learn More"; light content band with a yellow notice, 4-up then 2-up widgets with 4px light-blue rules and Flux titles; blue PSF-style band with yellow buttons and the large device; grey sitemap; blue base | which widgets and how many rows; the code sample shown; the notice (or none) |
| Docs or guide page | 1 | Inner-page shell: same header, Source Sans Bold #3776AB headings, 15px/28px text, sidebar widget in blue; devguide voice | section nav colour by site area (PSF pages use a grey #646565 nav) |
| Deck | 2 | Combined logo with TM, blue gradient title slides, Source Sans Pro, one code sample per idea, yellow for the one action | light content slides |
| Proposal page | 1 | Light ground, #444444 text, #3776AB links, one yellow action; the non-affiliation notice if not the PSF | a code panel when the subject is technical |
| Event or community page | 4 | Unaltered logo or an approved derivative, TM, approval for any derived logo; yellow and blue | decoration inside the snakes that never touches the outline |

## Checks before anything ships

- **Logo hidden**: Cover the snakes. It should still read as python.org: blue gradient frame, yellow actions, ">>>" read-more links, a code panel, Source Sans text.
- **Monochrome test**: Flatten any logo use to one colour: the outline, gaps, chins and eyes must match the original exactly (the FAQ's own test).
- **Trademark check**: TM on the logo, Python as an adjective, no implied endorsement, non-affiliation notice when needed.

## Make it your own

Keep the system: color roles and proportions, type, layout, components, the signature moves, the voice traits and rules. Replace everything that is Python's own: name and logo, positioning, pillars, proof, taglines, boilerplate and any real line quoted above. kit.json lists these under make_it_yours.

## Not published

- Clear space around the logo: not published.
- Minimum logo size: not published (the smallest supplied Python Powered badges are 70x28 and 50x65 px).
- A brand colour page, colour proportions and print values (PMS, CMYK): not published. Hexes come from the official SVG and the open-source site stylesheet.
- A type scale for brand pieces: not published beyond the site's Sass size variables (40/36/32/28/24/21/18) and 16px/28px base.
- Flux webfont licence for third parties: not available (the PSF cannot distribute Flux); the book uses Abel as a calibrated stand-in.
- Illustration, photography and motion guidelines: not published.
- A tagline: none published; the homepage intro sentence is the closest.
- The colour of the light-wordmark header logo is not published as a lockup on the logo page; it is observed on the site only.
- Live content (notice, news, events, success story, release "Python 3.15.2") observed 2026-10-31; it changes.
- The PDF usage guide is v1.0 and undated.

Logos and reference images belong to Python. Look at them on Python's own pages; don't reuse them.
