<!-- mobian-agent-page publisher="dailydev" canonical="https://daily.dev/posts/docsferatu-an-agent-that-drafts-docs-prs-while-you-sleep-uqus6s1nz" -->

---
title: Docsferatu: an agent that drafts docs PRs while you sleep
description: Docsferatu is an agent built on Inngest that watches a team's SDK repo for pull requests, decides whether docs need updating, and drafts a docs PR in a sandbox...
canonical: https://daily.dev/posts/docsferatu-an-agent-that-drafts-docs-prs-while-you-sleep-uqus6s1nz
twitter:card: summary_large_image
twitter:site: @dailydotdev
og:type: website
og:site_name: daily.dev
og:title: Docsferatu: an agent that drafts docs PRs while you sleep | daily.dev
og:description: Docsferatu is an agent built on Inngest that watches a team's SDK repo for pull requests, decides whether docs need updating, and drafts a docs PR in a sandbox...
og:url: https://daily.dev/posts/docsferatu-an-agent-that-drafts-docs-prs-while-you-sleep-uqus6s1nz
og:image: https://api.daily.dev/og/posts/uQus6S1NZ.png
og:image:alt: Docsferatu: an agent that drafts docs PRs while you sleep
og:image:width: 1200
og:image:height: 630
og:locale: en
---

> ## Documentation Index
> Fetch the complete documentation index at: https://daily.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# Docsferatu: an agent that drafts docs PRs while you sleep

