惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

The GitHub Blog
The GitHub Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Microsoft Security Blog
Microsoft Security Blog
J
Java Code Geeks
S
SegmentFault 最新的问题
Apple Machine Learning Research
Apple Machine Learning Research
N
Netflix TechBlog - Medium
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
博客园_首页
宝玉的分享
宝玉的分享
Google DeepMind News
Google DeepMind News
B
Blog RSS Feed
Hugging Face - Blog
Hugging Face - Blog
量子位
Blog — PlanetScale
Blog — PlanetScale
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
阮一峰的网络日志
阮一峰的网络日志
D
Docker
罗磊的独立博客
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
云风的 BLOG
云风的 BLOG
IT之家
IT之家
MyScale Blog
MyScale Blog
Microsoft Azure Blog
Microsoft Azure Blog

DEV Community

Authentication Security Deep Dive: From Brute Force to Salted Hashing (With Java Examples) Why AI Systems Don’t Fail — They Drift Spilling beans for how i learn for exam😁"Reinforcement Learning Cheat Sheet" I Replaced Chrome with Safari for AI Browser Automation. Here's What Broke (and What Finally Worked) How Python Borrows Other People's Work The $40 Architecture: Processing 1 Billion API Requests with 99.99% Uptime Vibe Coding: A Workflow Guide (From Zero to SaaS) Most webhook security guides protect the wrong side. The scary part is delivery. Headless CMS for TanStack Start: Build a Blog with Cosmic EU Age Verification App "Hacked in 2 Minutes" — What Actually Happened Comfy Cloud’s delete function does not actually remove files Running AI Models on GPU Cloud Servers: A Beginner Guide Event-driven media intelligence with AWS Step Functions and Bedrock I scored 500 AI prompts across 8 quality dimensions — here's what broke How to Call Google Gemini API from Next.js (Free Tier, No Backend Needed) The Portal Protocol: Reclaiming Human Connection in the Age of AI How to Fix Your Team's Scattered Knowledge Problem With a Self-Hosted Forum Intro to tc Cloud Functors: A Graph-First Mental Model for the Modern Cloud Designing Multi-Tenant Backends With Both Ownership and Team Access I Built a Neumorphic CSS Library with 77+ Components — Here's What I Learned PostgreSQL Performance Optimization: Why Connection Pooling Is Critical at Scale Cómo construí un SaaS multi-rubro para gestionar expensas en Argentina con FastAPI + Vue 3 🚀 I Built an Ethical Hacking Scanner Tool – Open Source Project I Replaced /usage and /context in Claude Code With a Single Statusline A Pythonic Way to Handle Emails (IMAP/SMTP) with Auto-Discovery and AI-Ready Design I Collected 8.9 Million Polymarket Price Points — Here's What I Found About How Markets Really Move EcoTrack AI — Carbon Footprint Tracker & Dashboard Everyone's Using AI. No One Agrees How. 5 self-hosted ebook managers worth trying in 2026 Building Your First AI Agent with LangChain: From Chatbot to Autonomous Assistant
avanti: One YAML Spec, Files from Anywhere
Daniel Schro · 2026-05-07 · via DEV Community

You have a renovate.json in 30 repos. A platform team owns the canonical version. Six months later, half those repos are running a config from March that nobody updated. One team added a custom rule. Another deleted a section by accident. Nobody knows which version is "right" anymore.

This is config drift. By the time anyone looks, the configs have diverged.

What avanti does

avanti is a CLI tool that pulls local files from a declarative YAML spec. You describe what each file should contain and where it comes from. Then you run avanti pull.

It has two commands:

  • avanti diff — shows a colored git-diff-style preview of what would change, exits 1 if changes exist
  • avanti pull — fetches everything, shows the diff, and asks for confirmation before writing

No daemon, no server, no agent. Just a spec file and two commands.

Sources

A src value can be an HTTP URL, a local path, a GitHub file, a GitLab file, a shell command, or inline raw content. You pick per entry.

files:
  # HTTP
  - src: https://example.com/base-config.yml
    target: base-config.yml

  # Local path
  - src: ~/shared/scripts/deploy.sh
    target: scripts/deploy.sh
    mode: '0755'

  # GitHub
  - src:
      github:
        repo: org/standards
        file: eslint.config.js
        ref: main

  # Shell command
  - src:
      exec: aws ssm get-parameter --name /app/db-config --with-decryption --query Parameter.Value --output text
    target: config/db.json
    mode: '0600'

  # Inline content
  - src:
      raw: |
        # THIS FILE IS MANAGED — run `avanti pull` to update
    target: header.txt

