Skillshub evernote-local-dev-loop

install
source · Clone the upstream repo
git clone https://github.com/ComeOnOliver/skillshub
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/ComeOnOliver/skillshub "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/jeremylongshore/claude-code-plugins-plus-skills/evernote-local-dev-loop" ~/.claude/skills/comeonoliver-skillshub-evernote-local-dev-loop && rm -rf "$T"
manifest: skills/jeremylongshore/claude-code-plugins-plus-skills/evernote-local-dev-loop/SKILL.md
source content

Evernote Local Dev Loop

Overview

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.

Prerequisites

Instructions

Step 1: Project Structure

Organize 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)

Step 2: Environment Configuration

Create

.env.development
with sandbox credentials. Use a Developer Token for quick iteration (skip OAuth during development). Add
.env*
to
.gitignore
.

# .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

Step 3: Evernote Client Wrapper

Create a client factory that switches between Developer Token (for scripts and tests) and OAuth (for the web app) based on environment configuration.

function 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'
  });
}

Step 4: ENML Utility Helpers

Build helper functions:

wrapInENML(html)
,
textToENML(text)
,
htmlToENML(html)
(strip forbidden elements), and
validateENML(content)
. These prevent
BAD_DATA_FORMAT
errors during development.

Step 5: Express Server with OAuth

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).

Step 6: Quick Test Script

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.

Output

  • Project structure with services, utils, and middleware directories
  • Environment configuration for sandbox and production
  • Client factory with Developer Token and OAuth support
  • ENML utility library (wrap, convert, validate)
  • Express server with OAuth flow for local testing
  • Connection test script for quick verification

Error Handling

ErrorCauseSolution
EVERNOTE_DEV_TOKEN not set
Missing dev tokenGet from
sandbox.evernote.com/api/DeveloperToken.action
Invalid consumer key
Wrong sandbox vs production keyVerify
EVERNOTE_SANDBOX
matches your key type
Session undefined
Missing express-session middlewareInstall and configure
express-session
Port already in useAnother process on port 3000Change
PORT
in
.env
or kill the process

Resources

Next Steps

Proceed to

evernote-sdk-patterns
for advanced SDK usage patterns.

Examples

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.