{"id":47197518,"url":"https://github.com/elixir-volt/oxide_ex","last_synced_at":"2026-04-01T17:21:07.654Z","repository":{"id":343883262,"uuid":"1179543220","full_name":"elixir-volt/oxide_ex","owner":"elixir-volt","description":"Elixir NIF bindings for Tailwind CSS Oxide — fast parallel content scanning and candidate extraction","archived":false,"fork":false,"pushed_at":"2026-03-12T16:15:26.000Z","size":23,"stargazers_count":4,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2026-03-17T01:49:30.667Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Elixir","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/elixir-volt.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","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":"2026-03-12T06:03:56.000Z","updated_at":"2026-03-13T22:23:12.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/elixir-volt/oxide_ex","commit_stats":null,"previous_names":["dannote/oxide_ex","elixir-volt/oxide_ex"],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/elixir-volt/oxide_ex","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/elixir-volt%2Foxide_ex","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/elixir-volt%2Foxide_ex/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/elixir-volt%2Foxide_ex/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/elixir-volt%2Foxide_ex/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/elixir-volt","download_url":"https://codeload.github.com/elixir-volt/oxide_ex/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/elixir-volt%2Foxide_ex/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30626906,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-17T14:16:03.965Z","status":"ssl_error","status_checked_at":"2026-03-17T14:16:03.380Z","response_time":56,"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":"2026-03-13T12:08:03.355Z","updated_at":"2026-03-27T04:01:27.614Z","avatar_url":"https://github.com/elixir-volt.png","language":"Elixir","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Oxide\n\nElixir NIF bindings for [Tailwind CSS Oxide](https://tailwindcss.com) — the Rust-powered content scanner that powers Tailwind CSS v4.\n\nScans source files in parallel to extract Tailwind CSS candidate class names at native speed, with built-in support for HEEx, EEx, Elixir, Vue, Svelte, and 20+ other template languages.\n\n## Features\n\n- **Parallel filesystem scanning** — walks directories using Rayon, respects `.gitignore`\n- **Candidate extraction** — state-machine parser pulls valid Tailwind candidates from any content\n- **Incremental scanning** — only re-extracts changed files, returns only new candidates\n- **Language-aware preprocessing** — built-in support for `.heex`, `.eex`, `.ex`, `.vue`, `.svelte`, `.erb`, and more\n- **Stateless extraction** — extract candidates from a string without a scanner\n\n## Installation\n\n```elixir\ndef deps do\n  [\n    {:oxide, \"~\u003e 0.1.0\"}\n  ]\nend\n```\n\nRequires a Rust toolchain (`rustup` recommended). The NIF compiles automatically on `mix compile`.\n\n## Usage\n\n### Scanner (stateful, incremental)\n\n```elixir\n# Create a scanner with source patterns\nscanner = Oxide.new(sources: [\n  %{base: \"lib/\", pattern: \"**/*.{ex,heex}\"},\n  %{base: \"assets/\", pattern: \"**/*.{vue,ts,tsx}\"}\n])\n\n# Full scan — walks filesystem, returns all candidates\ncandidates = Oxide.scan(scanner)\n# [\"flex\", \"items-center\", \"bg-blue-500\", \"hover:text-white\", ...]\n\n# On file change — only returns NEW candidates not seen before\nnew = Oxide.scan_files(scanner, [\n  %{file: \"lib/app_web/live/page.ex\", extension: \"ex\"}\n])\n# [\"mt-8\", \"space-y-4\"]\n\n# Get discovered files (useful for watcher setup)\nfiles = Oxide.files(scanner)\n\n# Get generated glob patterns\nglobs = Oxide.globs(scanner)\n```\n\n### Extract (stateless)\n\n```elixir\ncandidates = Oxide.extract(~s(class=\"flex bg-red-500 hover:text-white\"), \"html\")\n# [\n#   %Oxide.Candidate{value: \"class\", position: 0},\n#   %Oxide.Candidate{value: \"flex\", position: 7},\n#   %Oxide.Candidate{value: \"bg-red-500\", position: 12},\n#   %Oxide.Candidate{value: \"hover:text-white\", position: 23}\n# ]\n```\n\n## How It Works\n\nThis library wraps the `tailwindcss-oxide` Rust crate — the same scanner used by Tailwind CSS v4 itself. The scanner:\n\n1. Walks the filesystem in parallel using Rayon, respecting `.gitignore` rules\n2. Preprocesses each file based on its extension (strips non-class content from HEEx, Vue, etc.)\n3. Runs a state-machine-based extractor that identifies valid Tailwind candidates\n4. Tracks seen candidates for fast incremental scanning on subsequent calls\n\nAll NIF calls run on the dirty CPU scheduler so they don't block the BEAM.\n\n## License\n\nMIT — Copyright 2026 Danila Poyarkov\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Felixir-volt%2Foxide_ex","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Felixir-volt%2Foxide_ex","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Felixir-volt%2Foxide_ex/lists"}