Your ServiceNow
code, in Git.
SyncroNow AI pulls your scoped-app source out of the instance as plain, editable files — real diffs, branches and pull requests. Every save is built through modern tooling and pushed straight back to the record.
The asymmetric model
Studio source control locks your code inside the instance. SyncroNow inverts that: the source you write lives in Git, and its build output is what lands in ServiceNow. The code you author is never the code that runs.
+ class Example {+ sayHello() {+ gs.info("Hi, SyncroNow!");+ }+ }
"use strict";
var Example = (function () {
function Example() {}
_createClass(Example, [{
key: "sayHello", value: …
}]);
return Example;
})();
SyncroNow AI is the next-generation successor to Sincronia. Architecture, records, dictionary and other metadata stay managed in ServiceNow the normal way; once code is in your project it becomes the source of truth — you edit it locally, not in the instance. That shift is what gives you real diffs, code review and CI over code that would otherwise only exist inside ServiceNow.
Why teams pick it
For teams deciding how to manage ServiceNow scoped-app code. SyncroNow AI is pre-1.0 and early — these are the honest trade-offs.
| SyncroNow AI | Studio + native Git | Sincronia | Update sets | |
|---|---|---|---|---|
| Edit in your own editor | ✓ | partial | ✓ | ✕ |
| Git diff / PR review of code | ✓ | ✓ | ✓ | ✕ |
| Local build pipeline (TS / Babel / Webpack / Sass) | ✓ | ✕ | ✓ | ✕ |
| Multi-scope CLI from one repo | ✓ | partial | ✓ | ✕ |
| AI / MCP analysis | ✓ | ✕ | ✕ | ✕ |
| Works without a companion app | ✓ | n/a | ✕ | n/a |
ServiceNow's native Git moved your code into Git. SyncroNow AI moves your workflow into modern engineering — local build pipelines, a multi-scope CLI, and an AI layer that understands your scope.
Honest gaps today: versus first-party tooling it still lacks SSO in the MCP server, a support SLA, and a packaged distribution (Homebrew / Windows installer). These are the active priorities — see the roadmap.
Quick start
You need Node.js 22+ and a ServiceNow instance you can reach — a free PDI works great. WSL is required on Windows.
npm i -g syncrona
# or as a project dev dependency:
npm i -D syncrona
syncrona login
syncrona init
npx syncrona dev
git clone https://github.com/IvanBBaev/syncrona
cd syncrona
npm ci
npm run build
npm link --workspace syncrona
syncrona login
syncrona init
npx syncrona dev
Once configured, commit to Git and ignore node_modules and .env — you really
don't want credentials in your repository.
The workflow
Source code is owned locally; everything else — tables, dictionary, config records, metadata — stays managed in ServiceNow and moves with your usual update-set / deploy process.
project/
src/
table_name/
record_name/
field_name.ext
Records are folders because one record can hold several code fields. Never give two records the same display value in one table — or set a differentiatorField to keep them apart.
Once a scope is downloaded, syncrona docs generates Markdown and Mermaid diagrams
(overview, tables, per-record) — a fast way to explore what a real project looks like.
Command index
Every command runs as npx syncrona <cmd> (or bare syncrona if installed globally). Filter below.
syncrona initsyncrona refreshsyncrona devsyncrona pushsyncrona buildsyncrona deploysyncrona download my_appsyncrona docssyncrona repairsyncrona statussyncrona doctorsyncrona check-envsyncrona pluginssyncrona config add-pluginsyncrona mcpsyncrona login dev123.service-now.comsyncrona logout dev123.service-now.comsyncrona instancessyncrona use dev123.service-now.comsyncrona jira SCRUM-123syncrona jira-loginsyncrona jira-logout--diff <branch>Uses git diff against a branch. On push it pushes only changed files; on build it builds everything but records which files changed for a later targeted deploy.--dry-runPreviews effects without writing — on push, deploy, download and build.--instance-profile <name>Selects profile env vars (SN_INSTANCE_<PROFILE>, SN_USER_<PROFILE>, SN_PASSWORD_<PROFILE>), falling back to base vars.--refresh-interval <seconds>Tunes how often dev re-reads the manifest (default 30s; 0 disables polling).Configuration
A single sync.config.js in your project root drives everything — source layout,
plugin rules, and which tables/fields are tracked.
module.exports = {
sourceDirectory: "src", // watched in dev mode
buildDirectory: "build", // where local builds are written
// Most specific extension first — the first matching rule wins.
rules: [
{ match: /\.ts$/, plugins: [
{ name: "@syncrona/typescript-plugin" },
{ name: "@syncrona/babel-plugin" },
] },
],
excludes: {}, // tables/fields to drop, on top of defaults
includes: {}, // tables/fields to force-track
refreshInterval: 30,
};
Layered on top of built-in defaults — list them with config show-defaults, then override and refresh.
excludes: {
sys_scope_privilege: false, // re-enable a default
my_cool_table: true, // drop a whole table
new_table: { cool_script: true },
},
includes: {
sys_report: true, // force-track
special_table: { field: { type: "js" } },
}
A filename regex maps to an ordered plugin chain. Only the first matching rule runs — order specific patterns first.
rules: [
{ match: /\.secret\.ts$/, plugins: [] }, // no-op
{ match: /\.ts$/, plugins: [
{ name: "@syncrona/typescript-plugin",
options: { transpile: false } },
] },
]
Name the record folder, disambiguate duplicate display values, or scope a table by encoded query.
tableOptions: {
some_table: {
displayField: "name",
differentiatorField: ["version", "sys_id"],
query: "active=true",
},
}
Multi-part extensions unlock several pipelines for one base file: script.client.js and
script.server.js can run Webpack and Babel respectively. As long as the base filename is
stable, add as many extensions as you like.
A sys_id differentiator puts a colon in the filename, which breaks native Windows and WSL
/mnt paths. Prefer a non-sys_id differentiator, and avoid it entirely on
native-Windows teams.
Build plugins
Each is a separate @syncrona/* dev dependency wired into a rule. Chains run in order — the output of one feeds the next.
@syncrona/typescript-pluginType-checks and compiles TypeScript files.@syncrona/babel-pluginRuns Babel on .js / .ts files.@syncrona/webpack-pluginBundles your files with Webpack.@syncrona/sass-pluginCompiles Sass / SCSS to CSS.@syncrona/eslint-pluginRuns ESLint over your files on build.@syncrona/prettier-pluginFormats output files with Prettier.
Supporting presets — @syncrona/babel-preset-servicenow and
@syncrona/babel-plugin-remove-modules — adapt modern output for the ServiceNow runtime,
so a small TypeScript class becomes transpiled, instance-compatible JavaScript while you keep the readable
source in Git.
MCP server
The bundled Model Context Protocol
server (@syncrona/mcp-server) turns any MCP-capable client — Claude Desktop,
Claude Code, VS Code Chat — into a teammate that can read your scope, map dependencies, analyse scripts and
propose gated changes behind a dry-run guardrail. It exposes 61 MCP tools in 8 families.
Run npx syncrona mcp to start the server and optionally write local client
config (.vscode/mcp.json, .syncrona-mcp/secrets.json), or register it directly:
{
"mcpServers": {
"syncrona": {
"command": "npx",
"args": ["-y", "@syncrona/mcp-server"]
}
}
}
Session & guardrailsscope, update set and preflight control · 8 tools
sync_get_session_context— current scope and active update setsync_set_scope— switch the active scope by scope codesync_list_scopes— list available scopes fromsys_scopesync_set_update_set— switch the active update set, optionally creating itsync_list_update_sets— list update sets, optional encoded querysync_prepare_session— one-call scope + update-set setupsync_preflight_check— validate context against guardrailssync_check_instance_capabilities— verify scoped endpoints before automation
Records & metadataquery, read and update instance records · 7 tools
sn_query_records— query a table, optional grouped analysissn_create_record— create a record in any tablesn_list_metadata_records— inventory BR, Client Script, ACL, Dictionary, UI Policy, Scripted RESTsn_get_metadata_record— read one metadata record, normalizedsn_update_metadata_record— controlled update with confirm + dry-run gatesn_search_scripts— full-text search across script tables with excerptssn_get_record_history— field-level change history fromsys_audit
Dependency & impactgraphs, blast radius and relations · 5 tools
sn_build_dependency_graph— nodes/edges with cycle detection and hotspotssn_analyze_impact— ranked downstream blast radius for a changesn_diff_dependency_graphs— deterministic before/after graph diffsync_analyze_scope_relations— full table relation map for a scopesync_generate_table_dependency_report— one-command dependency report
Code analysisstatic analysis and semantic indexing · 8 tools
sn_analyze_script_architecture— architecture anti-pattern analysis with remediationsn_analyze_script_security— security-focused static analysissn_analyze_script_performance— performance-focused static analysissn_analyze_script_full— unified weighted risk score, optional suppressionssync_build_semantic_index— symbol-level index from local source filessync_search_semantic_index— search the semantic symbol indexsync_symbol_cross_reference— symbol occurrences by file and countsn_render_analysis_markdown— deterministic markdown report
Change & releasedrift, validation, diffs and release notes · 9 tools
sync_detect_drift— local vs instance drift summary with actionssync_diff_instance_vs_local— changed, local-only and instance-only recordssync_validate_change_package— required-dependency checks for selected recordssync_validate_before_push— pre-push analysis + conflict check, ready or blocked per recordsync_compare_instances— compare a scope across two stored profiles (dev vs prod)sync_list_recent_changes— recent scope changes fromsys_update_xmlsync_generate_release_notes— release notes from an Update Set, markdown or JSONsync_export_update_set— export an Update Set as XML plus metadatasync_unified_change_workflow— preflight → analysis → approval → footprint/rollback
Scope docs & knowledgedurable, reusable scope context · 4 tools
sync_generate_scope_knowledge— scope knowledge artifacts (md + json)sync_validate_scope_knowledge— validate knowledge JSON against the schemasync_generate_scope_docs— full docs bundle (overview, dependencies, relationships, per-object)sync_scope_knowledge_auto_update— trigger-based updates (init / refresh / change / drift)
Workflow & orchestrationCLI wrappers, gated execution, ATF and AI planning · 15 tools
sync_status— connected instance, scope and usersync_refresh— refresh the local manifest from the instancesync_build— build local files through the plugin pipelinesync_push— push local files to the instance (destructive, gated)run_workspace_command— run a local workspace command for automationsync_create_script_include— create a Script Include, optionally pull it localsync_create_script_include_and_sync— create, sync and return local file paths to editsn_execute_background_script— gated background-script execution with raw outputrun_node_code— execute JavaScript with Node.js in the workspacesync_run_atf_tests— run ATF tests (test, suite or whole scope) and poll resultssync_suggest_tests— scaffold an ATF server-side test skeleton from a Script Includesn_autonomous_remediation_workflow— detect → propose → dry-run/apply → validate, with approvalsync_ai_next_actions— prioritized next actions from a natural-language objectivesync_plan_minimal_footprint— rank where-to-modify targets with minimal-footprint scoringsync_onboarding_bootstrap— onboarding wizard/checklist with quickstart defaults
Diagnostics & contexthealth, contracts, coverage and Jira · 5 tools
sync_health_check— MCP health, endpoint diagnostics and per-tool reliability metricssync_metrics_trend— trend deltas between diagnostics windowssync_tool_contract_info— tool-contract version, declared tool list and contract hashsync_table_api_coverage_matrix— metadata coverage matrix and supported Table API operationsjira_get_issue— rich Jira issue context (summary, status, links, comments)
Writes obey a guardrail policy and a dry-run gate; background-script and Node execution are explicit, gated capabilities meant for non-production environments. Always point the MCP server at a least-privilege integration user.
Security & credentials
Authenticate with a dedicated least-privilege integration user over HTTPS — never your admin account. Six authentication options: HTTP Basic, three OAuth 2.0 grants, an inbound REST API key, and mutual TLS layered on top of any of them.
Authentication methods
syncrona login shows a method picker, or pass --auth-method
non-interactively. Everything can also come from env vars — SN_AUTH_METHOD selects the
method; Basic needs none, so a legacy .env keeps working unchanged.
| Method | Select with | Use when · key variables |
|---|---|---|
| HTTP Basic (default) | --auth-method basic |
Simplest start — PDIs and dev instances. SN_USER / SN_PASSWORD. |
| OAuth 2.0 — Password grant | --auth-method oauth-password |
User-context Bearer tokens instead of raw Basic on every request. SN_OAUTH_CLIENT_ID / SN_OAUTH_CLIENT_SECRET plus SN_USER / SN_PASSWORD. |
| OAuth 2.0 — Client Credentials | --auth-method oauth-client-credentials |
Service-to-service — CI and automation with no user password. SN_OAUTH_CLIENT_ID / SN_OAUTH_CLIENT_SECRET. |
| OAuth 2.0 — JWT Bearer grant | --auth-method oauth-jwt-bearer |
Key-based trust — sign a JWT assertion instead of sending a password. SN_JWT_KEY (path to the signing PEM), SN_JWT_KID / SN_JWT_ISS / SN_JWT_SUB / SN_JWT_AUD, plus client id/secret. |
| Inbound REST API key | --auth-method api-key |
One revocable key, no password at all. SN_API_KEY; header name via SN_API_KEY_HEADER (default x-sn-apikey). |
| Mutual TLS (mTLS) | --client-cert / --client-key |
Certificate-pinned transport, layered onto any method above — not an --auth-method value. SN_CLIENT_CERT / SN_CLIENT_KEY (PEM paths), optional SN_CLIENT_KEY_PASSPHRASE. |
OAuth grants exchange credentials for a Bearer token at oauth_token.do, refreshing on
expiry or 401. The JWT signing key and mTLS cert/key are stored by path only — key material
never enters the encrypted store.
Where credentials live
The global store writes each instance to ~/.syncrona/credentials/<instance>.enc,
encrypted with AES-256-GCM. The encryption key is resolved with this precedence:
| Key source | How | Strength |
|---|---|---|
SYNCRONA_STORE_KEY |
Explicit 32-byte key (hex / base64) from a secrets manager — best for CI / shared environments. | Strongest |
| OS keychain (default) | macOS Keychain / Windows Credential Manager / libsecret via optional @napi-rs/keyring; opt out with SYNCRONA_USE_KEYCHAIN=0. |
Strong |
| Machine-derived (fallback) | Derived from hostname + username when the keychain is unavailable. Obfuscation-grade — guards against casual inspection, not a compromised account or stolen disk. | Obfuscation |
Safety model
- Least-privilege by default. A dedicated integration user with only the roles your scope needs.
- Encrypted credential store. AES-256-GCM at rest; set a real key or enable the keychain for genuine at-rest protection.
- Dry-run everything risky.
--dry-runpreviewspush,deploy,downloadandbuild; the MCP server gates writes behind confirmation and dry-run. - Destructive ops confirm first.
downloadandrepairask before overwriting (--ciskips the prompt) — keep source in Git so a bad run is agit checkoutaway. - Secrets stay out of Git. Ignore
.envandnode_modules; for CI, sourceSYNCRONA_STORE_KEYfrom a secrets manager. - One secret detector, fail-closed.
@syncrona/redactionis the single answer to “is this a credential?” — key names, secret-shaped values, a bounded scan budget that reports rather than skips oversized input, and a redaction marker digested from the plaintext so a rotated secret still shows a diff.
With the default machine-derived key, anyone who can read the .enc file as your user can
decrypt it. Report vulnerabilities and review data handling in
SECURITY.md.
Architecture
A Node 22 monorepo of 14 @syncrona/* packages. Two ServiceNow clients — the
core CLI and the MCP server — share one transport policy, one encrypted credential store and one secret
detector, so auth, scoped-API resolution, retry behaviour and redaction are identical across both.
types keep
their contracts in lock-step, and six build plugins power the local pipeline — one Node 22 workspace.
CLI commands and MCP tool families are each declared one entry at a time in a registry; the orchestrators are
generic interpreters, so adding a command or tool family is a contained, contract-checked change. Quality
gates (type-check, lint, dependency-cruiser module boundaries, tests) run via npm run check. Full
detail:
docs/ARCHITECTURE.md.
FAQ
How do I delete something?
How do I add new scripts?
Does my source code still live in ServiceNow?
How do I work with multiple instances or scopes?
login / use / instances) or instance-profile env vars with --instance-profile to route one command at dev, test or prod. For several scoped apps in one repo, treat each scope as its own project under packages/, run commands from the scope directory, and share node_modules and plugins at the root. status shows which instance and credential source are active.Is SyncroNow AI affiliated with ServiceNow?
Does it work without installing anything on the instance?
How is this different from ServiceNow's native Git?
Does it run on Windows?
syncrona command inside the WSL shell. Native Windows support is on the roadmap; macOS and Linux are first-class.Is it production-ready?
Why the package name @syncrona/*?
@syncrona npm scope (the CLI is syncrona, exposing the syncrona command); the GitHub repository is IvanBBaev/syncrona. It is the modern successor to Sincronia / sinc.