Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Set up efficient local development workflow for Evernote integrations. Use when configuring dev environment, setting up sandbox testing, or optimizing development iteration speed. Trigger with phrases like "evernote dev setup", "evernote local development", "evernote sandbox", "test evernote locally".
.claude/skills/jeremylongshore-evernote-local-dev-loop/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 71% | 0% |
| case-02 | ✗→✓ | ▲ Improved | 73% | 0% |
| case-05 | ✗→✓ | ▲ Improved | 34% | 0% |
| case-06 | ✗→✓ | ▲ Improved | 37% | 0% |
| case-09 | ✗→✓ | ▲ Improved | 145% | 0% |
Configure an efficient local development environment for Evernote API integration with sandbox testing, hot reload, ENML helpers, and a local Express server for OAuth testing.
evernote-install-auth setupOrganize your project with clear separation of concerns:
evernote-app/
src/
services/ # NoteService, SearchService, etc.
utils/ # ENML helpers, query builder
middleware/ # Auth, rate limiting
test/ # Unit and integration tests
scripts/ # Dev utilities (test-connection, seed-data)
.env.development # Sandbox credentials
.env.production # Production credentials (gitignored)Create .env.development with sandbox credentials. Use a Developer Token for quick iteration (skip OAuth during development). Add .env* to .gitignore.
bash# .env.development EVERNOTE_CONSUMER_KEY=your-sandbox-key EVERNOTE_CONSUMER_SECRET=your-sandbox-secret EVERNOTE_DEV_TOKEN=your-developer-token EVERNOTE_SANDBOX=true NODE_ENV=development PORT=3000
Create a client factory that switches between Developer Token (for scripts and tests) and OAuth (for the web app) based on environment configuration.
javascriptfunction createClient() { if (process.env.EVERNOTE_DEV_TOKEN) { return new Evernote.Client({ token: process.env.EVERNOTE_DEV_TOKEN, sandbox: true }); } return new Evernote.Client({ consumerKey: process.env.EVERNOTE_CONSUMER_KEY, consumerSecret: process.env.EVERNOTE_CONSUMER_SECRET, sandbox: process.env.EVERNOTE_SANDBOX === 'true' }); }
Build helper functions: wrapInENML(html), textToENML(text), htmlToENML(html) (strip forbidden elements), and validateENML(content). These prevent BAD_DATA_FORMAT errors during development.
Set up a local Express server with session management for OAuth flow testing. Include routes for /auth/start (get request token), /auth/callback (exchange for access token), and /dashboard (authenticated operations).
Create a scripts/test-connection.js that verifies SDK setup by calling userStore.getUser() and noteStore.listNotebooks(). Run with node scripts/test-connection.js.
For the full project setup, Express server, ENML utilities, and test scripts, see Implementation Guide.
| Error | Cause | Solution | |-------|-------|----------| | EVERNOTE_DEV_TOKEN not set | Missing dev token | Get from sandbox.evernote.com/api/DeveloperToken.action | | Invalid consumer key | Wrong sandbox vs production key | Verify EVERNOTE_SANDBOX matches your key type | | Session undefined | Missing express-session middleware | Install and configure express-session | | Port already in use | Another process on port 3000 | Change PORT in .env or kill the process |
Proceed to evernote-sdk-patterns for advanced SDK usage patterns.
Quick sandbox test: Set EVERNOTE_DEV_TOKEN, run node scripts/test-connection.js to verify authentication, then create a test note using the Developer Token shortcut.
Full OAuth loop: Start the Express server, navigate to http://localhost:3000/auth/start, complete the Evernote authorization, and verify the access token is stored in the session.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→pass | 20,210 | 26,042 | +29% | 1 | 1 | 0% | 3,227 | 5,506 | +71% | 0 | 0 | — |
case-02 | fail→pass | 19,047 | 31,897 | +67% | 1 | 1 | 0% | 3,678 | 6,369 | +73% | 0 | 0 | — |
case-03 | fail→fail | 32,283 | 20,615 | -36% | 1 | 1 | 0% | 5,419 | 5,331 | -2% | 0 | 0 | — |
case-04 | fail→fail | 12,711 | 10,649 | -16% | 1 | 1 | 0% | 2,501 | 3,040 | +22% | 0 | 0 | — |
case-05 | fail→pass | 11,685 | 9,497 | -19% | 1 | 1 | 0% | 2,061 | 2,759 | +34% | 0 | 0 | — |
case-06 | fail→pass | 21,071 | 20,901 | -1% | 1 | 1 | 0% | 3,661 | 5,023 | +37% | 0 | 0 | — |
case-07 | fail→fail | 18,448 | 23,512 | +27% | 1 | 1 | 0% | 3,986 | 5,071 | +27% | 0 | 0 | — |
case-08 | pass→pass | 9,796 | 7,470 | -24% | 1 | 1 | 0% | 1,887 | 2,432 | +29% | 0 | 0 | — |
case-09 | fail→pass | 9,443 | 4,276 | -55% | 1 | 1 | 0% | 672 | 1,648 | +145% | 0 | 0 | — |
case-10 | pass→pass | 11,160 | 4,691 | -58% | 1 | 1 | 0% | 1,594 | 1,891 | +19% | 0 | 0 | — |
case-11 | pass→pass | 11,213 | 12,749 | +14% | 1 | 1 | 0% | 1,627 | 2,443 | +50% | 0 | 0 | — |
case-12 | fail→pass | 9,978 | 7,783 | -22% | 1 | 1 | 0% | 1,753 | 2,312 | +32% | 0 | 0 | — |
case-13 | fail→pass | 12,917 | 3,066 | -76% | 1 | 1 | 0% | 1,713 | 1,611 | -6% | 0 | 0 | — |
case-14 | pass→fail | 14,676 | 12,543 | -15% | 1 | 1 | 0% | 2,562 | 2,942 | +15% | 0 | 0 | — |
case-15 | fail→pass | 8,711 | 7,004 | -20% | 1 | 1 | 0% | 1,526 | 2,111 | +38% | 0 | 0 | — |
case-16 | fail→pass | 13,245 | 6,237 | -53% | 1 | 1 | 0% | 2,281 | 2,323 | +2% | 0 | 0 | — |
case-17 | fail→pass | 10,916 | 3,377 | -69% | 1 | 1 | 0% | 1,911 | 1,496 | -22% | 0 | 0 | — |
case-18 | fail→pass | 4,605 | 4,361 | -5% | 1 | 1 | 0% | 856 | 1,740 | +103% | 0 | 0 | — |
case-19 | fail→pass | 9,864 | 4,580 | -54% | 1 | 1 | 0% | 1,813 | 1,900 | +5% | 0 | 0 | — |
case-20 | fail→fail | 19,102 | 14,596 | -24% | 1 | 1 | 0% | 2,686 | 3,699 | +38% | 0 | 0 | — |
case-21 | pass→pass | 14,773 | 14,897 | +1% | 1 | 1 | 0% | 2,240 | 3,579 | +60% | 0 | 0 | — |
case-22 | pass→pass | 5,445 | 7,699 | +41% | 1 | 1 | 0% | 816 | 2,179 | +167% | 0 | 0 | — |
case-23 | pass→pass | 14,494 | 11,857 | -18% | 1 | 1 | 0% | 2,708 | 3,424 | +26% | 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. 23 cases were attempted, and 22 counted toward the lift figure. The other 1 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +48 percentage points is the difference between those two pass rates over the 22 comparable cases. 1 case got worse with the skill loaded, and it is included in that figure.
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.