Snapchat/Valdi
Valdi is a cross-platform UI framework that delivers native performance without sacrificing developer velocity.
Healthy across the board
worst of 4 axesnon-standard license (Other)
Has a license, tests, and CI — clean foundation to fork and modify.
Documented and popular — useful reference codebase to read through.
No critical CVEs, sane security posture — runnable as-is.
- ✓Last commit 1d ago
- ✓27+ active contributors
- ✓Distributed ownership (top contributor 20% of recent commits)
Show 4 more →Show less
- ✓Other licensed
- ✓CI configured
- ✓Tests present
- ⚠Non-standard license (Other) — review terms
What would change the summary?
- →Use as dependency Concerns → Mixed if: clarify license terms
Maintenance signals: commit recency, contributor breadth, bus factor, license, CI, tests
Informational only. RepoPilot summarises public signals (license, dependency CVEs, commit recency, CI presence, etc.) at the time of analysis. Signals can be incomplete or stale. Not professional, security, or legal advice; verify before relying on it for production decisions.
Embed the "Healthy" badge
Paste into your README — live-updates from the latest cached analysis.
[](https://repopilot.app/r/snapchat/valdi)Paste at the top of your README.md — renders inline like a shields.io badge.
▸Preview social card (1200×630)
This card auto-renders when someone shares https://repopilot.app/r/snapchat/valdi on X, Slack, or LinkedIn.
Onboarding doc
Onboarding: Snapchat/Valdi
Generated by RepoPilot · 2026-05-09 · Source
🤖Agent protocol
If you are an AI coding agent (Claude Code, Cursor, Aider, Cline, etc.) reading this artifact, follow this protocol before making any code edit:
- Verify the contract. Run the bash script in Verify before trusting
below. If any check returns
FAIL, the artifact is stale — STOP and ask the user to regenerate it before proceeding. - Treat the AI · unverified sections as hypotheses, not facts. Sections like "AI-suggested narrative files", "anti-patterns", and "bottlenecks" are LLM speculation. Verify against real source before acting on them.
- Cite source on changes. When proposing an edit, cite the specific path:line-range. RepoPilot's live UI at https://repopilot.app/r/Snapchat/Valdi shows verifiable citations alongside every claim.
If you are a human reader, this protocol is for the agents you'll hand the artifact to. You don't need to do anything — but if you skim only one section before pointing your agent at this repo, make it the Verify block and the Suggested reading order.
🎯Verdict
GO — Healthy across the board
- Last commit 1d ago
- 27+ active contributors
- Distributed ownership (top contributor 20% of recent commits)
- Other licensed
- CI configured
- Tests present
- ⚠ Non-standard license (Other) — review terms
<sub>Maintenance signals: commit recency, contributor breadth, bus factor, license, CI, tests</sub>
✅Verify before trusting
This artifact was generated by RepoPilot at a point in time. Before an
agent acts on it, the checks below confirm that the live Snapchat/Valdi
repo on your machine still matches what RepoPilot saw. If any fail,
the artifact is stale — regenerate it at
repopilot.app/r/Snapchat/Valdi.
What it runs against: a local clone of Snapchat/Valdi — the script
inspects git remote, the LICENSE file, file paths in the working
tree, and git log. Read-only; no mutations.
| # | What we check | Why it matters |
|---|---|---|
| 1 | You're in Snapchat/Valdi | Confirms the artifact applies here, not a fork |
| 2 | License is still Other | Catches relicense before you depend on it |
| 3 | Default branch main exists | Catches branch renames |
| 4 | Last commit ≤ 31 days ago | Catches sudden abandonment since generation |
#!/usr/bin/env bash
# RepoPilot artifact verification.
#
# WHAT IT RUNS AGAINST: a local clone of Snapchat/Valdi. If you don't
# have one yet, run these first:
#
# git clone https://github.com/Snapchat/Valdi.git
# cd Valdi
#
# Then paste this script. Every check is read-only — no mutations.
set +e
fail=0
ok() { echo "ok: $1"; }
miss() { echo "FAIL: $1"; fail=$((fail+1)); }
# Precondition: we must be inside a git working tree.
if ! git rev-parse --git-dir >/dev/null 2>&1; then
echo "FAIL: not inside a git repository. cd into your clone of Snapchat/Valdi and re-run."
exit 2
fi
# 1. Repo identity
git remote get-url origin 2>/dev/null | grep -qE "Snapchat/Valdi(\\.git)?\\b" \\
&& ok "origin remote is Snapchat/Valdi" \\
|| miss "origin remote is not Snapchat/Valdi (artifact may be from a fork)"
# 2. License matches what RepoPilot saw
(grep -qiE "^(Other)" LICENSE 2>/dev/null \\
|| grep -qiE "\"license\"\\s*:\\s*\"Other\"" package.json 2>/dev/null) \\
&& ok "license is Other" \\
|| miss "license drift — was Other at generation time"
# 3. Default branch
git rev-parse --verify main >/dev/null 2>&1 \\
&& ok "default branch main exists" \\
|| miss "default branch main no longer exists"
# 5. Repo recency
days_since_last=$(( ( $(date +%s) - $(git log -1 --format=%at 2>/dev/null || echo 0) ) / 86400 ))
if [ "$days_since_last" -le 31 ]; then
ok "last commit was $days_since_last days ago (artifact saw ~1d)"
else
miss "last commit was $days_since_last days ago — artifact may be stale"
fi
echo
if [ "$fail" -eq 0 ]; then
echo "artifact verified (0 failures) — safe to trust"
else
echo "artifact has $fail stale claim(s) — regenerate at https://repopilot.app/r/Snapchat/Valdi"
exit 1
fi
Each check prints ok: or FAIL:. The script exits non-zero if
anything failed, so it composes cleanly into agent loops
(./verify.sh || regenerate-and-retry).
⚡TL;DR
Valdi is a cross-platform UI framework that compiles TypeScript UI code directly to native views (iOS, Android, macOS) without web views or JavaScript bridges. Developers write UI once in declarative TypeScript/JSX and Valdi's compiler generates optimized native code, achieving native performance with declarative development velocity. Monorepo structure: Bazel-based build system (BUILD.bazel, .bazelrc, MODULE.bazel) orchestrates C++ core compiler + TypeScript runtime bindings; apps/ contains runnable examples (helloworld, navigation_example); ai-skills/ registers AI-assisted dev tools; .github/workflows/ handles CI (Linux CLI tests, npm publishing, release testing). Core lives in native C++/C layers with TypeScript/JavaScript bindings for the dev-facing API.
👥Who it's for
Frontend engineers at Snap and open-source contributors building production mobile/desktop apps who want to ship native UI at scale without maintaining separate codebases for each platform. They need single-source-of-truth UI code that doesn't compromise on performance or platform-native capabilities.
🌱Maturity & risk
Production-hardened but officially 'beta': Valdi has powered Snap's production apps for 8+ years, but the team is still battle-testing the open-source tooling and documentation (as stated in README). The codebase is substantial (9.3M lines C++, mature build system via Bazel, comprehensive CI/CD in .github/workflows/), signaling serious production usage. Risk is primarily in ecosystem maturity rather than code quality.
Moderate risk: heavy C++ core (9.3M lines) means compilation times and toolchain complexity; the compiler stack (C++, TypeScript) requires specific dev environment setup (Xcode for macOS mandatory per docs); beta status means breaking API changes are possible during stabilization. Single-source-of-truth on compiler correctness creates chokepoint risk if bugs emerge in code generation.
Active areas of work
Active development evidenced by: GitHub Actions workflows for multi-platform testing (bzl-changes, test-cli-linux, release-test), npm package publishing pipeline (publish-npm.yml), PR labeling automation (pr-area-labeler, pr-size-labeler), and AI skills registry expansion (ai-skills/registry.json, skill.md files for async, bazel, compiler, component-tests). Recent focus appears to be stabilizing tooling for open-source usability.
🚀Get running
npm install -g @snap/valdi
valdi dev_setup
mkdir my_project && cd my_project
valdi bootstrap
valdi install ios # or android
Prerequisite: Xcode for macOS. Valdi CLI handles remaining dependency installation automatically.
Daily commands:
npm install
# For TypeScript development:
ts-node scripts/...
# For C++ core: Bazel handles compilation
bazel build //...
# For examples:
cd apps/helloworld && valdi dev
(Exact dev server invocation likely in app-level documentation or inferred via valdi CLI help.)
🗺️Map of the codebase
- README.md: Documents Valdi's core pitch, quick start, and links to full guide (./docs/INSTALL.md) which is essential for any contributor understanding the framework's UX.
- MODULE.bazel: Bazel module manifest defining workspace dependencies and configuration; essential for understanding build system setup and external dependency management.
- .github/workflows/test-cli-linux.yml: Primary CI pipeline for CLI validation on Linux; shows how the project validates compilation and CLI tools across platforms.
- apps/helloworld: Minimal runnable Valdi app demonstrating the core component pattern; quickest way to see how JSX and Component classes translate to native output.
- ai-skills/registry.json: Maps registered AI skills (async, bazel, compiler, component-tests) that augment the dev experience; shows Snap's strategy for embedding AI-assisted workflows.
- CONTRIBUTING.md: Contributor guidelines specific to this repo's submission process, code standards, and community expectations.
- .cursorrules: Cursor IDE-specific rules for this codebase; hints at expected dev environment (Cursor/VSCode with Valdi extensions).
🛠️How to make changes
For TypeScript/compiler changes: Start in root TypeScript files and ai-skills/skills/valdi-compiler/. For iOS/macOS native bindings: See apps/helloworld and Swift files (2M LOC). For Android: Kotlin sources (1.3M LOC). For docs: docs/ folder and .github/ISSUE_TEMPLATE/. For build/infrastructure: .github/workflows/ and Bazel files (BUILD.bazel, MODULE.bazel). For examples: apps/ directory has minimal (helloworld) to advanced (navigation_example) patterns.
🪤Traps & gotchas
Xcode requirement for macOS: Mandatory prerequisite; CI clearly targets macOS via Xcode setup but this is non-obvious until you run valdi dev_setup. Bazel complexity: Build system is powerful but has steep learning curve; see .bazelrc and .bazelversion for pinned configuration. Compiler-as-bottleneck: C++ compiler core means changes require recompilation; no hot-reload for compiler bugs. Beta API stability: README admits breaking changes possible; check ROADMAP.md and GitHub Discussions before major refactors. Multi-language bindings: Changes to core C++ need Swift, Kotlin, Objective-C bindings updated in parallel; easy to miss one platform.
💡Concepts to learn
- Ahead-of-Time (AOT) Compilation — Valdi's core differentiator: TypeScript UI code is compiled to machine code at build time, not interpreted at runtime like React Native; understanding AOT vs. JIT tradeoffs is critical for performance optimization and debugging.
- Declarative UI Frameworks — Valdi's Component model (onRender() returning JSX) mirrors React patterns; essential for understanding why state changes trigger re-renders and how the diff algorithm works.
- Language Binding / FFI (Foreign Function Interface) — Valdi exposes C++ core via TypeScript, Swift, Kotlin, Objective-C bindings; contributors modifying native interop must understand FFI mechanics to avoid memory leaks and type mismatches across language boundaries.
- Monorepo Build Orchestration (Bazel) — Entire codebase (C++, TypeScript, native modules) is managed by Bazel; understanding BUILD.bazel rules and MODULE.bazel dependencies is mandatory for any infrastructure or build system changes.
- Hot Reload / Live Reload — Valdi's dev tooling (valdi dev) supports hot reload of UI code to device; understanding what can/cannot hot reload (compiler changes cannot) shapes how developers iterate and debug.
- [Cross-Platform Native Bindings](https://developer.apple.com/swift/ and https://developer.android.com/kotlin) — Single TypeScript source must map to iOS (Swift), Android (Kotlin), macOS (Objective-C) native APIs; contributors must understand how platform-specific features (gesture handling, permissions) are abstracted into a unified component API.
- Compiler Code Generation — The C++ compiler (9.3M LOC) transforms AST → platform-specific native code; bugs in code generation silently produce incorrect native views; understanding the compilation pipeline is critical for debugging layout or rendering issues.
🔗Related repos
facebook/react-native— Closest competitor solving cross-platform UI (JavaScript → native), but Valdi avoids the JS bridge performance penalty via ahead-of-time compilation instead of runtime interpretation.google/flutter— Alternative cross-platform framework (Dart → native) with similar goals; Valdi differentiates via TypeScript DX and direct native compilation vs. Flutter's render engine.Snapchat/Valdi_Widgets— Official component library built on Valdi; essential reference for understanding idiomatic component patterns and reusable UI primitives in the Valdi ecosystem.snapchat/snap-kit— Companion SDK from Snap for integrating Snapchat features; likely used by Valdi apps to access Snap platform capabilities (auth, sharing, etc.).
🪄PR ideas
To work on one of these in Claude Code or Cursor, paste:
Implement the "<title>" PR idea from CLAUDE.md, working through the checklist as the task list.
Add integration tests for valdi-migrate skill antipattern detection
The ai-skills/skills/valdi-migrate/tests directory contains a check_antipatterns.py script but no corresponding test suite. This skill is critical for helping developers migrate to Valdi, and automated tests would ensure the antipattern detection rules work correctly across different code patterns. This would catch regressions early and make contributions to the migrate tool safer.
- [ ] Review ai-skills/skills/valdi-migrate/tests/check_antipatterns.py to understand current antipattern detection logic
- [ ] Create a new test file (e.g., test_antipatterns.py) with unit tests covering positive/negative cases for each antipattern rule
- [ ] Add test fixtures in ai-skills/skills/valdi-migrate/tests/ with sample code files demonstrating each antipattern
- [ ] Update BUILD.bazel in ai-skills/skills/valdi-migrate/tests/ to include the new Python test target
- [ ] Document test coverage in ai-skills/skills/valdi-migrate/tests/README.md
Add platform-specific end-to-end tests in GitHub Actions for iOS and Android targets
The repo has Bazel configured for multi-platform builds (iOS, Android, macOS) but the .github/workflows directory only contains test-cli-linux.yml. There's no CI validation that Bazel builds successfully for iOS and Android targets, which are explicitly mentioned as primary platforms in the README. Adding these workflows would catch platform-specific build failures early.
- [ ] Create .github/workflows/test-ios-bazel.yml that runs 'bazel build //...' for iOS targets on macOS runners
- [ ] Create .github/workflows/test-android-bazel.yml that runs 'bazel build //...' for Android targets on Linux runners
- [ ] Reference the .bazelrc and .bazelversion files to ensure consistent Bazel configuration across workflows
- [ ] Update .github/workflows/README.md to document the new iOS and Android test workflows and when they run
Add ESLint rule documentation and tests for @snap/eslint-plugin-valdi
The package.json shows @snap/eslint-plugin-valdi is a dev dependency with version 1.0.1, but there's no documentation or tests visible in the file structure. Since this is a custom Valdi-specific ESLint plugin, new contributors need clear documentation on what rules it enforces and why. This would also ensure the plugin's rules remain reliable as the codebase evolves.
- [ ] Create docs/eslint-plugin-valdi-rules.md documenting each rule in @snap/eslint-plugin-valdi with examples of violations and fixes
- [ ] Add test cases in a new directory (e.g., eslint-plugin-tests/) that verify each ESLint rule works correctly with valid and invalid code samples
- [ ] Create a BUILD.bazel target to run these tests as part of CI (integrating with test-cli-linux.yml or similar)
- [ ] Update CONTRIBUTING.md with a reference to the ESLint plugin rules documentation
🌿Good first issues
- Add Dart language binding skeleton (dart/ directory exists with 3k LOC but appears incomplete): Create basic Dart FFI bindings to C core for potential Desktop/Flutter support; helps reduce 'only 3 platforms' scope limitation.
- Expand ai-skills/skills/valdi-component-tests/tests/ with concrete test examples: Currently minimal test examples; add reference.tsx patterns for async components, navigation, and state management to help contributors understand testing patterns without grepping production code.
- Documentation gap: Create docs/docs/COMPILER_ARCHITECTURE.md explaining how TypeScript → native code compilation works: README mentions 'compiles directly to native' but actual compiler internals are undocumented; essential for contributors working on C++ core or new platform support.
⭐Top contributors
Click to expand
Top contributors
- @beaucollins — 20 commits
- @cholgateSC — 19 commits
- @bot-snapci — 11 commits
- @mgalindo-sc — 9 commits
- @li-feng-sc — 7 commits
📝Recent commits
Click to expand
Recent commits
d9a6708— Internal Change (beaucollins)8856d5b— Internal Change (cholgateSC)2ff93aa— Add files from GCS archives (bot-snapci)6f4078e— Internal Change (li-feng-sc)d3512e4— Internal Change (imaldonado-sc)0e4190b— Internal Change (beaucollins)8b151cd— Internal Change (cholgateSC)bb4b265— Internal Change (cholgateSC)75a3029— Internal Change (beaucollins)c8c9d83— Internal Change (cholgateSC)
🔒Security observations
The Valdi project demonstrates a strong security foundation with proper vulnerability reporting channels (HackerOne) and a documented SECURITY.md file. However, several areas need improvement: (1) TypeScript and dependencies are pinned without flexibility for security patches; (2) ESLint plugin dependency status is unclear; (3) No automated vulnerability scanning is evident in the package configuration; (4) Security documentation is minimal for a production-used framework. The codebase shows no obvious hardcoded secrets, injection vulnerabilities in visible files, or infrastructure misconfigurations based on provided structure. The main risks are around dependency management and the disconnect between 'beta' status and 8 years of production usage. Recommendations: implement automated npm audit in CI/CD, expand security documentation, update dependencies to latest stable versions, and clarify project stability status.
- Medium · Outdated TypeScript Version —
package.json - devDependencies.typescript. TypeScript 5.3.3 is pinned to a specific version without caret/tilde operators. While this ensures consistency, it may miss important security patches in the 5.3.x line. TypeScript 5.3.3 was released in November 2023 and may have known vulnerabilities. Fix: Update to the latest stable TypeScript version (5.6+) or use a caret range (^5.3.3) to receive patch updates automatically. - Medium · ESLint Plugin with Unknown Maintenance Status —
package.json - devDependencies.@snap/eslint-plugin-valdi. @snap/eslint-plugin-valdi version 1.0.1 is pinned without version flexibility. Custom/internal plugins may have limited security review and maintenance. The version number (1.0.1) suggests early release status. Fix: Verify the plugin's security review status, update to latest version, and consider adding automated dependency scanning for internal packages. - Low · Multiple Dev Dependencies Without Upper Bound Constraints —
package.json - devDependencies section. Several devDependencies use caret ranges (e.g., @typescript-eslint/, eslint-plugin-) which allow minor and patch updates. While this ensures bug fixes, it could introduce unexpected breaking changes in minor versions. Fix: Review dependencies quarterly for updates, use automated tools like Dependabot, and run comprehensive tests on minor version updates. - Low · Missing npm Audit Configuration —
package.json and CI/CD workflows. No evidence of npm audit scripts, audit-ci integration, or security scanning in package.json. The project should have automated vulnerability detection in CI/CD pipelines. Fix: Add 'npm audit' to CI/CD pipeline, integrate audit-ci for fail-on-vulnerability checks, and implement automated dependency scanning. - Low · Incomplete Security Policy Documentation —
SECURITY.md. SECURITY.md exists but is minimal. It only provides a HackerOne link without details on security reporting timeline, supported versions, or patch release procedures. Fix: Expand SECURITY.md with: supported version policy, expected response timeframe, disclosure timeline, and contact procedures. - Low · Beta Status with Production Usage —
README.md. README indicates 'beta' status while noting 8 years of production use in Snap apps. This creates confusion about security guarantees and stability commitments. Users may underestimate security implications of 'beta' software. Fix: Clarify the 'beta' label meaning - either graduate to stable release or explicitly document production readiness and security practices.
LLM-derived; treat as a starting point, not a security audit.
👉Where to read next
- Open issues — current backlog
- Recent PRs — what's actively shipping
- Source on GitHub
Generated by RepoPilot. Verdict based on maintenance signals — see the live page for receipts. Re-run on a new commit to refresh.