{"_id":"@actinode/express-activitylog","_rev":"7-66f733318f2afd582f89d0a4a276a200","name":"@actinode/express-activitylog","dist-tags":{"latest":"0.2.5"},"versions":{"0.1.0":{"name":"@actinode/express-activitylog","version":"0.1.0","keywords":["express","middleware","activity-log","audit-log"],"license":"MIT","_id":"@actinode/express-activitylog@0.1.0","maintainers":[{"name":"actinode","email":"actinodesolutions@gmail.com"}],"dist":{"shasum":"e3f8a67e681841aba4d6600426821ca515629e99","tarball":"https://registry.npmjs.org/@actinode/express-activitylog/-/express-activitylog-0.1.0.tgz","fileCount":8,"integrity":"sha512-/ET+DiRixyh8weoWKmp9aw3kj2i2YtE6mv12jwcMqkOM9zoa75hdugWKROwH8TjYXMH44bH680rnG2aBKjL95w==","signatures":[{"sig":"MEUCIQDw/Xv4zgT64sll31TgH+IxbAkPJLKeViUHLHP/Ob52YQIgAWrjcSA7f5kkSJhUnIW33CXuBGWfBljEbPyWtH2HnXQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":32629},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"}},"gitHead":"4886d8f7b1e95a5d5840ed3aebbb642e2d14983b","scripts":{"dev":"tsup --watch","test":"vitest run","build":"tsup","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"actinode","email":"actinodesolutions@gmail.com"},"_npmVersion":"10.9.3","description":"Express middleware for activity logging, inspired by spatie/laravel-activitylog","directories":{},"_nodeVersion":"22.19.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","vitest":"^4.1.0","express":"^5.1.0","typescript":"^5.9.3","@types/node":"^25.5.0","@types/express":"^5.0.3"},"peerDependencies":{"express":"^4.0.0 || ^5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/express-activitylog_0.1.0_1774211348708_0.5092158030957779","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@actinode/express-activitylog","version":"0.2.0","keywords":["express","middleware","activity-log","audit-log"],"license":"MIT","_id":"@actinode/express-activitylog@0.2.0","maintainers":[{"name":"actinode","email":"actinodesolutions@gmail.com"}],"dist":{"shasum":"5ccbc1386f018ae13c6064e6b36f418d4af403df","tarball":"https://registry.npmjs.org/@actinode/express-activitylog/-/express-activitylog-0.2.0.tgz","fileCount":8,"integrity":"sha512-HOJW1M97TCsqTuNTV1Xah305MUBd+SAJtvuTLd9+gSRMu7pW6Aqr+zBpI2FfOZF7v7zP+8TELTvwIUoOUDOuFw==","signatures":[{"sig":"MEYCIQCbaa00AtqBJXj+U4sgYjlC5eh7wDK0gnlyih08ixSEWAIhAI6azhQ5a9/dCSkreE5pzFPB7Uzw90cU2Ff0P1y7TgB/","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":50168},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"}},"gitHead":"5d2d552efce390effda7ecb25f9b63efc8ae551a","scripts":{"dev":"tsup --watch","test":"vitest run","build":"tsup","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"actinode","email":"actinodesolutions@gmail.com"},"_npmVersion":"10.9.3","description":"Express middleware for activity logging, inspired by spatie/laravel-activitylog","directories":{},"_nodeVersion":"22.19.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","vitest":"^4.1.0","express":"^5.1.0","typescript":"^5.9.3","@types/node":"^25.5.0","@types/express":"^5.0.3"},"peerDependencies":{"express":"^4.0.0 || ^5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/express-activitylog_0.2.0_1774220806668_0.44676421311205194","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"@actinode/express-activitylog","version":"0.2.1","keywords":["express","middleware","activity-log","audit-log"],"license":"MIT","_id":"@actinode/express-activitylog@0.2.1","maintainers":[{"name":"actinode","email":"actinodesolutions@gmail.com"}],"dist":{"shasum":"848180b208d390770b28b39cfd5f36c2fa4d929d","tarball":"https://registry.npmjs.org/@actinode/express-activitylog/-/express-activitylog-0.2.1.tgz","fileCount":8,"integrity":"sha512-1jaW+q/sCIaPi9F8B8dvXtVqBEEnqHjgCUKJMT/FWD1R14V2KwprrqroXkUgfzdRVQiZP1LNgdCRo11pY0bNXg==","signatures":[{"sig":"MEQCIB+bLlF5SIlkMAWEWDYGJjRFyx8aVBZbTyPXbI7yC8XaAiBQfbQ1NIXMxalIDSs149m+EVFpoAuZ6N3jNZpt2IHaiQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":50292},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"}},"gitHead":"5023ee66b2e9040fad3665b4fa05900d64d956a5","scripts":{"dev":"tsup --watch","test":"vitest run","build":"tsup","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"actinode","email":"actinodesolutions@gmail.com"},"_npmVersion":"10.9.3","description":"Express middleware for activity logging, inspired by spatie/laravel-activitylog","directories":{},"_nodeVersion":"22.19.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","vitest":"^4.1.0","express":"^5.1.0","typescript":"^5.9.3","@types/node":"^25.5.0","@types/express":"^5.0.3"},"peerDependencies":{"express":"^4.0.0 || ^5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/express-activitylog_0.2.1_1774221342987_0.6395088394932595","host":"s3://npm-registry-packages-npm-production"}},"0.2.2":{"name":"@actinode/express-activitylog","version":"0.2.2","keywords":["express","middleware","activity-log","audit-log"],"license":"MIT","_id":"@actinode/express-activitylog@0.2.2","maintainers":[{"name":"actinode","email":"actinodesolutions@gmail.com"}],"dist":{"shasum":"57d9a07ec042daaf0707599734a11f04b302b1c9","tarball":"https://registry.npmjs.org/@actinode/express-activitylog/-/express-activitylog-0.2.2.tgz","fileCount":8,"integrity":"sha512-U3hCEoSnPeEQTblUbeNDqSPfFsugukHuemotQIaGtbn0M3KSGMLNWCd7BcRZKjR2FqRu+hn9xeYIt3oSbg7njg==","signatures":[{"sig":"MEUCIQD1dJPmO8BgRD7kgE8iaUhkVYUW99OewIQ2+3fSdiXTDQIgcM99BQqmItvuFdzSZDZlf3zaAb0RLp40tJFgeEXMDC4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":50269},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"}},"gitHead":"b1699011dcb49fdd7958e263e3cc88db9b6046dc","scripts":{"dev":"tsup --watch","test":"vitest run","build":"tsup","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"actinode","email":"actinodesolutions@gmail.com"},"_npmVersion":"10.9.3","description":"Express middleware for activity logging — high quality, well tested, and built for Node.js","directories":{},"_nodeVersion":"22.19.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","vitest":"^4.1.0","express":"^5.1.0","typescript":"^5.9.3","@types/node":"^25.5.0","@types/express":"^5.0.3"},"peerDependencies":{"express":"^4.0.0 || ^5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/express-activitylog_0.2.2_1774390015133_0.3065385347616232","host":"s3://npm-registry-packages-npm-production"}},"0.2.3":{"name":"@actinode/express-activitylog","version":"0.2.3","keywords":["express","middleware","activity-log","audit-log"],"license":"MIT","_id":"@actinode/express-activitylog@0.2.3","maintainers":[{"name":"actinode","email":"actinodesolutions@gmail.com"}],"dist":{"shasum":"be599e9aa494994beabb3937597f1c4a20ee734d","tarball":"https://registry.npmjs.org/@actinode/express-activitylog/-/express-activitylog-0.2.3.tgz","fileCount":8,"integrity":"sha512-r8UD70JzVJkf30/29UZTcCCWiDLcweVm0TJ46R1nGY9JiwcnK11XOnNpI9dHAc2oz3CKckMIEme0+2CzVN/mEQ==","signatures":[{"sig":"MEYCIQCJu+UjudyVupFIbiPlxDT1EEYfOqudbGAZZ/d5n8yL2QIhAOBwBdYto7DOF2ESHBOJniQImpBta3/P1+0aR0p5GTlR","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":51399},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"}},"gitHead":"3407619148484c51b364a0c6e773e4db5a454119","scripts":{"dev":"tsup --watch","test":"vitest run","build":"tsup","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"actinode","email":"actinodesolutions@gmail.com"},"_npmVersion":"10.9.3","description":"Express middleware for activity logging — high quality, well tested, and built for Node.js","directories":{},"_nodeVersion":"22.19.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","vitest":"^4.1.0","express":"^5.1.0","typescript":"^5.9.3","@types/node":"^25.5.0","@types/express":"^5.0.3"},"peerDependencies":{"express":"^4.0.0 || ^5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/express-activitylog_0.2.3_1774562923506_0.9270002484026125","host":"s3://npm-registry-packages-npm-production"}},"0.2.4":{"name":"@actinode/express-activitylog","version":"0.2.4","keywords":["express","middleware","activity-log","audit-log"],"license":"MIT","_id":"@actinode/express-activitylog@0.2.4","maintainers":[{"name":"actinode","email":"actinodesolutions@gmail.com"}],"dist":{"shasum":"463871cf0a4b9df042fa6c65590a1660a7c4f208","tarball":"https://registry.npmjs.org/@actinode/express-activitylog/-/express-activitylog-0.2.4.tgz","fileCount":8,"integrity":"sha512-ywtIHXJd3Fc9nitL+7AUDFAOtwNY34O0C9cSgV1k915c+9huGRkmnp1prJVnTN4wJUj9i/xYnT6iHS9/o+gAQw==","signatures":[{"sig":"MEYCIQC2Ns42ChgyHaFc2W4AcR4Co4TmtPNVtcgLiSw4GsIbXQIhAO7D439sNGU/0ovLNFBzi5hOS3F4Ij6ldD2AM2So2M3b","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":52024},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"}},"gitHead":"7fb46e95cf68bc30a5c526d48735d0f0daadf2f4","scripts":{"dev":"tsup --watch","test":"vitest run","build":"tsup","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"actinode","email":"actinodesolutions@gmail.com"},"_npmVersion":"10.9.3","description":"Express middleware for activity logging — high quality, well tested, and built for Node.js","directories":{},"_nodeVersion":"22.19.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","vitest":"^4.1.0","express":"^5.1.0","typescript":"^5.9.3","@types/node":"^25.5.0","@types/express":"^5.0.3"},"peerDependencies":{"express":"^4.0.0 || ^5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/express-activitylog_0.2.4_1774564677845_0.7536124763207663","host":"s3://npm-registry-packages-npm-production"}},"0.2.5":{"name":"@actinode/express-activitylog","version":"0.2.5","description":"Express middleware for activity logging — high quality, well tested, and built for Node.js","main":"dist/index.js","module":"dist/index.mjs","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"}},"scripts":{"build":"tsup","dev":"tsup --watch","test":"vitest run","test:watch":"vitest","typecheck":"tsc --noEmit"},"homepage":"https://docs.actinode.com/express/activitylog/","repository":{"type":"git","url":"git+https://github.com/actinode/community.git"},"bugs":{"url":"https://github.com/actinode/community/issues/new?template=bug_report.md"},"keywords":["actinode","express","activity-log","audit-log","middleware","nodejs","typescript","prisma","mongoose"],"license":"MIT","peerDependencies":{"express":"^4.0.0 || ^5.0.0"},"devDependencies":{"@types/express":"^5.0.3","@types/node":"^25.5.0","express":"^5.1.0","tsup":"^8.5.1","typescript":"^5.9.3","vitest":"^4.1.0"},"publishConfig":{"access":"public"},"_id":"@actinode/express-activitylog@0.2.5","gitHead":"190d302f63d061373695b9247a0774dcb70bda72","_nodeVersion":"22.19.0","_npmVersion":"10.9.3","dist":{"integrity":"sha512-cFSZ/XAoJi8pvqT4/oqQidYTDPlZ/P8TaoEicwN7t3ArV+OaG8Nx8YJm5MeayIbOym43PjXdsPfbBSrQGJAZ+g==","shasum":"76e2407a353c8c86847ab592d626dbaa1e6aae64","tarball":"https://registry.npmjs.org/@actinode/express-activitylog/-/express-activitylog-0.2.5.tgz","fileCount":8,"unpackedSize":52361,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDst0oJ8AmWR0ZDaJYK9lydF09VGaITmMS3I40w9n13RAIhALwLFV0VPHS06AO59ZSw80GcSrIW5U7AvvkbakHzDVbd"}]},"_npmUser":{"name":"actinode","email":"actinodesolutions@gmail.com"},"directories":{},"maintainers":[{"name":"actinode","email":"actinodesolutions@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/express-activitylog_0.2.5_1774565098106_0.2990256790727186"},"_hasShrinkwrap":false}},"time":{"created":"2026-03-22T20:29:08.616Z","modified":"2026-03-26T22:44:58.395Z","0.1.0":"2026-03-22T20:29:08.852Z","0.2.0":"2026-03-22T23:06:46.835Z","0.2.1":"2026-03-22T23:15:43.138Z","0.2.2":"2026-03-24T22:06:55.296Z","0.2.3":"2026-03-26T22:08:43.762Z","0.2.4":"2026-03-26T22:37:58.018Z","0.2.5":"2026-03-26T22:44:58.281Z"},"license":"MIT","keywords":["actinode","express","activity-log","audit-log","middleware","nodejs","typescript","prisma","mongoose"],"description":"Express middleware for activity logging — high quality, well tested, and built for Node.js","maintainers":[{"name":"actinode","email":"actinodesolutions@gmail.com"}],"readme":"# @actinode/express-activitylog\n\n[![Documentation](https://img.shields.io/badge/docs-actinode.com-blue)](https://docs.actinode.com)\n[![npm](https://img.shields.io/npm/v/@actinode/express-activitylog)](https://www.npmjs.com/package/@actinode/express-activitylog)\n[![license](https://img.shields.io/npm/l/@actinode/express-activitylog)](LICENSE)\n\nExpress middleware for activity logging — high quality, well tested, and built for Node.js.\n\n📚 **Full documentation at [docs.actinode.com](https://docs.actinode.com)**\n\n## Installation\n\n```bash\npnpm add @actinode/express-activitylog\n```\n\nPick your database adapter:\n\n> For detailed installation guide visit [docs.actinode.com](https://docs.actinode.com/express/activitylog/)\n\n```bash\n# Prisma\npnpm add @prisma/client\n\n# Mongoose\npnpm add mongoose\n```\n\n## Quick Start\n\n### Auto-log every request\n\n```typescript\nimport express from 'express'\nimport { activityLog, prismaAdapter } from '@actinode/express-activitylog'\nimport { PrismaClient } from '@prisma/client'\n\nconst prisma = new PrismaClient()\nconst app = express()\n\napp.use(activityLog({\n  adapter: prismaAdapter(prisma),\n  getUserId: (req) => req.user?.id,\n}))\n```\n\n### Manual fluent logging\n\n```typescript\nimport { activity, prismaAdapter } from '@actinode/express-activitylog'\n\nconst adapter = prismaAdapter(prisma)\n\nawait activity(adapter)\n  .by(user)           // who performed the action\n  .on(post)           // what it was performed on\n  .withProperties({ ip: req.ip })\n  .log('created')\n```\n\n> For full API reference and more examples visit [docs.actinode.com](https://docs.actinode.com/express/activitylog/api)\n\n## Adapters\n\n### Prisma\n\nAdd the `ActivityLog` model to your `schema.prisma`:\n\n```prisma\nmodel ActivityLog {\n  id          Int      @id @default(autoincrement())\n  description String\n  causerId    String?\n  causerType  String?\n  subjectId   String?\n  subjectType String?\n  properties  Json     @default(\"{}\")\n  createdAt   DateTime @default(now())\n}\n```\n\nThen run `prisma migrate dev`.\n\n```typescript\nimport { prismaAdapter } from '@actinode/express-activitylog'\n\nconst adapter = prismaAdapter(prisma)\n```\n\n### Mongoose\n\n```typescript\nimport mongoose from 'mongoose'\nimport { mongooseAdapter } from '@actinode/express-activitylog'\n\nconst adapter = mongooseAdapter(mongoose)\n```\n\nThe adapter creates an `ActivityLog` collection automatically with this shape:\n\n| Field        | Type   | Description                  |\n|-------------|--------|------------------------------|\n| description  | String | What happened                |\n| causerId     | String | ID of the actor              |\n| causerType   | String | Class/type name of the actor |\n| subjectId    | String | ID of the target             |\n| subjectType  | String | Class/type name of the target|\n| properties   | Object | Extra metadata               |\n| createdAt    | Date   | Timestamp                    |\n\n## Masking sensitive data\n\nSensitive fields are automatically masked before they reach your database. Masking is applied to `req.body` in the middleware and to `.withProperties()` in the fluent builder.\n\n### Default masked fields\n\nThe following fields are always masked out of the box, even without any configuration:\n\n`password` · `passwordConfirmation` · `token` · `accessToken` · `refreshToken` · `secret` · `apiKey` · `creditCard` · `cardNumber` · `cvv` · `ssn`\n\n### Middleware mask config\n\n```typescript\nactivityLog({\n  adapter: prismaAdapter(prisma),\n  mask: {\n    denyList: ['password', 'token'],          // denyList: mask these fields\n    allowList: ['name', 'email', 'role'],     // allowList: mask everything else\n    replacement: '***',                       // default: '***masked***'\n    deep: true,                               // recurse into nested objects (default: true)\n    models: {\n      User: {\n        denyList: ['password', 'ssn'],\n        allowList: ['name', 'email'],\n      },\n      Payment: {\n        denyList: ['cardNumber', 'cvv'],\n      },\n    },\n  },\n})\n```\n\n`denyList` and `allowList` can be combined — the denyList is applied first, then the allowList.\n\n### Fluent `.mask()`\n\nMask specific fields on a single manual log entry:\n\n```typescript\nawait activity(adapter)\n  .by(user)\n  .on(post)\n  .withProperties({ title: 'Hello', secret: 'hidden' })\n  .mask(['secret'])\n  .log('created')\n// saved properties: { title: 'Hello', secret: '***masked***' }\n```\n\n### Custom replacement string\n\n```typescript\nactivityLog({\n  adapter,\n  mask: { replacement: '[REDACTED]' },\n})\n```\n\n### Per-model masking\n\nDifferent models can have different masking rules. The model key matches the causer's or subject's class name:\n\n```typescript\nactivityLog({\n  adapter,\n  mask: {\n    models: {\n      User: {\n        denyList: ['password', 'ssn'],\n        allowList: ['name', 'email'],\n      },\n      Payment: {\n        denyList: ['cardNumber', 'cvv'],\n      },\n    },\n  },\n})\n```\n\n### Custom masking logic\n\nYou can call `maskProperties` directly for any use case outside the middleware:\n\n```typescript\nimport { maskProperties, DEFAULT_MASKED_FIELDS } from '@actinode/express-activitylog'\n\nconst safe = maskProperties(req.body, {\n  denyList: [...DEFAULT_MASKED_FIELDS, 'myCustomField'],\n  replacement: '[hidden]',\n  deep: true,\n})\n```\n\n## API Reference\n\n### `activityLog(options)`\n\nExpress middleware factory.\n\n| Option           | Type                          | Required | Description                                    |\n|-----------------|-------------------------------|----------|------------------------------------------------|\n| `adapter`        | `ActivityAdapter`             | Yes      | Database adapter                               |\n| `getUserId`      | `(req: Request) => string \\| undefined` | No | Extract user ID from request          |\n| `getDescription` | `(req: Request) => string`    | No       | Defaults to `\"METHOD /path\"`                   |\n| `skip`           | `(req: Request) => boolean`   | No       | Return `true` to skip logging this request     |\n\n### `activity(adapter)`\n\nReturns a fluent `ActivityLogger` instance.\n\n```typescript\nactivity(adapter)\n  .by(causer)                    // object with { id, constructor.name }\n  .on(subject)                   // object with { id, constructor.name }\n  .withProperties({ key: val })  // extra metadata\n  .log('description')            // saves and returns Promise<void>\n```\n\n### Types\n\n```typescript\ninterface ActivityAdapter {\n  save(payload: ActivityPayload): Promise<void>\n}\n\ninterface ActivityPayload {\n  description: string\n  causerId?: string\n  causerType?: string\n  subjectId?: string\n  subjectType?: string\n  properties?: Record<string, unknown>\n  createdAt: Date\n}\n\ninterface ActivityLogOptions {\n  adapter: ActivityAdapter\n  getUserId?: (req: Request) => string | undefined\n  getDescription?: (req: Request) => string\n  skip?: (req: Request) => boolean\n}\n```\n\n---\n\n## Issues & Support\n\n- 🐛 Found a bug? [Open a bug report](https://github.com/actinode/community/issues/new?template=bug_report.md)\n- 🚀 Have a feature idea? [Open a feature request](https://github.com/actinode/community/issues/new?template=feature_request.md)\n- 📦 Want a new package? [Open a package request](https://github.com/actinode/community/issues/new?template=package_request.md)\n- 💬 Questions and discussions? [Join the community](https://github.com/actinode/community/discussions)\n- 📚 Full documentation: [docs.actinode.com](https://docs.actinode.com/express/activitylog/)\n\n## Documentation\n\nFull documentation, guides and API reference is available at **[docs.actinode.com](https://docs.actinode.com)**\n\n- [Getting Started](https://docs.actinode.com/express/activitylog/)\n- [Masking](https://docs.actinode.com/express/activitylog/masking)\n- [API Reference](https://docs.actinode.com/express/activitylog/api)\n\n## Contributing\n\nContributions are welcome! Please visit our [GitHub repository](https://github.com/actinode/libs) to get started.\n\n## License\n\nMIT © [actinode](https://actinode.com)\n","readmeFilename":"README.md","homepage":"https://docs.actinode.com/express/activitylog/","repository":{"type":"git","url":"git+https://github.com/actinode/community.git"},"bugs":{"url":"https://github.com/actinode/community/issues/new?template=bug_report.md"}}