Enter fullscreen mode Exit fullscreen mode

You can also combine multiple sources into one file by passing src as a list. They're fetched in order and joined with a newline.

Variables

Define reusable values once, reference them everywhere with $name. Environment variables use $env:NAME.

variables:
  standards_ref: v2.4.1
  region: eu-west-1

files:
  - src:
      github:
        repo: org/standards
        file: renovate.json
        ref: $standards_ref

  - src:
      github:
        repo: org/infra
        file: k8s/deployment-template.yaml
        ref: $env:DEPLOY_VERSION
    target: k8s/deployment.yaml
    replace:
      - from: '{REGION}'
        to: $region
      - from: '{ENV}'
        to: $env:ENVIRONMENT

Enter fullscreen mode Exit fullscreen mode

Bump standards_ref in one place. Run avanti diff. See every file that will change before you touch anything.

Post-processing

Each entry supports a replace list for string or regex substitutions, and a post field to pipe content through a shell script. Both run after fetching, before writing.

- src: https://example.com/template.yml
  target: config.yml
  replace:
    - from: '{EMAIL}'
      to: $email
    - from: /\d+\.\d+\.\d+/
      to: $env:APP_VERSION
  post: yq e '.metadata.name = "my-app"' -

Enter fullscreen mode Exit fullscreen mode

Use case 1: A global CLAUDE.md your whole team actually shares

Per-project CLAUDE.md files should contain project-specific context. But company-wide coding standards, team conventions, and security guidelines don't belong there — they belong in a global ~/.claude/CLAUDE.md that every developer on the team carries. The problem is keeping that file in sync across 20 machines.

avanti solves this by assembling the global file from central sources. Each developer has a personal .avanti.yml (or the team ships one via onboarding). Running avanti pull rebuilds the file from the current canonical versions.

variables:
  team: backend
  oncall_channel: '#backend-oncall'

files:
  - src:
      - raw: |
          # AI Assistant Guidelines
          <!-- THIS FILE IS MANAGED — run `avanti pull` to update -->
      - gitlab:
          project: platform/ai-standards
          file: teams/backend-rules.md
          ref: main
      - github:
          repo: org/shared-prompts
          file: company-standards.md
          ref: main
      - raw: |
          ## Team Context
          Team: $team
          Oncall: $oncall_channel
    target: ~/.claude/CLAUDE.md

Enter fullscreen mode Exit fullscreen mode

The platform team updates backend-rules.md once. Every developer who runs avanti pull gets it. No Slack message asking which version is current, no six-month-old guidelines silently telling the AI the wrong thing.

Use case 2: Pinned shared tooling configs

variables:
  standards_ref: v2.4.1

files:
  - src:
      github:
        repo: org/standards
        file: renovate.json
        ref: $standards_ref

  - src:
      github:
        repo: org/standards
        file: eslint.config.js
        ref: $standards_ref

  - src:
      github:
        repo: org/standards
        file: tsconfig.base.json
        ref: $standards_ref

Enter fullscreen mode Exit fullscreen mode

All files pinned to v2.4.1. When the platform team cuts v2.5.0, projects bump one variable, diff, and apply. No manual file hunting.

Use case 3: Drift detection in CI

files:
  - src:
      - raw: |
          # THIS FILE IS MANAGED — run `avanti pull` to update
      - github:
          repo: org/ci-templates
          file: workflows/security-scan.yml
          ref: main
    target: .github/workflows/security-scan.yml

Enter fullscreen mode Exit fullscreen mode

Add avanti diff as a CI step. If a developer edited the managed file by hand, the pipeline fails. The fix is to run avanti pull, not to argue about whose edit was right.

Atomic writes

avanti stages all files to a temp directory first. If any source fails, nothing gets written. You either get a full successful update or nothing changes. No half-applied state.

Working directory and path safety

All src and target paths resolve relative to the working directory, not the config file's location. This lets you use one shared config across many projects:

for dir in services/*/; do
  avanti -c shared/avanti.yml -w "$dir" pull --yes
done

Enter fullscreen mode Exit fullscreen mode

Target paths cannot escape the working directory. A target of ../../etc/passwd is an error. Absolute targets are only allowed when the working directory is /.

Install

npm install -g @udondan/avanti

Enter fullscreen mode Exit fullscreen mode

Or run without installing:

npx @udondan/avanti --help

Enter fullscreen mode Exit fullscreen mode

Drop a .avanti.yml in your project root, define your files, and run avanti diff to see what it would do.

The config format is in the README. The source is on GitHub at udondan/scync. Issues and PRs are open.

If you've handled this differently, I'm curious what you're doing.