{"id":28263566,"url":"https://github.com/servo/stylo","last_synced_at":"2026-01-16T16:45:28.456Z","repository":{"id":221328802,"uuid":"753951348","full_name":"servo/stylo","owner":"servo","description":"CSS engine that powers Servo and Firefox","archived":false,"fork":false,"pushed_at":"2026-01-15T02:06:15.000Z","size":42009,"stargazers_count":229,"open_issues_count":30,"forks_count":65,"subscribers_count":8,"default_branch":"main","last_synced_at":"2026-01-15T07:59:34.293Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/servo.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2024-02-07T05:11:50.000Z","updated_at":"2026-01-14T23:36:20.000Z","dependencies_parsed_at":"2024-04-22T19:26:28.296Z","dependency_job_id":"9deebb23-655b-4e7e-add5-40f550d4a918","html_url":"https://github.com/servo/stylo","commit_stats":null,"previous_names":["servo/style","servo/stylo"],"tags_count":11,"template":false,"template_full_name":null,"purl":"pkg:github/servo/stylo","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/servo%2Fstylo","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/servo%2Fstylo/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/servo%2Fstylo/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/servo%2Fstylo/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/servo","download_url":"https://codeload.github.com/servo/stylo/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/servo%2Fstylo/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28480079,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-16T11:59:17.896Z","status":"ssl_error","status_checked_at":"2026-01-16T11:55:55.838Z","response_time":107,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-05-20T08:11:36.986Z","updated_at":"2026-01-16T16:45:28.418Z","avatar_url":"https://github.com/servo.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"Stylo\n=====\n\n**High-Performance CSS Style Engine**\n\n[![Build Status](https://github.com/servo/stylo/actions/workflows/main.yml/badge.svg)](https://github.com/servo/stylo/actions)\n[![Crates.io](https://img.shields.io/crates/v/stylo.svg)](https://crates.io/crates/stylo)\n[![Docs](https://docs.rs/stylo/badge.svg)](https://docs.rs/stylo)\n![Crates.io License](https://img.shields.io/crates/l/stylo)\n\nStylo is a high-performance, browser-grade CSS style engine written in Rust that powers [Servo](https://servo.org) and [Firefox](https://firefox.com). This repo contains Servo’s downstream version of Stylo. The upstream version lives in mozilla-central with the rest of the Gecko/Firefox codebase.\n\nCoordination of Stylo development happens:\n\n- Here in Github Issues\n- In the [#stylo](https://servo.zulipchat.com/#narrow/channel/417109-stylo) channel of the [Servo Zulip](https://servo.zulipchat.com/)\n- In the [#layout](https://chat.mozilla.org/#/room/#layout:mozilla.org) room of the Mozilla Matrix instance (matrix.mozilla.org)\n\n## High-Level Documentation\n\n- This [Mozilla Hacks article](https://hacks.mozilla.org/2017/08/inside-a-super-fast-css-engine-quantum-css-aka-stylo) contains a high-level overview of the Stylo architecture.\n- There is a [chapter](https://book.servo.org/architecture/style.html) in the Servo Book (although it is a little out of date).\n\n## Branches\n\nThe branches are as follows:\n\n- [**upstream**](https://github.com/servo/style/tree/upstream) has upstream [mozilla-central](https://searchfox.org/mozilla-central/source/servo) filtered to the paths we care about ([style.paths](style.paths)), but is otherwise unmodified.\n- [**main**](https://github.com/servo/style/tree/ci) adds our downstream patches, plus the scripts and workflows for syncing with mozilla-central on top of **upstream**.\n\n\u003e [!WARNING]\n\u003e This repo syncs from upstream by creating a new branch and then rebasing our changes on top of it. This means that `git pull` will not work across syncs (you will need to use `git fetch`, `git reset` and `git rebase`).\n\nMore information on the syncing process is available in [SYNCING.md](SYNCING.md)\n\n## Crates\n\nA guide to the crates contained within this repo\n\n### Stylo Crates\n\nThese crates are largely implementation details of Stylo, although you may need to use some of them directly if you use Stylo.\n\n| Directory          | Crate                                                                                                               | Notes                                                                                                             |\n| ---                | ---                                                                                                                 | ---                                                                                                               |\n| style              | [![Crates.io](https://img.shields.io/crates/v/stylo.svg)](https://crates.io/crates/stylo)                           | The main Stylo crate containing the entire CSS engine                                                             |\n| style_traits       | [![Crates.io](https://img.shields.io/crates/v/stylo_traits.svg)](https://crates.io/crates/stylo_traits)             | Types and traits which allow other code to interoperate with Stylo without depending on the main crate directly.  |\n| stylo_dom          | [![Crates.io](https://img.shields.io/crates/v/stylo_dom.svg)](https://crates.io/crates/stylo_dom)                   | Similar to stylo_traits (but much smaller)                                                                        |\n| stylo_atoms        | [![Crates.io](https://img.shields.io/crates/v/stylo_atoms.svg)](https://crates.io/crates/stylo_atoms)               | [Atoms](https://docs.rs/string_cache/latest/string_cache/struct.Atom.html) for CSS and HTML event related strings |\n| stylo_config       | [![Crates.io](https://img.shields.io/crates/v/stylo_config.svg)](https://crates.io/crates/stylo_config)             | Configuration for Stylo. Can be used to set runtime preferences (enabling/disabling properties, etc)              |\n| stylo_static_prefs | [![Crates.io](https://img.shields.io/crates/v/stylo_static_prefs.svg)](https://crates.io/crates/stylo_static_prefs) | Static configuration for Stylo. Config be overridden by patching in a replacement crate.                          |\n| style_derive       | [![Crates.io](https://img.shields.io/crates/v/stylo_derive.svg)](https://crates.io/crates/stylo_derive)             | Internal derive macro for stylo crate                                                                             |\n\n### Standalone Crates\n\nThese crates form part of Stylo but are also be useful standalone.\n\n| Directory | Crate                                                                                             | Notes                   |\n| ---       | ---                                                                                               | ---                     |\n| selectors | [![Crates.io](https://img.shields.io/crates/v/selectors.svg)](https://crates.io/crates/selectors) | CSS Selector matching   |\n| servo_arc | [![Crates.io](https://img.shields.io/crates/v/servo_arc.svg)](https://crates.io/crates/servo_arc) | A variant on `std::Arc` |\n\nYou may also be interested in the `cssparser` crate which lives in the [servo/rust-cssparser](https://github.com/servo/rust-cssparser) repo.\n\n### Support Crates\n\nLow-level crates which could technically be used standalone but are unlikely to be generally useful in practice.\n\n| Directory       | Crate                                                                                                                   | Notes                                                       |\n| ---             | ---                                                                                                                     | ---                                                         |\n| malloc_size_of  | [![Crates.io](https://img.shields.io/crates/v/stylo_malloc_size_of.svg)](https://crates.io/crates/stylo_malloc_size_of) | Heap size measurement for Stylo values                      |\n| to_shmem        | [![Crates.io](https://img.shields.io/crates/v/to_shmem.svg)](https://crates.io/crates/to_shmem)                         | Internal utility crate for sharing memory across processes. |\n| to_shmem_derive | [![Crates.io](https://img.shields.io/crates/v/to_shmem_derive.svg)](https://crates.io/crates/to_shmem_derive)           | Internal derive macro for to_shmem crate                    |\n\n## Building Servo Against a Local Copy of Stylo\n\nAssuming your local `servo` and `stylo` directories are siblings, you can build `servo` against `stylo` by adding the following to `servo/Cargo.toml`:\n\n```toml\n[patch.\"https://github.com/servo/stylo\"]\nselectors = { path = \"../stylo/selectors\" }\nservo_arc = { path = \"../stylo/servo_arc\" }\nstylo_atoms = { path = \"../stylo/stylo_atoms\" }\nstylo = { path = \"../stylo/style\" }\nstylo_config = { path = \"../stylo/stylo_config\" }\nstylo_dom = { path = \"../stylo/stylo_dom\" }\nstylo_malloc_size_of = { path = \"../stylo/malloc_size_of\" }\nstylo_traits = { path = \"../stylo/style_traits\" }\n```\n\n## Releases\n\nReleases are made every time this repository rebases its changes on top of the latest version of upstream Stylo. There are a lot of crates here. In order to publish them, they must be done in order. One order that works is:\n\n- selectors\n- stylo_static_prefs\n- stylo_config\n- stylo_atoms\n- stylo_malloc_size_of\n- stylo_dom\n- stylo_derive\n- stylo_traits\n- stylo\n\n## License\n\nStylo is licensed under MPL 2.0\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fservo%2Fstylo","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fservo%2Fstylo","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fservo%2Fstylo/lists"}