Generate Onboarding Guides, Architecture Maps, and Live Metrics. Turn your legacy code into a clear knowledge base instantly.
Document projects built with
We handle the heavy lifting asynchronously. You just get the result instantly.
Everything you need to transform your codebase into clear, up-to-date documentation.
Integrate directly into your CI/CD pipeline or run locally with a single command.
Track documentation coverage and quality over time. Identify undocumented modules instantly.
We don't just guess. We parse the AST to understand your code structure accurately.
Your code never trains our models. SOC2 Type II compliant infrastructure.
Export to Markdown, PDF, Notion, or deploy as a static site automatically.
Track technical debt, identify "Bus Factor" risks, and visualize codebase complexity over time.
Bus Factor
1.2Critical Risk: module `auth/core`
Maintainability
A+For open-source & side projects
Start FreeFor professional developers
Go ProFor engineering teams
Contact Salesexport async function processSub(uId: string, plan: string) {
const user = await db.user.findById(uId);
if (!user.isActive) throw new Error("403");
if (user.sub === plan) return null;
const price = PRICING[plan];
// Charge the user
await stripe.charges.create({
amount: price * 100,
currency: 'usd',
customer: user.stripeId
});
await db.user.update(uId, { sub: plan, status: 'active' });
await email.sendWelcome(user.email, plan);
return true;
}/**
* Upgrades user subscription and handles payment processing.
*
* @description
* 1. Verifies user status (must be active).
* 2. Deduplicates requests (returns null if already on plan).
* 3. Charges card via Stripe and updates local DB.
*
* @param {string} uId - Internal user UUID.
* @param {string} plan - Target plan ID (e.g., 'PRO_YEARLY').
* @throws {Error} "403" if user is suspended/inactive.
* @returns {Promise<boolean|null>} True on success, null if no change needed.
*
* @example
* try {
* await processSub("user_123", "ENTERPRISE");
* } catch (err) {
* logger.error("Payment failed", err);
* }
*/
export async function processSub(uId: string, plan: string) {
const user = await db.user.findById(uId);
if (!user.isActive) throw new Error("403"); // User suspended
if (user.sub === plan) return null; // Already subscribed
const price = PRICING[plan];
// Charge the user
await stripe.charges.create({
amount: price * 100, // Convert to cents
currency: 'usd',
customer: user.stripeId
});
// Update db and send email
await db.user.update(uId, { sub: plan, status: 'active' });
await email.sendWelcome(user.email, plan);
return true;
}From high-level overview to low-level byte manipulation. We generate every format your team needs.
Drop a simple config file in your root. We handle parsing, token limits, and prompt engineering automatically.
{
"project": "my-awesome-saas",
"entry": ["src/**/*.ts"],
"exclude": ["**/*.spec.ts"],
"output": {
"modes": ["onboarding", "technical", "migration-guide"],
"metrics": true,
"format": "markdown",
"path": "./docs"
},
"metrics": ["complexity", "bus-factor"]
}