A look at the thought process behind Ghostwriter’s development
This article walks through Ghostwriter’s technology stack and discusses much of the thought process behind various design decisions that went into Ghostwriter’s early development.
Introducing Ghostwriter: Part 2
Medium
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Ghostwriter Documentation","colors":{"primary":"#6D70A7","light":"#50B071","dark":"#6D70A7"},"logo":{"light":"https://mintcdn.com/specterops-2/rwxeaHvw9J2xZp6c/logo/light.svg?fit=max\u0026auto=format\u0026n=rwxeaHvw9J2xZp6c\u0026q=85\u0026s=7ba094d2f43cc72c0ed5bb0feedd46c2","dark":"https://mintcdn.com/specterops-2/rwxeaHvw9J2xZp6c/logo/dark.svg?fit=max\u0026auto=format\u0026n=rwxeaHvw9J2xZp6c\u0026q=85\u0026s=6d58f4692c9f7bfc4c03ea8f7db37fe3","href":"https://specterops.io/"},"favicon":"https://mintcdn.com/specterops-2/hxAceaiaqVHSIa3R/favicon.png?fit=max\u0026auto=format\u0026n=hxAceaiaqVHSIa3R\u0026q=85\u0026s=146677961412d6ff71d73e719e1c6c60","appearance":{"default":"light","strict":false},"background":{"decoration":"gradient"},"navbar":{"links":[{"href":"https://blog.getghostwriter.io/","label":"Learn More"},{"href":"https://code.getghostwriter.io/","label":"Get the Code"}],"primary":{"type":"button","label":"Support","href":"https://github.com/GhostManager/Ghostwriter/issues"}},"footer":{"socials":{"x":"https://twitter.com/specterops","github":"https://github.com/GhostManager/Ghostwriter","linkedin":"https://www.linkedin.com/company/specterops","slack":"https://slack.specterops.io","instagram":"https://www.instagram.com/specterops.io","youtube":"https://www.youtube.com/channel/UCWMKKqCCQkUjU8dIyiL1yhQ"}},"fonts":{"heading":{"family":"Nunito Sans","weight":900,"source":"https://fonts.gstatic.com/s/nunitosans/v15/pe0TMImSLYBIv1o4X1M8ce2xCx3yop4tQpF_MeTm0lfGWVpNn64CL7U8upHZIbMV51Q42ptCp7t1R-s.woff2","format":"woff2"}},"styling":{"codeblocks":"system","latex":false},"integrations":{"plausible":{"domain":"ghostwriter.wiki"}},"thumbnails":{"background":"https://mintcdn.com/specterops-2/0suYjBVe_0nHu2PQ/images/thumbnail.png?fit=max\u0026auto=format\u0026n=0suYjBVe_0nHu2PQ\u0026q=85\u0026s=779bd023e4a425e93f6924d3eb4b56b0"},"navigation":{"global":{"anchors":[{"anchor":"GitHub","icon":"github","href":"https://github.com/GhostManager/Ghostwriter"},{"anchor":"Community","icon":"slack","href":"https://join.slack.com/t/bloodhoundhq/shared_invite/zt-1tgq6ojd2-ixpx5nz9Wjtbhc3i8AVAWw"}]},"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"specterops-2","hasAudioNarration":false,"actualSubdomain":"specterops-2","customDomains":["www.ghostwriter.wiki"],"gitSource":{"type":"github","owner":"ghostmanager","repo":"ghostwriter","deployBranch":"master","contentDirectory":"DOCS","isPrivate":true,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6acec720b0647c1021582349","collectionId":"054edca7-98db-426f-a696-145794ef4336","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6acec720b0647c1021582349"},"entitlements":{"AI_CHAT":{"status":"ENABLED"},"REMOVE_BRANDING":{"status":"ENABLED"},"WEB_MCP":{"status":"ENABLED"},"NARRATION":{"status":"ENABLED"}},"buildId":"6acec720b0647c1021582349","clientVersion":"0.0.4045","searchFilterCounts":[{"language":"default","tag":"Home","count":103},{"language":"default","tag":"Features","count":66},{"language":"default","tag":"Development","count":16},{"language":"default","tag":"GraphQL API","count":14},{"language":"default","tag":"Reporting","count":14},{"language":"default","tag":"Configuring Global Settings","count":10},{"language":"default","tag":"Infrastructure Management","count":9},{"language":"default","tag":"Operation Logs","count":9},{"language":"default","tag":"Database Models","count":8},{"language":"default","tag":"Client \u0026 Project Management","count":8}]},"assistantConfig":{},"basePath":"","hasChatPermissions":true,"hasWebMcpPermissions":true,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"development/stack-overview/behind-the-scenes","slug":"/development/stack-overview/behind-the-scenes","pageMetadata":{"title":"Behind the Scenes","description":"A look at the thought process behind Ghostwriter's development","href":"/development/stack-overview/behind-the-scenes"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"A look at the thought process behind Ghostwriter’s development\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={p:`p`,..._provideComponents(),...props.components},{Card,CardGroup}=_components;if(!Card)_missingMdxReference(`Card`,true);if(!CardGroup)_missingMdxReference(`CardGroup`,true);return _jsxs(_Fragment,{children:[_jsx(_components.p,{children:`This article walks through Ghostwriter’s technology stack and discusses much of the thought process behind various design decisions that went into Ghostwriter’s early development.`}),`\n`,_jsxs(CardGroup,{cols:1,children:[` `,_jsx(Card,{title:`Introducing Ghostwriter: Part 2`,icon:`medium`,iconType:`solid`,href:`https://posts.specterops.io/introducing-ghostwriter-part-2-f2d8368a1ed6`,children:` Medium `}),` `]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"codeStyling":"system","config":{},"pageMetadata":{"title":"Behind the Scenes","description":"A look at the thought process behind Ghostwriter's development","href":"/development/stack-overview/behind-the-scenes"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":[],"subdomain":"specterops-2","siteName":"Ghostwriter Documentation","title":"Behind the Scenes - Ghostwriter Documentation","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-01-22T23:15:27.565Z","originalFileLocation":"development/stack-overview/behind-the-scenes.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"light\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"A look at the thought process behind Ghostwriter\u0026#x27;s development\">\u003cmeta data-mint-head name=\"application-name\" content=\"Ghostwriter Documentation\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/specterops-2/xhKbu44XUXjfbp1T/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/specterops-2/xhKbu44XUXjfbp1T/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/specterops-2/xhKbu44XUXjfbp1T/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/specterops-2/xhKbu44XUXjfbp1T/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/specterops-2/xhKbu44XUXjfbp1T/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/specterops-2/xhKbu44XUXjfbp1T/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/specterops-2/xhKbu44XUXjfbp1T/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/specterops-2/xhKbu44XUXjfbp1T/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/specterops-2/xhKbu44XUXjfbp1T/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Behind the Scenes - Ghostwriter Documentation\">\u003cmeta data-mint-head property=\"og:description\" content=\"A look at the thought process behind Ghostwriter\u0026#x27;s development\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Ghostwriter Documentation\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://www.ghostwriter.wiki/development/stack-overview/behind-the-scenes\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://specterops-2.mintlify.app/_mintlify/api/og/v2?division=Stack+Overview\u0026amp;title=Behind+the+Scenes\u0026amp;description=A+look+at+the+thought+process+behind+Ghostwriter%27s+development\u0026amp;theme=1b2d9326256b8f19fc3d10ae\u0026amp;signature=a8311835efcd4b8c2c2bf5c38333da5689bf29663b887313df33e23b5e8df510\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Behind the Scenes - Ghostwriter Documentation\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"A look at the thought process behind Ghostwriter\u0026#x27;s development\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://specterops-2.mintlify.app/_mintlify/api/og/v2?division=Stack+Overview\u0026amp;title=Behind+the+Scenes\u0026amp;description=A+look+at+the+thought+process+behind+Ghostwriter%27s+development\u0026amp;theme=1b2d9326256b8f19fc3d10ae\u0026amp;signature=a8311835efcd4b8c2c2bf5c38333da5689bf29663b887313df33e23b5e8df510\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/specterops-2/xhKbu44XUXjfbp1T/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Ghostwriter Documentation\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#6D70A7\">\u003clink data-mint-head rel=\"canonical\" href=\"https://www.ghostwriter.wiki/development/stack-overview/behind-the-scenes\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/development/stack-overview/behind-the-scenes.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://www.ghostwriter.wiki/#organization\",\"name\":\"Ghostwriter Documentation\",\"url\":\"https://www.ghostwriter.wiki\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/specterops-2/rwxeaHvw9J2xZp6c/logo/light.svg?fit=max\u0026auto=format\u0026n=rwxeaHvw9J2xZp6c\u0026q=85\u0026s=7ba094d2f43cc72c0ed5bb0feedd46c2\"}},{\"@type\":\"WebSite\",\"@id\":\"https://www.ghostwriter.wiki#website\",\"name\":\"Ghostwriter Documentation\",\"url\":\"https://www.ghostwriter.wiki\",\"publisher\":{\"@id\":\"https://www.ghostwriter.wiki/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://www.ghostwriter.wiki/development/stack-overview/behind-the-scenes#webpage\",\"url\":\"https://www.ghostwriter.wiki/development/stack-overview/behind-the-scenes\",\"name\":\"Behind the Scenes\",\"description\":\"A look at the thought process behind Ghostwriter's development\",\"dateModified\":\"2026-01-22T23:15:27.565Z\",\"isPartOf\":{\"@id\":\"https://www.ghostwriter.wiki#website\"},\"breadcrumb\":{\"@id\":\"https://www.ghostwriter.wiki/development/stack-overview/behind-the-scenes#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://www.ghostwriter.wiki/development/stack-overview/behind-the-scenes#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Development\",\"item\":\"https://www.ghostwriter.wiki/development/stack-overview\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Stack Overview\",\"item\":\"https://www.ghostwriter.wiki/development/stack-overview\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Behind the Scenes\",\"item\":\"https://www.ghostwriter.wiki/development/stack-overview/behind-the-scenes\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://www.ghostwriter.wiki/development/stack-overview/behind-the-scenes#article\",\"headline\":\"Behind the Scenes\",\"name\":\"Behind the Scenes\",\"description\":\"A look at the thought process behind Ghostwriter's development\",\"url\":\"https://www.ghostwriter.wiki/development/stack-overview/behind-the-scenes\",\"mainEntityOfPage\":{\"@id\":\"https://www.ghostwriter.wiki/development/stack-overview/behind-the-scenes#webpage\"},\"dateModified\":\"2026-01-22T23:15:27.565Z\",\"publisher\":{\"@id\":\"https://www.ghostwriter.wiki/#organization\"},\"isPartOf\":{\"@id\":\"https://www.ghostwriter.wiki#website\"}}]}\u003c/script>","siteName":"Ghostwriter Documentation","nav":{"global":{"anchors":[{"anchor":"GitHub","icon":"github","href":"https://github.com/GhostManager/Ghostwriter"},{"anchor":"Community","icon":"slack","href":"https://join.slack.com/t/bloodhoundhq/shared_invite/zt-1tgq6ojd2-ixpx5nz9Wjtbhc3i8AVAWw"}]},"tabs":[{"tab":"Home","groups":[{"group":"Home","pages":[{"title":"Welcome to Ghostwriter","href":"/home"}]},{"group":"Getting Started","pages":[{"title":"Quickstart","href":"/getting-started/quickstart"},{"title":"Populating a Demo Database","href":"/getting-started/populating-a-demo-database"},{"title":"Updating Ghostwriter","href":"/getting-started/updating-ghostwriter"},{"group":"Managing the Server with Ghostwriter CLI","pages":[{"title":"Managing the Server with Ghostwriter CLI","sidebarTitle":"Overview","href":"/getting-started/managing-the-server-with-ghostwriter-cli"},{"title":"Managing Logon Sessions","href":"/getting-started/managing-the-server-with-ghostwriter-cli/managing-logon-sessions"},{"title":"Creating and Managing Backups","href":"/getting-started/managing-the-server-with-ghostwriter-cli/creating-and-managing-backups"}]}]},{"group":"Features","pages":[{"group":"Access, Authentication, \u0026 Session Controls","pages":[{"title":"Access, Authentication, \u0026 Session Controls","sidebarTitle":"Overview","href":"/features/access-authentication-and-session-controls"},{"title":"User Profile and Tokens","href":"/features/access-authentication-and-session-controls/user-profile-and-tokens"},{"title":"Single Sign-On","href":"/features/access-authentication-and-session-controls/single-sign-on"},{"title":"Multi-Factor Authentication","href":"/features/access-authentication-and-session-controls/multi-factor-authentication"},{"title":"Role-Based Access Controls","href":"/features/access-authentication-and-session-controls/role-based-access-controls"},{"title":"Session Management","href":"/features/access-authentication-and-session-controls/session-management"}]},{"group":"Client \u0026 Project Management","pages":[{"title":"Overview","href":"/features/client-and-project-management"},{"title":"Client Dashboard","href":"/features/client-and-project-management/client-dashboard"},{"group":"Project Dashboard","pages":[{"title":"Overview","href":"/features/client-and-project-management/project-dashboard"},{"title":"Project Points of Contact \u0026 Assignments","href":"/features/client-and-project-management/project-dashboard/project-points-of-contact-and-assignments"},{"title":"Scope Tracking","href":"/features/client-and-project-management/project-dashboard/scope-tracking"},{"title":"Objective Tracking","href":"/features/client-and-project-management/project-dashboard/objective-tracking"},{"title":"Deconfliction Tracking","href":"/features/client-and-project-management/project-dashboard/deconfliction-tracking"},{"title":"White Card Tracking","href":"/features/client-and-project-management/project-dashboard/white-card-tracking"}]}]},{"group":"Findings Library","pages":[{"title":"Overview","href":"/features/findings-library"},{"title":"Populating the Findings Library","href":"/features/findings-library/populating-the-findings-library"},{"title":"Template Values for Findings","href":"/features/findings-library/finding-keywords"}]},{"title":"Observations Library","href":"/features/observations-library"},{"group":"Infrastructure Management","pages":[{"title":"Infrastructure Management","sidebarTitle":"Overview","href":"/features/infrastructure-management"},{"group":"Server Management","pages":[{"title":"Server Management","sidebarTitle":"Overview","href":"/features/infrastructure-management/server-management"},{"title":"Populating the Server Library","href":"/features/infrastructure-management/server-management/populating-the-server-library"},{"title":"Server Checkout","href":"/features/infrastructure-management/server-management/server-management"},{"title":"Monitoring Servers","href":"/features/infrastructure-management/server-management/monitoring-servers"}]},{"group":"Domains Management","pages":[{"title":"Domains Management","sidebarTitle":"Overview","href":"/features/infrastructure-management/domains-management"},{"title":"Populating the Domain Library","href":"/features/infrastructure-management/domains-management/populating-the-domain-library"},{"title":"Domain Checkout","href":"/features/infrastructure-management/domains-management/domain-checkout-1"},{"title":"Monitoring Domains","href":"/features/infrastructure-management/domains-management/monitoring-domains"}]}]},{"group":"Operation Logs","pages":[{"title":"Overview","href":"/features/operation-logs"},{"title":"Creating a New Operation Log","href":"/features/operation-logs/creating-a-new-oplog"},{"title":"Interacting with the Operation Log Table","href":"/features/operation-logs/create-a-new-entry"},{"title":"Generating Attack Path Narrative Outlines","href":"/features/operation-logs/generating-narrative-outlines"},{"title":"Linking Evidence to Log Entries","href":"/features/operation-logs/linking-evidence-to-entries"},{"title":"Attaching Terminal Recordings to Log Entries","href":"/features/operation-logs/attaching-terminal-recordings"},{"title":"Setting up Automated Logging","href":"/features/operation-logs/setting-up-automated-logging"},{"title":"Exporting / Importing Operation Logs","href":"/features/operation-logs/exporting-importing-oplogs"},{"title":"Auditing Log Sanitization","href":"/features/operation-logs/auditing-oplogs"}]},{"group":"Reporting","pages":[{"title":"Reporting","sidebarTitle":"Overview","href":"/features/reporting"},{"group":"Collaborative Editor","pages":[{"title":"Overview","href":"/features/reporting/collaborative-editing"},{"title":"Editor Features","href":"/features/reporting/collaborative-editor/editor-features"}]},{"group":"Report Types","pages":[{"title":"Overview","href":"/features/reporting/report-types"},{"title":"Word Document Customization","href":"/features/reporting/report-types/word-document-customization"},{"title":"PowerPoint Deck Customization","href":"/features/reporting/report-types/powerpoint-deck-customization"},{"title":"Excel Spreadsheet Customization","href":"/features/reporting/report-types/excel-spreadsheet-customization"}]},{"group":"Report Templates","pages":[{"title":"Report Templates","sidebarTitle":"Overview","href":"/features/reporting/report-templates"},{"title":"Report Template Linting","href":"/features/reporting/report-templates/report-template-linting"},{"title":"Word Template Variables \u0026 Filters","href":"/features/reporting/report-templates/word-template-variables"},{"title":"Word Template Styles","href":"/features/reporting/report-templates/word-template-styles"},{"title":"Troubleshooting Word Templates","href":"/features/reporting/report-templates/troubleshooting-word-templates"}]},{"title":"Templating and Rich Text Fields","href":"/features/reporting/templating-and-rich-text-fields"},{"title":"Jinja2 Tips \u0026 Tricks","href":"/features/reporting/jinja2-tips-and-tricks"}]},{"group":"BloodHound Integration","pages":[{"title":"Overview","href":"/features/bloodhound-integration-overview"},{"title":"Configuring BloodHound","href":"/features/bloodhound-integration/configuring-bloodhound"},{"title":"Viewing \u0026 Managing BloodHound Data","href":"/features/bloodhound-integration/managing-bloodhound-data"},{"title":"Differences Between BHCE and BHE","href":"/features/bloodhound-integration/differences-between-bhce-and-bhe"},{"title":"Accessing BloodHound Data in Reports","href":"/features/bloodhound-integration/bloodhound-data-in-reports"}]},{"group":"Background Tasks","pages":[{"title":"Overview","href":"/features/background-tasks"},{"title":"Scheduling Tasks","href":"/features/background-tasks/scheduled-tasks"},{"title":"Prebuilt Tasks","href":"/features/background-tasks/prebuilt-tasks"}]},{"title":"Health Monitoring","href":"/features/health-monitoring"}]},{"group":"Configuring Global Settings","pages":[{"title":"Introduction to Command Center","sidebarTitle":"Overview","href":"/configuring-global-settings/introduction-to-command-center"},{"title":"Personalizing Company Information","href":"/configuring-global-settings/personalizing-company-information"},{"title":"Configuring Global Report Options","href":"/configuring-global-settings/configuring-global-report-options"},{"title":"Configuring the Announcement Banner","href":"/configuring-global-settings/configuring-the-announcement-banner"},{"group":"Configuring APIs","pages":[{"title":"Overview","href":"/configuring-global-settings/configuring-apis"},{"title":"Configuring Slack","href":"/configuring-global-settings/configuring-apis/configuring-slack"},{"title":"Configuring VirusTotal","href":"/configuring-global-settings/configuring-apis/configuring-virustotal"},{"title":"Configuring Namecheap","href":"/configuring-global-settings/configuring-apis/configuring-namecheap"},{"title":"Configuring Cloud Services","href":"/configuring-global-settings/configuring-apis/configuring-cloud-services"}]},{"title":"Configuring Extra Fields","href":"/configuring-global-settings/configuring-extra-fields"}]},{"group":"Getting Help","pages":[{"title":"Overview","href":"/getting-help/faq"},{"title":"Reporting a Problem","href":"/getting-help/getting-help-with-a-problem"},{"title":"Reporting a Security Issue","href":"/getting-help/reporting-a-security-issue"}]},{"group":"Workflow \u0026 Usage","pages":[{"title":"The Workflow","sidebarTitle":"Overview","href":"/workflow/basic-usage"},{"group":"The Workflow","pages":[{"title":"The Workflow","sidebarTitle":"Overview","href":"/workflow/basic-usage"},{"title":"Finding Edit \u0026 Review Workflow","href":"/workflow/basic-usage/finding-review-workflow"}]}]},{"group":"Coding Style Guide","pages":[{"title":"Overview","href":"/coding-style-guide/style-guide"},{"title":"UI Refresh Design System","sidebarTitle":"UI Refresh","href":"/coding-style-guide/ui-refresh-design-system"},{"group":"Form Layouts \u0026 Design","pages":[{"title":"Form Layouts \u0026 Design","sidebarTitle":"Overview","href":"/coding-style-guide/form-layouts-and-design"},{"title":"Formset Layout \u0026 Design","href":"/coding-style-guide/form-layouts-and-design/formset-layout-and-design"},{"title":"Custom Layout Objects","href":"/coding-style-guide/form-layouts-and-design/custom-layout-objects"}]}]},{"group":"Development","pages":[{"title":"Overview","href":"/development/stack-overview"},{"group":"Stack Overview","pages":[{"title":"Overview","description":null,"href":"/development/stack-overview"},{"title":"Behind the Scenes","href":"/development/stack-overview/behind-the-scenes"}]},{"group":"Modifying Code","pages":[{"title":"Overview","description":"Modifying and then deploying code changes","href":"/development/modifying-code"},{"title":"Modifying Environment Variables","href":"/development/modifying-code/modifying-environment-variables"}]},{"title":"Testing Code","href":"/development/testing-code"},{"group":"Contributing to the Project","pages":[{"title":"Contributing to the Project","sidebarTitle":"Overview","href":"/development/contributing-to-the-project"},{"title":"Pre-Release Checklist","href":"/development/contributing-to-the-project/pre-release-checklist"}]},{"group":"Database Models","pages":[{"title":"Database Models","sidebarTitle":"Overview","href":"/development/database-models"},{"title":"API Models","href":"/development/database-models/api-models"},{"title":"Client \u0026 Project Models","href":"/development/database-models/rolodex-models"},{"title":"Configuration Models","href":"/development/database-models/configuration-models"},{"title":"Home \u0026 User Models","href":"/development/database-models/home-models"},{"title":"Infrastructure Models","href":"/development/database-models/infrastructure-models"},{"title":"Oplog Models","href":"/development/database-models/oplog-models"},{"title":"Reporting Models","href":"/development/database-models/reporting-models"}]},{"title":"Expected Services \u0026 Processes","href":"/development/expected-services-and-processes"}]}]},{"tab":"GraphQL API","pages":[{"title":"GraphQL API","href":"/features/graphql-api/graphql-api"}]}]},"basePath":"","title":"Behind the Scenes - Ghostwriter Documentation","buildId":"dpl_36EDyZCDfRuoUD9af5CH4M1bqY2h","deploymentId":"dpl_36EDyZCDfRuoUD9af5CH4M1bqY2h","dynamics":[],"chunks":[]}