**[Inngest Blog](https://daily.dev/sources/inngest)** · 13 min read · 1 upvotes · 1 comments

## Summary

Docsferatu is an agent built on Inngest that watches a team's SDK repo for pull requests, decides whether docs need updating, and drafts a docs PR in a sandbox while the author sleeps. It uses durable execution so steps' results are saved and a crash doesn't re-run paid LLM calls. Debounce waits 5 minutes after the last commit in a burst, singleton cancels stale runs, and throttle caps drafts at 10 per hour. The agent gets no GitHub token and can only edit specific doc paths, enforced by a default-deny hook. Dependency snapshots cut check setup from scratch installs to about 6 seconds once built, versus 2.5 minutes to build. Across three real runs on inngest-js, one draft opened about 6 minutes after labeling, and another correctly decided no doc change was needed.

## Full article

daily.dev links to this article rather than hosting it. Read it at the original source: <https://www.inngest.com/blog/docsferatu-an-agent-that-drafts-docs-prs-while-you-sleep>

## Questions this post answers

### How can I prevent an AI coding agent from re-running expensive LLM calls after a crash mid-task?

Use durable execution, where a function is written as named steps and each step's result is saved once it finishes. On a crash or retry, finished steps return their saved results instead of re-running, so execution resumes after the last completed step. Inngest implements this by calling the function over HTTP repeatedly, replaying saved step results rather than paying for the same LLM call twice.

_daily.dev surfaces patterns like this for developers wiring resilience into long-running AI agent pipelines._

### How do you stop an AI agent with filesystem access from writing outside allowed directories or running shell commands?

Restrict the agent's tools to Read, Edit, Write, Glob, Grep and specific skills with no shell or web tools, then add a default-deny hook, a function that approves or rejects every tool call before it runs. The hook only allows writes under specific paths like 'pages/docs/**' and 'snippets/**', enforcing the restriction at the tool-call level rather than trusting the prompt.

_developers securing agent sandboxes weigh these isolation patterns before giving models write access._

### How can I avoid rebuilding dependencies from scratch every time an automated CI-like check runs for an AI agent?

Use a snapshot: a saved image of a machine with dependencies already installed, named after a hash of the lockfile so it only rebuilds when dependencies change. Building a snapshot took about 2.5 minutes in testing, while a sandbox started from an existing snapshot was ready in about 6 seconds, saving that build time on every subsequent check.

_teams tuning CI costs for agent-driven workflows compare snapshot strategies like this on daily.dev._

## Community discussion

Top comments from developers on daily.dev.

**@demovexa** · 0 upvotes

> Restricting the agent to specific doc paths with a default-deny hook is a nice touch. One thing a text-only drafter can't fix is media. When an SDK change alters output or a dashboard step, the page text gets updated in the draft PR, but the screenshot or short clip next to it still shows the old result. A cheap addition to triage: list any images or videos on the pages the draft touches, and put that list in the PR description so the reviewer knows what to re-capture before merging. I'm building DemoVexa, which renders walkthrough videos from an app's source, and we wrote about keeping...

## Similar posts on daily.dev

- [Show HN: Sphinx – A hook that quizzes you on your AI's code before shipping](https://daily.dev/posts/show-hn-sphinx-a-hook-that-quizzes-you-on-your-ai-s-code-before-shipping-rwaqe5pd2) · Hacker News · 1 upvotes · 0 comments
- [Agents in Production, Part 2: Build an AI-Native Coding Agent That Turns Tickets into Reviewed Pull Requests with Managed Agents](https://daily.dev/posts/agents-in-production-part-2-build-an-ai-native-coding-agent-that-turns-tickets-into-reviewed-pull--j8febodig) · DigitalOcean Community · 2 upvotes · 0 comments
- [Rails World '26: Rails in the Agentic Era](https://daily.dev/posts/rails-world-26-rails-in-the-agentic-era-tnjvjmh6h) · RUBYLAND · 1 upvotes · 0 comments
- [Test Agent Changes with LangSmith Preview Builds](https://daily.dev/posts/test-agent-changes-with-langsmith-preview-builds-vtzgl9crp) · LangChain · 1 upvotes · 0 comments
- [standup-sloth: a local LLM drafts your standup, and a citation check keeps it honest](https://daily.dev/posts/standup-sloth-a-local-llm-drafts-your-standup-and-a-citation-check-keeps-it-honest-twj3g0w2w) · Awesome Go · 2 upvotes · 1 comments

---

Tags: [#ai-agents](https://daily.dev/tags/ai-agents), [#claude](https://daily.dev/tags/claude), [#inngest](https://daily.dev/tags/inngest)

[View this post on daily.dev](https://daily.dev/posts/docsferatu-an-agent-that-drafts-docs-prs-while-you-sleep-uqus6s1nz)

```json
{"@context":"https://schema.org","@graph":[{"@type":"Organization","@id":"https://daily.dev/#organization","name":"daily.dev","url":"https://daily.dev","logo":{"@type":"ImageObject","url":"https://daily.dev/apple-touch-icon.png","width":180,"height":180},"sameAs":["https://twitter.com/dailydotdev","https://github.com/dailydotdev","https://www.linkedin.com/company/daily-dev-ltd"]},{"@type":"WebSite","@id":"https://daily.dev/#website","url":"https://daily.dev","name":"daily.dev","publisher":{"@id":"https://daily.dev/#organization"},"potentialAction":{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https://daily.dev/search?q={search_term_string}"},"query-input":"required name=search_term_string"}}]}
{"@context":"https://schema.org","@type":"TechArticle","headline":"Docsferatu: an agent that drafts docs PRs while you sleep","url":"https://daily.dev/posts/docsferatu-an-agent-that-drafts-docs-prs-while-you-sleep-uqus6s1nz","mainEntityOfPage":{"@type":"WebPage","@id":"https://daily.dev/posts/docsferatu-an-agent-that-drafts-docs-prs-while-you-sleep-uqus6s1nz"},"datePublished":"2026-10-31T17:52:06.678Z","dateModified":"2026-10-31T17:52:38.149Z","description":"Docsferatu is an agent built on Inngest that watches a team's SDK repo for pull requests, decides whether docs need updating, and drafts a docs PR in a sandbox...","image":"https://media.daily.dev/image/upload/f_auto,q_auto/v1/posts/f0ad4bbef9b78b22d97e505f8e56fc94?_a=AQAEuop","thumbnailUrl":"https://media.daily.dev/image/upload/f_auto,q_auto/v1/posts/f0ad4bbef9b78b22d97e505f8e56fc94?_a=AQAEuop","isAccessibleForFree":true,"articleSection":"Inngest Blog","inLanguage":"en","publisher":{"@type":"Organization","name":"daily.dev","url":"https://daily.dev","logo":{"@type":"ImageObject","url":"https://daily.dev/apple-touch-icon.png","width":180,"height":180}},"author":{"@type":"Organization","name":"Inngest Blog","logo":"https://media.daily.dev/image/upload/s--ieZKUa5y--/c_limit,w_256/f_auto,q_auto/v1789329423/logos/inngest?_a=BAMAMicg0","url":"https://daily.dev/sources/inngest"},"commentCount":1,"discussionUrl":"https://daily.dev/posts/docsferatu-an-agent-that-drafts-docs-prs-while-you-sleep-uqus6s1nz","interactionStatistic":[{"@type":"InteractionCounter","interactionType":{"@type":"LikeAction"},"userInteractionCount":1},{"@type":"InteractionCounter","interactionType":{"@type":"CommentAction"},"userInteractionCount":1}],"keywords":"ai-agents,claude,inngest","timeRequired":"PT13M"}
{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https://daily.dev"},{"@type":"ListItem","position":2,"name":"Inngest Blog","item":"https://daily.dev/sources/inngest"},{"@type":"ListItem","position":3,"name":"Docsferatu: an agent that drafts docs PRs while you sleep"}]}
{"@context":"https://schema.org","@type":"WebPage","@id":"https://daily.dev/posts/docsferatu-an-agent-that-drafts-docs-prs-while-you-sleep-uqus6s1nz","comment":[{"@type":"Comment","text":"Restricting the agent to specific doc paths with a default-deny hook is a nice touch. One thing a text-only drafter can’t fix is media. When an SDK change alters output or a dashboard step, the page text gets updated in the draft PR, but the screenshot or short clip next to it still shows the old result. A cheap addition to triage: list any images or videos on the pages the draft touches, and put that list in the PR description so the reviewer knows what to re-capture before merging. I’m building DemoVexa, which renders walkthrough videos from an app’s source, and we wrote about keeping how-to clips in docs in step with the text: https://demovexa.com/blog/how-to-videos-in-documentation?utm_source=dailydev\u0026amp;utm_medium=community\u0026amp;utm_campaign=comments","datePublished":"2026-11-01T02:56:59.404Z","url":"https://daily.dev/posts/uQus6S1NZ#c-tzLSnSg7r","author":{"@type":"Person","name":"DemoVexa","url":"https://daily.dev/demovexa","image":"https://media.daily.dev/image/upload/s--I0Ym8soj--/f_auto,pg_1/v1792077531/avatars/avatar_F6wD6jMSPjwEMcztjwnyE?_a=BAMAMicg0"}}]}
{"@context":"https://schema.org","@type":"FAQPage","@id":"https://daily.dev/posts/docsferatu-an-agent-that-drafts-docs-prs-while-you-sleep-uqus6s1nz#faq","mainEntity":[{"@type":"Question","name":"How can I prevent an AI coding agent from re-running expensive LLM calls after a crash mid-task?","acceptedAnswer":{"@type":"Answer","text":"Use durable execution, where a function is written as named steps and each step's result is saved once it finishes. On a crash or retry, finished steps return their saved results instead of re-running, so execution resumes after the last completed step. Inngest implements this by calling the function over HTTP repeatedly, replaying saved step results rather than paying for the same LLM call twice. daily.dev surfaces patterns like this for developers wiring resilience into long-running AI agent pipelines."}},{"@type":"Question","name":"How do you stop an AI agent with filesystem access from writing outside allowed directories or running shell commands?","acceptedAnswer":{"@type":"Answer","text":"Restrict the agent's tools to Read, Edit, Write, Glob, Grep and specific skills with no shell or web tools, then add a default-deny hook, a function that approves or rejects every tool call before it runs. The hook only allows writes under specific paths like 'pages/docs/**' and 'snippets/**', enforcing the restriction at the tool-call level rather than trusting the prompt. developers securing agent sandboxes weigh these isolation patterns before giving models write access."}},{"@type":"Question","name":"How can I avoid rebuilding dependencies from scratch every time an automated CI-like check runs for an AI agent?","acceptedAnswer":{"@type":"Answer","text":"Use a snapshot: a saved image of a machine with dependencies already installed, named after a hash of the lockfile so it only rebuilds when dependencies change. Building a snapshot took about 2.5 minutes in testing, while a sandbox started from an existing snapshot was ready in about 6 seconds, saving that build time on every subsequent check. teams tuning CI costs for agent-driven workflows compare snapshot strategies like this on daily.dev."}}]}
```

