Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Configure multi-environment setup for Evernote integrations. Use when setting up dev, staging, and production environments, or managing environment-specific configurations. Trigger with phrases like "evernote environments", "evernote staging", "evernote dev setup", "multiple environments evernote".
.claude/skills/jeremylongshore-evernote-multi-env-setup/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-02 | ✗→✓ | ▲ Improved | -6% | 0% |
| case-03 | ✗→✓ | ▲ Improved | 6% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 66% | 0% |
| case-09 | ✗→✓ | ▲ Improved | 11% | 0% |
| case-12 | ✗→✓ | ▲ Improved | 19% | 0% |
Configure separate development, staging, and production environments for Evernote integrations with proper isolation, configuration management, and environment-aware client factories.
evernote-ci-integration)Create per-environment config files that define the Evernote endpoint, sandbox flag, rate limit settings, and logging level.
javascript// config/environments.js const configs = { development: { sandbox: true, apiUrl: '', rateLimitDelayMs: 0, // No throttle in dev logLevel: 'debug' }, staging: { sandbox: true, apiUrl: '', rateLimitDelayMs: 100, logLevel: 'info' }, production: { sandbox: false, apiUrl: 'https://www.evernote.com', rateLimitDelayMs: 200, logLevel: 'warn' } }; module.exports = configs[process.env.NODE_ENV || 'development'];
Define environment-specific .env files. Each environment uses its own API key and token. The EVERNOTE_SANDBOX flag controls which Evernote endpoint the SDK connects to.
bash# .env.development - sandbox with dev token EVERNOTE_SANDBOX=true EVERNOTE_DEV_TOKEN=S=s1:U=... # .env.production - production with OAuth EVERNOTE_SANDBOX=false EVERNOTE_CONSUMER_KEY=prod-key EVERNOTE_CONSUMER_SECRET=prod-secret
Build a factory that creates properly configured Evernote clients based on the active environment. Include validation that production never uses sandbox tokens.
Define services for the app, Redis (caching), and a webhook receiver (ngrok or localtunnel) in docker-compose.yml. Mount .env.development as environment file.
Create a /health endpoint that verifies Evernote API connectivity, reports the active environment, and checks cache availability.
javascriptapp.get('/health', async (req, res) => { const checks = { environment: process.env.NODE_ENV, sandbox: config.sandbox, evernoteApi: 'unknown', cacheConnected: false }; try { await userStore.getUser(); checks.evernoteApi = 'connected'; } catch { checks.evernoteApi = 'error'; } res.json(checks); });
For the full configuration loader, client factory, Docker setup, and CI/CD environment matrix, see Implementation Guide.
.env templates for each environment| Error | Cause | Solution | |-------|-------|----------| | Invalid consumer key | Using sandbox key in production | Verify EVERNOTE_SANDBOX matches key type | | Wrong environment | NODE_ENV not set | Default to development, warn in logs | | Sandbox data in production | Environment misconfiguration | Add startup validation that checks key/env match | | Docker connection refused | Service not started | Run docker compose up before testing |
For observability setup, see evernote-observability.
Three-environment setup: Development uses sandbox Developer Token for instant testing. Staging uses sandbox OAuth for integration testing. Production uses production OAuth with full rate limiting and monitoring.
Docker local dev: Run docker compose up to start the app with Redis caching and ngrok for webhook testing, all preconfigured for the sandbox environment.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 35,095 | 22,031 | -37% | 1 | 1 | 0% | 7,227 | 5,114 | -29% | 0 | 0 | — |
case-02 | fail→pass | 27,812 | 28,785 | +3% | 1 | 1 | 0% | 6,190 | 5,818 | -6% | 0 | 0 | — |
case-03 | fail→pass | 35,146 | 31,014 | -12% | 1 | 1 | 0% | 5,598 | 5,952 | +6% | 0 | 0 | — |
case-04 | fail→fail | 20,847 | 18,506 | -11% | 1 | 1 | 0% | 2,997 | 3,729 | +24% | 0 | 0 | — |
case-05 | fail→fail | 16,070 | 12,887 | -20% | 1 | 1 | 0% | 2,489 | 3,235 | +30% | 0 | 0 | — |
case-06 | fail→fail | 11,692 | 5,493 | -53% | 1 | 1 | 0% | 2,118 | 1,856 | -12% | 0 | 0 | — |
case-07 | fail→pass | 10,221 | 8,193 | -20% | 1 | 1 | 0% | 1,510 | 2,500 | +66% | 0 | 0 | — |
case-08 | pass→pass | 13,959 | 14,611 | +5% | 1 | 1 | 0% | 2,100 | 3,217 | +53% | 0 | 0 | — |
case-09 | fail→pass | 16,140 | 9,035 | -44% | 1 | 1 | 0% | 2,343 | 2,597 | +11% | 0 | 0 | — |
case-10 | pass→pass | 12,613 | 15,589 | +24% | 1 | 1 | 0% | 1,898 | 3,216 | +69% | 0 | 0 | — |
case-11 | fail→fail | 15,418 | 18,892 | +23% | 1 | 1 | 0% | 2,592 | 3,590 | +39% | 0 | 0 | — |
case-12 | fail→pass | 13,434 | 9,480 | -29% | 1 | 1 | 0% | 2,498 | 2,966 | +19% | 0 | 0 | — |
case-13 | fail→fail | 15,622 | 18,760 | +20% | 1 | 1 | 0% | 2,592 | 3,579 | +38% | 0 | 0 | — |
case-14 | pass→pass | 20,832 | 20,849 | +0% | 1 | 1 | 0% | 3,557 | 4,220 | +19% | 0 | 0 | — |
case-15 | pass→pass | 15,588 | 17,257 | +11% | 1 | 1 | 0% | 2,281 | 3,673 | +61% | 0 | 0 | — |
case-16 | fail→pass | 13,802 | 9,952 | -28% | 1 | 1 | 0% | 2,051 | 2,406 | +17% | 0 | 0 | — |
case-17 | fail→fail | 16,386 | 12,251 | -25% | 1 | 1 | 0% | 2,228 | 2,714 | +22% | 0 | 0 | — |
case-18 | fail→pass | 12,123 | 13,723 | +13% | 1 | 1 | 0% | 2,014 | 2,916 | +45% | 0 | 0 | — |
case-19 | fail→fail | 6,641 | 5,713 | -14% | 1 | 1 | 0% | 1,048 | 1,730 | +65% | 0 | 0 | — |
case-20 | pass→pass | 10,880 | 11,290 | +4% | 1 | 1 | 0% | 1,640 | 3,004 | +83% | 0 | 0 | — |
case-21 | fail→fail | 20,562 | 13,590 | -34% | 1 | 1 | 0% | 3,190 | 3,447 | +8% | 0 | 0 | — |
case-22 | pass→pass | 9,826 | 10,111 | +3% | 1 | 1 | 0% | 1,917 | 2,662 | +39% | 0 | 0 | — |
case-23 | pass→pass | 19,556 | 13,692 | -30% | 1 | 1 | 0% | 3,169 | 4,045 | +28% | 0 | 0 | — |
case-24 | pass→pass | 10,313 | 6,554 | -36% | 1 | 1 | 0% | 1,273 | 2,075 | +63% | 0 | 0 | — |
case-25 | pass→pass | 18,076 | 13,638 | -25% | 1 | 1 | 0% | 3,018 | 3,751 | +24% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 25 cases were attempted. The headline lift of +28 percentage points is the difference between those two pass rates over the 25 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.