Sentry Node SDK
getsentry/sentry-for-ai
Full Sentry SDK setup for Node.js, Bun, and Deno. An agent skill from getsentry/sentry-for-ai.
Walks a contributor through adding a new HTTP framework integration to the evlog logging package: middleware source, build entry, exports, tests, example app and docs.
$ npx skills add evloghq/evlog --skill create-evlog-framework-integration -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install evloghq/evlog create-evlog-framework-integration --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/evloghq/evlog.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/create-framework-integration .claude/skills/create-evlog-framework-integration && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "create-evlog-framework-integration" agent skill from https://github.com/evloghq/evlog/tree/main/.agents/skills/create-framework-integration into .claude/skills/create-evlog-framework-integration/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "create-evlog-framework-integration", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/evloghq/evlog/tree/main/.agents/skills/create-framework-integrationType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add evloghq/evlog --skill create-evlog-framework-integration -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install evloghq/evlog create-evlog-framework-integration --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/evloghq/evlog.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.agents/skills/create-framework-integration .agents/skills/create-evlog-framework-integration && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "create-evlog-framework-integration" agent skill from https://github.com/evloghq/evlog/tree/main/.agents/skills/create-framework-integration into .agents/skills/create-evlog-framework-integration/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "create-evlog-framework-integration", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add evloghq/evlog --skill create-evlog-framework-integration -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install evloghq/evlog create-evlog-framework-integration --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/evloghq/evlog.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.agents/skills/create-framework-integration .cursor/skills/create-evlog-framework-integration && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "create-evlog-framework-integration" agent skill from https://github.com/evloghq/evlog/tree/main/.agents/skills/create-framework-integration into .cursor/skills/create-evlog-framework-integration/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "create-evlog-framework-integration", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/evloghq/evlog.git --path .agents/skills/create-framework-integration--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add evloghq/evlog --skill create-evlog-framework-integration -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install evloghq/evlog create-evlog-framework-integration --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/evloghq/evlog.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.agents/skills/create-framework-integration .gemini/skills/create-evlog-framework-integration && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "create-evlog-framework-integration" agent skill from https://github.com/evloghq/evlog/tree/main/.agents/skills/create-framework-integration into .gemini/skills/create-evlog-framework-integration/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "create-evlog-framework-integration", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install evloghq/evlog create-evlog-framework-integrationInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add evloghq/evlog --skill create-evlog-framework-integration -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/evloghq/evlog.git skills-src && mkdir -p .github/skills && cp -r skills-src/.agents/skills/create-framework-integration .github/skills/create-evlog-framework-integration && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "create-evlog-framework-integration" agent skill from https://github.com/evloghq/evlog/tree/main/.agents/skills/create-framework-integration into .github/skills/create-evlog-framework-integration/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "create-evlog-framework-integration", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add evloghq/evlog --skill create-evlog-framework-integration -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install evloghq/evlog create-evlog-framework-integration --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/evloghq/evlog.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.agents/skills/create-framework-integration .opencode/skills/create-evlog-framework-integration && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "create-evlog-framework-integration" agent skill from https://github.com/evloghq/evlog/tree/main/.agents/skills/create-framework-integration into .opencode/skills/create-evlog-framework-integration/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "create-evlog-framework-integration", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
create-evlog-framework-integrationWalks a contributor through adding a new HTTP framework integration to the evlog logging package: middleware source, build entry, exports, tests, example app and docs.
The preferred route is manifest mode. You call `defineFrameworkIntegration` from `evlog/toolkit` once, passing request extraction and logger attachment functions with optional storage, then write a small middleware that starts the integration and runs the framework's `next()` inside `runWith`. It suits any framework with a request and response middleware shape and takes roughly 30 to 80 lines. Custom mode with `createMiddlewareLogger` is for frameworks whose lifecycle does not fit, such as Next.js, Nitro and Eve.
Every integration must expose an `evlog()` middleware or plugin that accepts the full base options, an `AsyncLocalStorage`-backed `useLogger()` with Workers as the one exception, `log.fork()` support, and the framework's native accessor. The skill also gives the pull request title convention, with a caveat that a brand-new scope fails the semantic title check until it is registered in an earlier PR or the title is left unscoped, and a touchpoints checklist that starts with the integration source and the tsdown build config.
8 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit 59a105f. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
pnpmFrom the folder's file list and the shell code blocks in SKILL.md.
Links to these hosts (documentation or services it may open):
evlog.devFrom URLs in SKILL.md, links to its own repository left out.
Names these keys or tokens, usually read from environment variables:
POSTHOG_API_KEYFrom names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
evlog Framework Integration loads about 5k tokens when it runs. Until then it costs about 88 tokens; SKILL.md has 1,431 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check noted patterns worth knowing about, such as sudo or a known installer.
mple {framework}` (which loads the root `.env` via dotenv, so no root `package.json` change is needed).). `POSTHOG_API_KEY` is set in the root `.env` (maintainer's key, not committed), so every example exercises a real exteAutomated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from evloghq/evlog at commit 59a105f, republished under its MIT licence (© evloghq). 1,431 words, ~4,991 tokens.
.claude/skills/create-evlog-framework-integration/SKILL.md (or your agent's skills folder).Add a new framework integration to evlog. The recommended path is the manifest mode built on defineFrameworkIntegration from evlog/toolkit, for any framework with a request/response middleware shape. For frameworks with a fundamentally different lifecycle you'll fall back to the lower-level createMiddlewareLogger.
defineFrameworkIntegration({ name, extractRequest, attachLogger, storage? }) once at module level, then write a tiny middleware that calls integration.start(ctx, options) and runs the framework's next() inside runWith. Reference implementations: all of packages/evlog/src/{hono,express,fastify,elysia,nestjs,orpc,react-router,sveltekit,workers}/index.ts use it.createMiddlewareLogger directly when the framework's lifecycle doesn't fit a standard middleware. Current custom-mode integrations: Next.js (src/next/), Nitro v2/v3 (src/nitro/, src/nitro-v3/), Eve (src/eve/).Manifest mode now covers all classic HTTP frameworks. Use custom mode only when you can't extract a request synchronously at the start of the lifecycle (server actions, module-level hooks, agent turns).
Every framework integration must expose:
evlog() middleware/plugin accepting the full BaseEvlogOptions (drain, enrich, keep, include, exclude, routes, plugins)useLogger() (ALS-backed). Workers is the one sanctioned exception (ALS needs a compat flag there; defineWorkerFetch attaches the logger instead)log.fork() support (automatic when storage is provided to the manifest)c.get('log'), req.log, event.locals.log, …)feat({framework}): add {Framework} middleware integrationScope timing caveat: the semantic PR check reads its scope list from the base branch, so a brand-new scope can't validate the very PR that introduces it. Either register the scope in a small preceding PR, or use an unscoped title (feat: add {Framework} middleware integration) on the introducing PR.
| # | File | Action |
|---|---|---|
| 1 | packages/evlog/src/{framework}/index.ts | Create integration source |
| 2 | packages/evlog/tsdown.config.ts | Add build entry + external |
| 3 | packages/evlog/package.json | Add exports + typesVersions + optional peer dep + keyword |
| 4 | packages/evlog/test/frameworks/{framework}.test.ts | Create tests (real request driver + describeStandardHttpMatrix) |
| 5 | packages/evlog/test/toolkit/__snapshots__/api-surface.test.ts.snap | Regenerated by pnpm run build + pnpm test |
| 6 | apps/docs/content/4.integrate/frameworks/{NN}.{framework}.md | Create framework docs page |
| 7 | apps/docs/content/4.integrate/frameworks/00.overview.md | Add table row + card |
| 8 | apps/docs/content/1.start/3.installation.md | Add card in "Choose Your Framework" |
| 9 | apps/docs/content/0.landing.md | Add framework code snippet slot |
| 10 | apps/docs/app/components/features/FeatureFrameworks.vue | Add framework tab |
| 11 | skills/review-logging-patterns/SKILL.md | Add framework setup section + update frontmatter description |
| 12 | packages/evlog/README.md | Add framework section + row in the Framework Support table |
| 13 | examples/{framework}/ | Create example app with test UI (auto-discovered by pnpm example {framework}, no root script needed) |
| 14 | .changeset/{framework}-integration.md | Create changeset (minor) |
| 15 | .github/workflows/semantic-pull-request.yml + .github/pull_request_template.md | Register {framework} as a PR scope in both files |
Important: Do NOT consider the task complete until all 15 touchpoints have been addressed.
| Placeholder | Example (Hono) | Usage |
|---|---|---|
{framework} | hono | Directory names, import paths, file names, PR scope |
{Framework} | Hono | PascalCase in type/interface names |
All integrations share the same core utilities. Never reimplement logic that exists in shared/. These are also publicly available as evlog/toolkit for community-built integrations (see Custom Integration docs).
| Utility | Location | Purpose |
|---|---|---|
defineFrameworkIntegration | ../shared/integration | Manifest factory: extract request, create logger, attach, run with ALS |
createMiddlewareLogger | ../shared/middleware | Lower-level lifecycle (custom mode): logger creation, route filtering, tail sampling, emit, enrich, drain |
BaseEvlogOptions | ../shared/middleware | Base user-facing options type with drain, enrich, keep, include, exclude, routes, plugins |
createLoggerStorage | ../shared/storage (evlog/toolkit/storage) | Factory returning { storage, useLogger } for AsyncLocalStorage-backed useLogger(). Prefer evlog/toolkit/storage on Workers / edge |
shouldDeferEmitForResponse | ../shared/streamResponse | Defer the wide event until a streaming body closes (see Hono/Elysia) |
defineFrameworkIntegration automatically:
Headers and Node IncomingHttpHeaders (so you don't need to pick a header extractor)requestId when none is presentcreateMiddlewareLogger and surfaces its { logger, finish, skipped, middlewareOptions }log.fork() automatically when storage is providedrunWith(fn) to run downstream handlers inside the integration's ALSwaitUntil when the runtime provides one (Workers, Hono on Workers)Create packages/evlog/src/{framework}/index.ts.
import type { AuditableLogger } from '../audit'
import { defineFrameworkIntegration } from '../shared/integration'
import type { BaseEvlogOptions } from '../shared/middleware'
import { createLoggerStorage } from '../shared/storage'
const { storage, useLogger } = createLoggerStorage(
'middleware context. Make sure the evlog middleware is registered before your routes.',
'evlog:{framework}',
)
export type Evlog{Framework}Options = BaseEvlogOptions
export { useLogger }
// Type augmentation for typed logger access (framework-specific):
// - Express: declare module 'express-serve-static-core' { interface Request { log: AuditableLogger } }
// - Hono: export type EvlogVariables = { Variables: { log: AuditableLogger } }
const integration = defineFrameworkIntegration<{Framework}Context>({
name: '{framework}',
extractRequest: (ctx) => ({
method: /* ctx.method */,
path: /* ctx.path */,
headers: /* Web Headers OR Node headers OR plain object */,
requestId: /* x-request-id header or undefined → auto-generated */,
}),
attachLogger: (ctx, logger) => {
// Store in framework-idiomatic location:
// - Hono: c.set('log', logger)
// - Express: req.log = logger
},
storage,
})
export function evlog(options: Evlog{Framework}Options = {}): FrameworkMiddleware {
return async (ctx, next) => {
const { skipped, finish, runWith } = integration.start(ctx, options)
if (skipped) {
await next()
return
}
try {
await runWith(() => next())
await finish({ status: /* extract status from ctx */ })
} catch (error) {
await finish({ error: error as Error })
throw error
}
}
}src/hono/index.ts. c.set('log', logger) + ALS useLogger(), streaming deferral via shouldDeferEmitForResponse, waitUntil detectionsrc/express/index.ts. req.log, ALS storage, res.on('finish') for terminal statussrc/fastify/index.ts. Fastify hooks (onRequest / onResponse / onError), fastify-plugin wrappersrc/elysia/index.ts. Plugin with .derive({ as: 'global' }), storage.enterWith-style ALS, streaming deferralsrc/nestjs/index.ts. EvlogModule.forRoot() / forRootAsync() on top of the manifestsrc/orpc/index.ts. evlog() procedure middleware + withEvlog(handler) wrappersrc/react-router/index.ts. loggerContext = createContext<AuditableLogger>()src/sveltekit/index.ts. evlog() handle + evlogHandleError() + createEvlogHooks()src/workers/index.ts. defineWorkerFetch / withEvlog, no ALS useLogger() (compat-flag constraint)For integrations that bind with enterWith(), use createSharedEnterWithStorage from src/shared/asyncStorageScope.ts. Its capability probe runs in a temporary scope with a distinct store, preserving the importer's async context on Bun and Node.
defineFrameworkIntegration: it handles header normalization, request-id generation, ALS, fork attachment, and waitUntil.finish({ status }) on success and finish({ error }) on failure. finish runs emit + enrich + drain + plugin hooks.finish({ error }) so the framework's own error handler still runs.shouldDeferEmitForResponse; see Hono and Elysia).runEnrichAndDrain is internal to createMiddlewareLogger/finish.EvlogVariables for Hono).Use createMiddlewareLogger directly (skipping defineFrameworkIntegration) when:
Add a build entry in packages/evlog/tsdown.config.ts:
'{framework}/index': 'src/{framework}/index.ts',Also add the framework SDK to the external array (e.g., 'elysia', 'fastify').
In packages/evlog/package.json:
In exports (after the last framework entry):
"./{framework}": {
"types": "./dist/{framework}/index.d.mts",
"import": "./dist/{framework}/index.mjs"
}In typesVersions["*"]: "{framework}": ["./dist/{framework}/index.d.mts"]
In peerDependencies (version range) + peerDependenciesMeta ("optional": true), and add the framework name to keywords.
Exports without matching tsdown.config.ts entries fail test/toolkit/api-surface.test.ts.
Create packages/evlog/test/frameworks/{framework}.test.ts. Read packages/evlog/test/README.md first, especially the Framework runtime fidelity table.
Two non-negotiables:
app.request() (Hono), app.inject() (Fastify), app.handle(new Request(...)) (Elysia). If no Node-friendly driver exists, call the user-facing contract directly with realistic input shapes (see the SvelteKit and React Router tests). Never extract internals to test a substitute.describeStandardHttpMatrix({ name, mount }) from test/helpers/frameworkMatrix.ts. It covers the standard sweep (event emission, x-request-id, route service) for every HTTP framework.On top of the matrix, cover the framework-specific surface:
c.get('log'), req.log, …)logger.set() data appears in the emitted eventcreatePipelineSpies(), assertHttpEventEmitted, waitForDrainCalls, findEventViaDrain from test/helpers/framework.ts)useLogger(): same logger as the native accessor, works across async boundaries, throws outside context. Skip it for an integration without ALS, and test the accessor it ships instead: on Workers that is the handler's fourth argument, from defineWorkerFetch / withEvlogUse fake timers for anything time-based; defined() instead of !.
Create apps/docs/content/4.integrate/frameworks/{NN}.{framework}.md with a comprehensive, self-contained guide. Check existing files for the next zero-padded number.
Frontmatter:
---
title: {Framework}
description: Using evlog with {Framework}: automatic wide events, structured errors, drain adapters, enrichers, and tail sampling in {Framework} applications.
navigation:
title: {Framework}
icon: i-simple-icons-{framework}
links:
- label: Source Code
icon: i-simple-icons-github
to: https://github.com/evloghq/evlog/tree/main/examples/{framework}
color: neutral
variant: subtle
---Sections (follow the Express/Hono/Elysia pages as reference):
log.set() usagecreateError() + parseError() + framework error handlercreateDrainPipeline examplekeep callbackinclude / exclude / routesevlog/http) (only if the framework has a client-side story)pnpm example {framework}In apps/docs/content/4.integrate/frameworks/00.overview.md:
In apps/docs/content/1.start/3.installation.md: add a card in the "Choose Your Framework" ::card-group, in the same order as the frameworks overview.
In apps/docs/content/0.landing.md, find the FeatureFrameworks MDC section (slots #nuxt, #nextjs, #hono, …) and add a new slot:
#{framework}
```ts [src/index.ts]
// Framework-specific code example showing evlog usage
## Step 8: FeatureFrameworks Component
Update `apps/docs/app/components/features/FeatureFrameworks.vue`:
1. Add the framework to the `frameworks` array with its icon and the next available `tab` index
2. Add a `<div v-if="activeTab === {N}">` with `<slot name="{framework}" />` in the template
Icons use Simple Icons format: `i-simple-icons-{name}`.
## Step 9: Update the Public Skill
In `skills/review-logging-patterns/SKILL.md` (published on evlog.dev):
1. Add `### {Framework}` in the **"Framework Setup"** section, in the same order as the docs
2. Include: import + `initLogger` + middleware setup; native logger access; a `useLogger()` snippet, or the accessor that replaces it when the integration has no ALS; full pipeline example (`drain`, `enrich`, `keep`)
3. Update the `description:` line in the YAML frontmatter to mention the new framework name
## Step 10: Update README
In `packages/evlog/README.md` (root `README.md` is a symlink):
1. Add a `## {Framework}` section near the other framework sections with a minimal setup snippet and a link to the example app
2. Add a row to the **Framework Support** table
Keep the snippet short: init, register middleware, one route handler showing logger access.
## Step 11: Example App
Create `examples/{framework}/` with a runnable app demonstrating all evlog features. It is auto-discovered by the root runner: `pnpm example {framework}` (which loads the root `.env` via dotenv, so no root `package.json` change is needed).
The app must include:
1. **`evlog()` middleware** with `drain` (PostHog) and `enrich` callbacks
2. **Health route**: basic `log.set()` usage
3. **Data route**: context accumulation with user/business data, using `useLogger()` in a service function, or the integration's own accessor when it has no ALS
4. **Error route**: `createError()` with status/why/fix/link
5. **Error handler**: framework's error handler with `parseError()` + manual `log.error()`
6. **Test UI**: served at `/`, a self-contained HTML page with buttons to hit each route and display JSON responses
**Drain must use PostHog** (`createPostHogDrain()` from `evlog/posthog`). `POSTHOG_API_KEY` is set in the root `.env` (maintainer's key, not committed), so every example exercises a real external drain. Without the env var the drain resolves to `null` and skips, so someone cloning the repo sends nothing anywhere unless they opt in with their own key. Enable pretty printing for readable local output.
**Type the `enrich` callback parameter explicitly**, as `(ctx: EnrichContext) => ...` with `type EnrichContext` imported from `evlog`.
### Test UI
Reference: `examples/hono/src/ui.ts`, a single `src/ui.ts` exporting `testUI()` returning a self-contained dark-theme HTML string (route list with method badges, click-to-fetch, JSON display, status colors, response time). Register the `/` route **before** the evlog middleware so it isn't logged.
### Required files
| File | Purpose |
|------|---------|
| `src/index.ts` | App with all features demonstrated |
| `src/ui.ts` | Test UI |
| `package.json` | `dev` and `start` scripts (`bun --watch src/index.ts` / `bun src/index.ts`) |
| `tsconfig.json` | TypeScript config (if needed) |
| `README.md` | How to run + link to the UI |
There is also `examples/community-framework-skeleton/` showing the community-facing (toolkit-only) variant, so keep it in mind if the new integration changes the toolkit contract.
## Step 12: Changeset
Create `.changeset/{framework}-integration.md`:
```markdown
---
"evlog": minor
---
feat({framework}): add {Framework} middleware integration (`evlog/{framework}`) with automatic wide-event logging, drain, enrich, and tail sampling supportAdd {framework} to the scopes list in .github/workflows/semantic-pull-request.yml and to the Scopes section of .github/pull_request_template.md, in alphabetical order. Remember the timing caveat from the PR Title section: this registration only takes effect for PRs whose base branch already contains it.
After a clean install, run pnpm run dev:prepare from the repo root first, then:
pnpm run dev:prepare
cd packages/evlog
pnpm run build # required before test — api-surface snapshot is gated on dist/
pnpm run test
pnpm run lintThen type-check the example:
cd examples/{framework}
pnpm exec tsc --noEmit© evloghq, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in .agents/skills/create-framework-integration of evloghq/evlog.
Open the folder on GitHubat commit 59a105f
evlog Framework Integration next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| evlog Framework Integration this skillevloghq/evlog | 1.9k | — | ~5k | Automated safety check: Notes | MIT | |
| Sentry Node SDKgetsentry/sentry-for-ai | 268 | — | ~8.4k | Automated safety check: Pass | Apache-2.0 | |
| Twenty Syncable Entity Typestwentyhq/twenty | 58k | — | ~2.8k | Automated safety check: Pass | Custom licence | |
| Add Server Env Var for User Settinglobehub/lobehub | 83k | — | ~644 | Automated safety check: Pass | Custom licence | |
| Typescript SecurityHoangNguyen0403/agent-skills-standard | 570 | — | ~817 | Automated safety check: Notes | MIT | |
| Twenty Syncable Entity Validationtwentyhq/twenty | 58k | — | ~3.3k | Automated safety check: Pass | Custom licence |
getsentry/sentry-for-ai
Full Sentry SDK setup for Node.js, Bun, and Deno. An agent skill from getsentry/sentry-for-ai.
twentyhq/twenty
Walks through the first of six steps for adding a syncable entity to Twenty's server: metadata name, TypeORM entity, flat types and central constants.
lobehub/lobehub
Adds a server-side environment variable that sets the default for a user setting in LobeHub, wired from the env schema through server config to the user store and docs.
HoangNguyen0403/agent-skills-standard
Secure server-side TypeScript input, auth tokens, and injection boundaries.
twentyhq/twenty
Contributor guide for step three of adding a syncable entity to the Twenty server: write the validator, the migration action builder and the orchestrator wiring.
swamp-club/swamp
Domain Driven Design guidance for TypeScript/Deno codebases.
evloghq/evlog
Walks through adding a new built-in evlog drain adapter for an observability platform: source, build config, exports, tests, docs and PR scope.
evloghq/evlog
Guides adding a new built-in enricher to the evlog package, covering the source, tests, docs, README, a related skill and a changeset.
evloghq/evlog
Reads the structured wide-event logs that evlog writes to .evlog/logs/ so the agent can debug errors, find slow requests and explain what the app did.
evloghq/evlog
Walks through adding a new rule or framework adapter to `evlog map` in @evlog/cli, from the rule source and registry to types, tests, docs and the published skill.
evloghq/evlog
Rules for writing and reviewing evlog docs, blog posts, READMEs, skills and AGENTS.md files, with separate review and rewrite roles, a house voice and a catalog of AI-sounding tells.
evloghq/evlog
Produce a before/after visual comparison of an evlog surface (landing, docs, telemetry, playgrounds) and share it as public Blob URLs.
Works with
Categories
Walks a contributor through adding a new HTTP framework integration to the evlog logging package: middleware source, build entry, exports, tests, example app and docs. The preferred route is manifest mode. You call `defineFrameworkIntegration` from `evlog/toolkit` once, passing request extraction and logger attachment functions with optional storage, then write a small middleware that starts the integration and runs the framework's `next()` inside `runWith`.
evlog Framework Integration fits situations like: adding middleware support for a framework such as Koa, H3 or Deno Fresh to evlog; deciding between manifest mode and a custom integration for an unusual lifecycle; checking a new integration against the required API surface before opening a PR.
Run `npx skills add evloghq/evlog --skill create-evlog-framework-integration -a claude-code`. Or copy the skill folder (.agents/skills/create-framework-integration in evloghq/evlog) into .claude/skills/create-evlog-framework-integration in your project. Claude Code loads it when a task matches its description.
Run `npx skills add evloghq/evlog --skill create-evlog-framework-integration -a codex`. Or copy the skill folder (.agents/skills/create-framework-integration in evloghq/evlog) into .agents/skills/create-evlog-framework-integration in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add evloghq/evlog --skill create-evlog-framework-integration -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/create-evlog-framework-integration, .gemini/skills/create-evlog-framework-integration, .github/skills/create-evlog-framework-integration and .opencode/skills/create-evlog-framework-integration in your project.
Going by SKILL.md and its folder, evlog Framework Integration needs the command-line tools its instructions call (pnpm) and credentials named POSTHOG_API_KEY. Our summary lists: A checkout of the evlog repository.
SKILL.md names 1 domain. As links in the text: evlog.dev. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found notes only (mentions a .env file), nothing it rates as a warning. It is not a guarantee. Review the folder before installing.
evlog Framework Integration is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 5k tokens (SKILL.md is roughly 20k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with evlog Framework Integration: Sentry Node SDK (getsentry/sentry-for-ai, 268 stars), Twenty Syncable Entity Types (twentyhq/twenty, 58k stars), Add Server Env Var for User Setting (lobehub/lobehub, 83k stars) and Typescript Security (HoangNguyen0403/agent-skills-standard, 570 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
evloghq (a GitHub organization) maintains it in evloghq/evlog, which has 1,885 GitHub stars. The repository holds 22 skills in this directory. The repository was last updated on October 6, 2026.
Source: evloghq/evlog on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.