Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
213 commits
Select commit Hold shift + click to select a range
cd4fcfa
feat(reporting): add passive voice detection to TipTap editor
marcpfuller Jan 9, 2026
e64858d
fix: resolve issures with tests
marcpfuller Jan 13, 2026
c4c4f67
fix: resolve pylint issues
marcpfuller Jan 13, 2026
ac0545b
fix: resolve github security stack trace issue
marcpfuller Jan 13, 2026
0d67486
Merge branch 'master' into passive_voice_detection
marcpfuller Jan 13, 2026
05061fb
fix: resolve comments made by @ColonelThirtyTwo in PR
marcpfuller Jan 14, 2026
a78cf05
fix: add null check to upload.tsx when getting csrf token
marcpfuller Jan 14, 2026
d2f10f0
Merge branch 'master' into passive_voice_detection
marcpfuller Jan 15, 2026
eff2e67
fix: resolve Passive detector test
marcpfuller Jan 15, 2026
316a44d
fix: added another test to increase code coverage
marcpfuller Jan 15, 2026
310d099
fix: optimize the nlp model for improved performance
marcpfuller Jan 17, 2026
ecba774
Merge branch 'master' into passive_voice_detection
marcpfuller Jan 17, 2026
8dac7bf
fix: allow nlp model to be swapped
marcpfuller Jan 17, 2026
356615e
Merge branch 'passive_voice_detection' of https://github.com/marcpful…
marcpfuller Jan 17, 2026
2355c4d
fix: remove unused variable from exception in detector.py
marcpfuller Jan 17, 2026
068e54d
Merge branch 'master' into passive_voice_detection
marcpfuller Jan 23, 2026
ba4105a
Added spaCy model variable to compose files
chrismaddalena Feb 4, 2026
7845eba
Added runtime download of spaCy model for published images
chrismaddalena Feb 4, 2026
f93c900
Merge branch 'master' into passive_voice_detection
chrismaddalena Feb 4, 2026
a5f903e
Merge branch 'master' into passive_voice_detection
marcpfuller Feb 5, 2026
dea08c3
fix: highlighted text ignores tip tap objects
marcpfuller Feb 5, 2026
2e27397
Documentation updates
chrismaddalena Feb 6, 2026
9d6f340
Update DOCS/features/reporting/collaborative-editing.mdx
chrismaddalena Feb 6, 2026
8b2e9d7
Merge branch 'master' into passive_voice_detection
chrismaddalena Feb 6, 2026
5fb2466
Update DOCS/getting-started/quickstart.mdx
chrismaddalena Feb 6, 2026
30aac70
Update DOCS/getting-started/quickstart.mdx
chrismaddalena Feb 6, 2026
36fc9aa
Update DOCS/getting-started/quickstart.mdx
chrismaddalena Feb 6, 2026
619d99f
Update DOCS/getting-started/updating-ghostwriter.mdx
chrismaddalena Feb 6, 2026
1c496b4
Update ghostwriter/modules/passive_voice/detector.py
chrismaddalena Feb 6, 2026
5eddec0
fix; resolve remaining comments by copilot
marcpfuller Feb 6, 2026
5e58f3e
fix: remove unused login required decorator from api/views and reduce…
marcpfuller Feb 6, 2026
5a25d6f
Merge branch 'master' into passive_voice_detection
chrismaddalena Feb 7, 2026
9f9a913
Merge branch 'master' into passive_voice_detection
marcpfuller Feb 9, 2026
9f02dce
Merge branch 'master' into passive_voice_detection
chrismaddalena Feb 9, 2026
28f1ee2
Adjusted highlight contrast for dark mode
chrismaddalena Feb 9, 2026
3a64894
Updated docs for CLI changes
chrismaddalena Feb 10, 2026
34f7d7b
Updated workflow for CLI changes
chrismaddalena Feb 10, 2026
9fb6007
Updated for GWCLI changes
chrismaddalena Feb 10, 2026
df1a538
Added an external settings directory for use with published images
chrismaddalena Feb 10, 2026
3466f8f
Updated to mount one directory instead of using a second settings dir
chrismaddalena Feb 11, 2026
e9f4816
Removed unnecessary mount for local prod
chrismaddalena Feb 11, 2026
dd4eaf4
Synced packages for local builds
chrismaddalena Feb 13, 2026
e4ee7e1
Switched to bundled fonts
chrismaddalena Feb 24, 2026
4424999
Updated for GW CLI changes
chrismaddalena Feb 24, 2026
85f5230
Updated for release
chrismaddalena Feb 24, 2026
a54bfe7
Updated binaries to v1.0.0-rc1
chrismaddalena Feb 24, 2026
d49c431
Styles clean up
chrismaddalena Feb 24, 2026
b7a6ea5
Moved to passing the spaCy model as an argument
chrismaddalena Feb 24, 2026
ee374c6
Added validation for ProseMirror position
chrismaddalena Feb 24, 2026
dc36d58
Merge pull request #796 from marcpfuller/passive_voice_detection
chrismaddalena Feb 24, 2026
f1059cf
Initial implementation of new UI
chrismaddalena Mar 11, 2026
7242ff9
Added `OplogEntryEvidence` model
chrismaddalena Mar 12, 2026
e1c335f
Added evidence upload modal
chrismaddalena Mar 12, 2026
b3eeee2
Implemented evidence upload
chrismaddalena Mar 12, 2026
ce6004d
Added log evidence upload views
chrismaddalena Mar 12, 2026
e5ac5d9
Added Hasura Action for linking evidence and log entries
chrismaddalena Mar 12, 2026
4840c30
Migration for `OplogEntryEvidence`
chrismaddalena Mar 12, 2026
f3b63a1
Tests for new views and forms
chrismaddalena Mar 12, 2026
872c6a4
Capture image paste for screenshots
chrismaddalena Mar 13, 2026
a8950d2
Added styles for oplog evidence previews
chrismaddalena Mar 13, 2026
634b46e
Adjusted styles for oplog mail view elements
chrismaddalena Mar 13, 2026
188d910
Disabled dropzone if no reports are available
chrismaddalena Mar 13, 2026
1737e4c
Sorted text evidence to the top for better display
chrismaddalena Mar 13, 2026
04a1ee5
Alert for disabled dropzone when no reports are available
chrismaddalena Mar 13, 2026
18882ce
Added user name to identify who uploaded the evidence
chrismaddalena Mar 13, 2026
d16b971
Improved evidence detail view
chrismaddalena Mar 13, 2026
67db8cb
Added uploaded_by_user property
chrismaddalena Mar 13, 2026
9dee23d
Added uploaded_by_user property to dict for view
chrismaddalena Mar 13, 2026
b2d0507
Added checks for available reports and setting an intelligent default
chrismaddalena Mar 13, 2026
dc3868f
Updated test cases
chrismaddalena Mar 13, 2026
e01d1fa
Updated styling of log table
chrismaddalena Mar 16, 2026
ffdea95
Adjusted log view buttons to btn-sm
chrismaddalena Mar 16, 2026
156b92e
Automatic "evidence" tagging to oplog entries when attaching evidence
chrismaddalena Mar 16, 2026
229e48b
Reduced scaling on hover over evidence previews
chrismaddalena Mar 16, 2026
2815b13
Enabled deep linking to specific log entries
chrismaddalena Mar 16, 2026
591c365
Added log links to evidence details with deep link URLs
chrismaddalena Mar 16, 2026
583815d
Added deep linking to the consumer
chrismaddalena Mar 16, 2026
1d52aff
Fixed margins above top row of log entry rows
chrismaddalena Mar 16, 2026
efb6347
Introduced `OplogEntryRecording` model
chrismaddalena Mar 17, 2026
5713f79
Added Signals for `OplogEntryRecording`
chrismaddalena Mar 17, 2026
90bb108
Added GraphQL endpoints for uploading and downloading recordings
chrismaddalena Mar 17, 2026
a9e3cb6
Added views to upload, download, and delete recordings
chrismaddalena Mar 17, 2026
3b20128
Added tests for new models and views
chrismaddalena Mar 17, 2026
10af79c
Added recording URL to `OplogEntrySerializer`
chrismaddalena Mar 17, 2026
e716067
Added styling for `recording` tag
chrismaddalena Mar 17, 2026
1e3436a
Added deep link URLs to log entries
chrismaddalena Mar 17, 2026
8ff80de
Replaced Asciinema demo with actual uploads
chrismaddalena Mar 17, 2026
4e1f40a
Updated download recording view to align with similar views
chrismaddalena Mar 17, 2026
180dedf
Merge branch 'release/v6.3.0' into feature/oplog-redesign
chrismaddalena Mar 17, 2026
e5edb3a
Added call to `super` at the end of `clean`
chrismaddalena Mar 17, 2026
c541c8e
Load Asciinema from local static files
chrismaddalena Mar 17, 2026
1601e0c
Swapped `ev.document.url` to `evidence_download` URL
chrismaddalena Mar 17, 2026
3f9d89d
Added local copies of Asciinema files for local hosting
chrismaddalena Mar 17, 2026
088bd66
Merge remote-tracking branch 'origin/feature/oplog-redesign' into fea…
chrismaddalena Mar 17, 2026
2e09f8f
Added URL corrections to `OplogEntryRecordingAdmin`
chrismaddalena Mar 17, 2026
afadcbe
Added tracking for new tables to Hasura
chrismaddalena Mar 18, 2026
c292491
Adjusted evidence thumbnails
chrismaddalena Mar 18, 2026
c6eb320
Added log entry for deleted recordings
chrismaddalena Mar 18, 2026
2d3501c
Re-implemented table sorting
chrismaddalena Mar 18, 2026
fb3b212
Updated admin console names
chrismaddalena Mar 18, 2026
47a654a
Renamed field for consistency
chrismaddalena Mar 18, 2026
cca01ec
Updated permissions for new models
chrismaddalena Mar 18, 2026
3856235
Fixed issue with GraphQL input mapping
chrismaddalena Mar 18, 2026
71e57bf
Added tests for new GraphQL views
chrismaddalena Mar 18, 2026
f289577
Updated tests for code changes
chrismaddalena Mar 18, 2026
3593a08
Fixed permission issue with or/and
chrismaddalena Mar 18, 2026
911a13b
Only send WebSockets message is `assigned_to` is set
chrismaddalena Mar 18, 2026
1ab3008
Addressed revocation concerns with `URL.createObjectURL()`
chrismaddalena Mar 18, 2026
2677cf6
Updated comment
chrismaddalena Mar 19, 2026
853d55c
Added download button
chrismaddalena Mar 19, 2026
4ae226d
Updated documentation for new oplog design
chrismaddalena Mar 19, 2026
ba26de1
Added support for Gzipped Asciinema upload and playback
chrismaddalena Mar 19, 2026
6f00084
Updated for v6.3.0-rc2
chrismaddalena Mar 19, 2026
0c4c734
Merge pull request #844 from GhostManager/feature/oplog-redesign
chrismaddalena Mar 19, 2026
a8d1998
Merge branch 'master' into release/v6.3.0
chrismaddalena Mar 19, 2026
40fd1f1
Applied sanitization to potentially editable inputs
chrismaddalena Mar 19, 2026
5fadce9
Enabled rich text editing for descriptions and comments
chrismaddalena Mar 20, 2026
4374f3f
Added DOMPurify for an additional layer of sanitization
chrismaddalena Mar 20, 2026
678ab14
Updated Bleach config to specify allowed attrs for elements
chrismaddalena Mar 20, 2026
b1a4920
Applied explicit application of Bleach on rich text log fields
chrismaddalena Mar 20, 2026
7b5ff6f
Added styles that were lost with merge
chrismaddalena Mar 20, 2026
605f370
Migration for oplog changes
chrismaddalena Mar 20, 2026
eb636ff
Removed duplicated hidden table
chrismaddalena Mar 20, 2026
9673499
Added same-origin checks to toastr URLs
chrismaddalena Mar 20, 2026
d94b67c
Packages updates
chrismaddalena Mar 20, 2026
253a62c
Updated for changes
chrismaddalena Mar 20, 2026
713a814
Updated for v6.3.0 changes
chrismaddalena Mar 20, 2026
9d72c24
Added other columns back into show/hide options
chrismaddalena Mar 23, 2026
0031218
Fixed sorting after reset not returning to sort by start date
chrismaddalena Mar 23, 2026
7214980
Added help modal to help users
chrismaddalena Mar 23, 2026
42ced96
Removed `evidence` and `recording` tags for copies
chrismaddalena Mar 23, 2026
9b18fcc
Updated help and docs
chrismaddalena Mar 24, 2026
bcee091
Added toastr notification for asciicast parser warnings
chrismaddalena Mar 24, 2026
a4fb26c
Added `recording_text` field to `OplogEntryRecording` for search
chrismaddalena Mar 24, 2026
7179707
Added `recording_text` as a vector for log filtering
chrismaddalena Mar 24, 2026
d0f7da9
Updated `OplogEntryRecording` admin
chrismaddalena Mar 24, 2026
6821253
Updated factory to use asciicast v3
chrismaddalena Mar 24, 2026
ddbfaea
Implemented `extract_cast_text` for extracting termrecording content
chrismaddalena Mar 24, 2026
9e58e11
Updated tests for terminal recording extraction
chrismaddalena Mar 24, 2026
e89d392
Fixed docstring
chrismaddalena Mar 24, 2026
946f44b
Extended tag styling
chrismaddalena Mar 24, 2026
d8b745c
Added oplog management command to populate logs for demos and testing
chrismaddalena Mar 24, 2026
9b3d688
De-select entry and hide details pane
chrismaddalena Mar 24, 2026
2dfb3cc
Code clean up
chrismaddalena Mar 24, 2026
9ff572a
Prevent BS modal closure from also closing the details pane
chrismaddalena Mar 24, 2026
a3958dc
Fixed double-clicks not selecting log entries
chrismaddalena Mar 24, 2026
da5b232
Removed unnecessary padding around highlights in the collab editor
chrismaddalena Mar 25, 2026
cd70ab3
Hide the show/hide columns accordion when there is no table
chrismaddalena Mar 25, 2026
43f7b3c
Fixed alignment and overflow issues with extremely long tool names
chrismaddalena Mar 25, 2026
cb43686
Made text evidence match image evidence for Word previews
chrismaddalena Mar 25, 2026
ba67f12
Updated for GraphQL changes
chrismaddalena Mar 25, 2026
b6c4361
Intercept Tiptap paste capture to allow pasting img evidence for upload
chrismaddalena Mar 25, 2026
a1eece1
Added comment
chrismaddalena Mar 25, 2026
66756ce
Enabled previews of text evidence like images
chrismaddalena Mar 25, 2026
c85adbc
Fixed markup text evidence not previewing properly due to Bleach
chrismaddalena Mar 25, 2026
29a89db
Added escapejs filtering to error messages for evidence
chrismaddalena Mar 25, 2026
c876b0b
Added tests to confirm `get_file_content` is escaped
chrismaddalena Mar 25, 2026
5665f28
Added error handling for failed evidence loads
chrismaddalena Mar 25, 2026
bb12f93
Added new updates for v6.3.0
chrismaddalena Mar 25, 2026
2d21546
Updated dates for tracking
chrismaddalena Mar 25, 2026
280105e
Added terminal recordings to log sanitization
chrismaddalena Mar 25, 2026
7dfd63b
Added asciicast files to the ignore list
chrismaddalena Mar 25, 2026
25a3212
Updated sanitization tests
chrismaddalena Mar 26, 2026
f1a8ade
Enhanced `download()` to handle errors
chrismaddalena Mar 27, 2026
c16c077
Added recordings and linked evidence to log exports
chrismaddalena Mar 27, 2026
10a9a2c
Styled checkboxes as switches
chrismaddalena Mar 27, 2026
147030a
Exception clean up
chrismaddalena Mar 27, 2026
723019f
Update CHANGELOG.md
chrismaddalena Mar 27, 2026
da52598
Update DOCS/features/operation-logs/create-a-new-entry.mdx
chrismaddalena Mar 27, 2026
76221fc
Adjusted check to include finding evidence
chrismaddalena Mar 27, 2026
18af446
Added `oplogEntryId` as a return option for `uploadOplogRecordingResult`
chrismaddalena Mar 27, 2026
202902b
Merge remote-tracking branch 'origin/release/v6.3.0' into release/v6.3.0
chrismaddalena Mar 27, 2026
b2a6ca8
Adjusted entry to only try to download spaCy if opted in
chrismaddalena Mar 27, 2026
2097754
Merge branch 'master' into release/v6.3.0
chrismaddalena Mar 27, 2026
ea22884
Fixed project guard
chrismaddalena Mar 27, 2026
a193d99
Merge remote-tracking branch 'origin/release/v6.3.0' into release/v6.3.0
chrismaddalena Mar 27, 2026
d6e7cb9
Code clean up
chrismaddalena Mar 27, 2026
c91f731
Merge branch 'master' into release/v6.3.0
chrismaddalena Mar 30, 2026
8b8d13c
Merge branch 'master' into release/v6.3.0
chrismaddalena Apr 6, 2026
6647a16
Merge branch 'master' into release/v6.3.0
chrismaddalena Apr 6, 2026
379cedc
Added dark mode theme colors for report buttons
chrismaddalena Apr 6, 2026
a4b1743
Don't run on changes to docs, HTML, or CSS that do not affect test cases
chrismaddalena Apr 6, 2026
089fab6
Merge branch 'master' into release/v6.3.0
chrismaddalena Apr 8, 2026
b9ad71b
Merge remote-tracking branch 'origin/release/v6.3.0' into release/v6.3.0
chrismaddalena Apr 8, 2026
c3d1c0c
Combined duplicate values into one
chrismaddalena Apr 8, 2026
902f512
Added `ReportOplogOutlineGenerate`
chrismaddalena Apr 9, 2026
ebc84e3
Added `ReportOplogOutlineGenerate` view URL
chrismaddalena Apr 9, 2026
6c0cbc6
Added tests for `ReportOplogOutlineGenerate` and related functions
chrismaddalena Apr 9, 2026
aefd621
Added `OplogOutlineButton` to menu bar
chrismaddalena Apr 9, 2026
93309f0
Added codename to report titles in sidebar
chrismaddalena Apr 9, 2026
65b15c2
Updated for changes
chrismaddalena Apr 9, 2026
dd0bb79
Changed redirect to a JSON message to fit use of the view
chrismaddalena Apr 9, 2026
95cb677
Reduce DB queries for sidebar contents
chrismaddalena Apr 9, 2026
5209d53
Adjustments so files are not deleted until the replacement is complete
chrismaddalena Apr 9, 2026
d0697a7
Altered check to include finding-level evidence
chrismaddalena Apr 9, 2026
0c5ea83
Updated for changes
chrismaddalena Apr 9, 2026
abdf616
Merge pull request #862 from GhostManager/feature/narrative-outlines
chrismaddalena Apr 9, 2026
7b0c184
Added contribution
chrismaddalena Apr 9, 2026
abf912b
Added `outline_tags` to the `ReportConfiguration` model and forms
chrismaddalena Apr 9, 2026
8e9bd38
Swapped to parsing configured outline tags instead of hard-coded tags
chrismaddalena Apr 9, 2026
b4b24f7
Added wand icon
chrismaddalena Apr 9, 2026
ba44ec2
Updated report detail page's report config display
chrismaddalena Apr 9, 2026
5c28efc
Added docs for the log narrative outline generator
chrismaddalena Apr 9, 2026
c30cb97
Updated for changes
chrismaddalena Apr 9, 2026
3e4cc1d
Added `alt` text for image
chrismaddalena Apr 9, 2026
ed58027
Updated help text
chrismaddalena Apr 9, 2026
4bc807d
Implemented `humanize_comma_list` filter
chrismaddalena Apr 9, 2026
6378b7a
Merge pull request #864 from GhostManager/feature/narrative-outlines
chrismaddalena Apr 9, 2026
2c9eba3
Updated binaries to final v1.0.0
chrismaddalena Apr 9, 2026
aa74a4e
Migration for adjustment to `outline_tags`
chrismaddalena Apr 9, 2026
d735233
Updated for release
chrismaddalena Apr 9, 2026
9a4f1ea
Corrected typo
chrismaddalena Apr 10, 2026
65d5ec6
Changed file-type detection to not be case sensitive
chrismaddalena Apr 10, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 11 additions & 5 deletions .github/workflows/workflow.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,20 @@ on:
push:
branches:
- master
paths-ignore:
- "**.md"
- "**.mdx"
- "**.html"
- "**.css"
- "DOCS/**"
pull_request:
branches:
- master
paths-ignore:
- "CHANGELOG.md"
- "README.md"
- "SECURITY.md"
- "CONTRIBUTING.md"
- "**.md"
- "**.mdx"
- "**.html"
- "**.css"
- "DOCS/**"

jobs:
Expand All @@ -25,7 +31,7 @@ jobs:
- name: Build environment
run: |
chmod +x ghostwriter-cli-linux
./ghostwriter-cli-linux install --dev
./ghostwriter-cli-linux install --mode local-dev

- name: Get django logs
if: failure()
Expand Down
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -283,3 +283,7 @@ cypress/*
ghostwriter-cli

.gwcli-last-update-check

# Ignore any *.cast or *.cast.gz files
*.cast
*.cast.gz
97 changes: 97 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,82 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [6.3.0] - 10 April 2026

### Added

* **Operation Log Evidence Linking**: Added support for linking evidence to individual operation log entries (Closes #132; Closes #831)
* New `OplogEntryEvidence` model to create many-to-many relationships between log entries and evidence
* New GraphQL `linkOplogEvidence` action to attach evidence via API
* New web form (`OplogEvidenceCreate` view) to attach evidence through the UI
* Evidence appears in a dedicated section within each log entry, with friendly names and direct links to the original evidence
* Automatic "evidence" tag applied when evidence is linked to an entry

* **Operation Log Terminal Recordings**: Added support for uploading and playback of Asciinema terminal session recordings (.cast and .cast.gz files) (Closes #831)
* New `OplogEntryRecording` model to store a single terminal recording per log entry
* New GraphQL `uploadOplogRecording` action for base64-encoded file uploads via API
* New GraphQL `downloadOplogRecording` action to retrieve recordings and metadata
* New Django views for recording upload, deletion, and download with file serving and inline playback support
* Support for Asciinema player integration for viewing recordings directly in the log entry's details pane
* Automatic "recording" tag applied when a recording is uploaded

* **Automatic Tag Management for Log Entry Features**: Evidence linking and terminal recordings automatically apply and remove tags
* `evidence` tag added when first evidence is linked, removed when the last evidence is unlinked
* `recording` tag added when a recording is uploaded, removed when the recording is deleted
* Tags can be used for filtering log entries and visual identification

* **Passive Voice Detection**: Added support for performing passive voice identification inside the collaborative editor (PR #796)
* Ghostwriter now hosts a small local copy of the spaCy language model for text analysis
* Select "Check Passive Voice" in the collaborative editor to examine text and highlight instances of passive voice
* See the wiki for more details and an explanation for how to change the model's language

* **Build a Narrative Outline from Log Entries**: Construct an outline for a report narrative based on tagged log entries (Closes #863)
* This is useful for quickly generating a narrative outline to kickstart a report draft
* Added a button to the collaborative editor to insert a narrative outline based on activity logs
* The action includes any log entries tagged with `evidence` or `report`
* Extended the global report configuration to include a field for specifying additional tags
* Includes support for partial tags—e.g., `cred*` will match `creds` or `credentials`.
* Each line includes the start date and time (assumes UTC), tool used, target, and comments
* The action also inserts evidence objects below each line for any evidence linked with that entry
* Pairs nicely with Ghostwriter's external tools, `mythic_sync` and `cobalt_sync`
* Big thanks to @C0KERNEL who created the initial PoC of this

### Changed

* **New User Interface for Operation Logs**: Replaced the table view for operation logs with two pane interface (Closes #831)
* New interface is similar to those used by many email clients
* Log entries appear on the left-side with at-a-glance information
* Details appear on the right-side in a details pane
* Details pane includes dedicated sections for attaching evidence and uploading terminal recordings

* **Text Evidence Previews**: Text evidence now has previews in the collaborative editor like image evidence

* **Pasting Images into Collaborative Editor**: You can now paste an image file or screenshot in your clipboard into a collaborative editor field
* The paste will automatically trigger the modal window for uploading your evidence
* Your filename will be the default friendly name for the upload

* **Updated Ghostwriter CLI Binaries**: Updated the pre-built Ghostwriter CLI binaries to v1.0.0
* Review the Ghostwriter CLI CHANGELOG for complete notes
* Going forward, we recommend all users use the new published container images for easier updates
* Existing installations will need to migrate some files
* Copy the _ssl/_ directory to the _ghostwriter/_ directory inside your operating system's data file directory
* Also copy any custom settings files from _config/settings/production.d_ to _ghostwriter/settings/_
* Ghostwriter CLI can be used with `--mode local-prod` to keep the old behavior of using a local copy of Ghostwriter's code
* You will need to do this if you are using a customized version of the codebase

* Report names in the sidebar now also include the parent project's codename to aid in identification

### Fixed

* Fixed an error that occurred in local development environments related to trying to connect to nginx (Closes #847)

### Security

* As we allow more user-editable content to be rendered in the DOM, we have implemented stronger controls to prevent JavaScript injection
* Updated the allowed HTML attributes to be more targeted
* Added sanitization to activity log entries that support rich text (`comments` and `description`)
* Added `DOMPurify` to the project for an extra layer of security and client-side sanitization

## [6.2.13] - 8 April 2026

### Changed
Expand Down Expand Up @@ -138,6 +214,27 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
* Fixed client logos not showing properly on client dashboards
* Fixed issue with the `last_update` column preventing creation of a report via the GraphQL API (Fixes #828)

## [6.3.0-rc1] - 24 February 2026

### Added

* Added support for performing passive voice identification inside the collaborative editor
* Ghostwriter now hosts a small local copy of the spaCy language model for text analysis
* Select "Check Passive Voice" in the collaborative editor to examine text and highlight instances of passive voice
* See the wiki for more details and an explanation for how to change the model's language
* Added fonts formerly imported from Google Fonts to the local codebase to support systems without network connections (Fixes #823)

### Changed

* Updated the pre-built Ghostwriter CLI binaries to v1.0.0
* Review the Ghostwriter CLI CHANGELOG for complete notes
* Going forward, we recommend all users use the new published container images for easier updates
* Existing installations will need to migrate some files
* Copy the _ssl/_ directory to the _ghostwriter/_ directory inside your operating system's data file directory
* Also copy any custom settings files from _config/settings/production.d_ to _ghostwriter/settings/_
* Ghostwriter CLI can be used with `--mode local-prod` to keep the old behavior of using a local copy of Ghostwriter's code
* You will need to do this if you are using a customized version of the codebase

## [6.2.3] — 5 February 2026

### Changed
Expand Down
10 changes: 10 additions & 0 deletions DOCS/docs.json
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,9 @@
"features/operation-logs",
"features/operation-logs/creating-a-new-oplog",
"features/operation-logs/create-a-new-entry",
"features/operation-logs/generating-narrative-outlines",
"features/operation-logs/linking-evidence-to-entries",
"features/operation-logs/attaching-terminal-recordings",
"features/operation-logs/setting-up-automated-logging",
"features/operation-logs/exporting-importing-oplogs"
]
Expand All @@ -112,6 +115,13 @@
"group": "Reporting",
"pages": [
"features/reporting",
{
"group": "Collaborative Editor",
"pages": [
"features/reporting/collaborative-editing",
"features/reporting/collaborative-editor/editor-features"
]
},
{
"group": "Report Types",
"pages": [
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,19 +4,25 @@ description: "Authentication and account creation via an external SSO provider"
---


Ghostwriter incorporates `django-allauth` to extend basic account creation and authentication to support Single Sign-On (SSO) and multi-factor authentication (MFA). You can learn more here:
Ghostwriter incorporates `django-allauth` to extend basic account creation and authentication to support Single Sign-On (SSO) and multi-factor authentication (MFA). You can
learn more here:

[Introduction - django-allauth](https://docs.allauth.org/en/latest/introduction/index.html)

The `django-allauth` documentation covers the available SSO providers. There are dozens of options for social networks and business accounts, but the major providers you are probably looking for are covered–e.g., Microsoft, Google, GitHub, Slack, and Okta.
The `django-allauth` documentation covers the available SSO providers. There are dozens of options for social networks and business accounts, but the major providers you are
probably looking for are covered–e.g., Microsoft, Google, GitHub, Slack, and Okta.

### Configuring an SSO Provider

Once you have an SSO provider you want to implement, find the provider here to get the necessary configuration template:

First, create a Python file inside the proper directory. For a default installation using the published Ghostwriter images, add files to _ghostwriter/settings_ inside your
operating system's data file directory.

Once you have an SSO provider you want to implement, find the provider here to get the necessary configuration template:
For `local-dev` or `local-prod` modes, create the file(s) in _config/settings/local.d_ or _production.d_ directory.

First, create a Python file inside the _config/settings/local.d_ or _production.d_ directory. Files in these directories are loaded after the main configuration files. They load in order, so you can create multiple files with number prefixes to control ordering (e.g., _1-custom-config.py_ and _2-custom-config.py_).
Files in these directories are loaded after the main configuration files. They load in order, so you can create multiple files with number prefixes to control ordering
(e.g., _1-custom-config.py_ and _2-custom-config.py_).

For example, you might make _1-sso-provider.py_ to hold your SSO configuration and _2-mail-config.py_ to hold your email backend configuration.

Expand All @@ -38,7 +44,8 @@ SSO_PROVIDERS = ["allauth.socialaccount.providers.microsoft"]
INSTALLED_APPS = INSTALLED_APPS + SSO_PROVIDERS
```

The above lines add our provider (Microsoft for this example) to Ghostwriter's installed apps and provide the information necessary for the SSO handshake. You can find the values you need for your provider(s) at the above link.
The above lines add our provider (Microsoft for this example) to Ghostwriter's installed apps and provide the information necessary for the SSO handshake. You can find
the values you need for your provider(s) at the above link.

You can enable multiple SSO providers by extending the `SOCIALACCOUNT_PROVIDERS` configuration and list of `SSO_PROVIDERS`.

Expand All @@ -53,13 +60,17 @@ When someone authenticates with an SSO provider, one of two things can happen:
2. The SSO login matches an existing local account; the two become linked, and the user is logged in under that local account.


For the first scenario, you can control new account registration by toggling `DJANGO_SOCIAL_ACCOUNT_ALLOW_REGISTRATION` to `true` or `false` with Ghostwriter CLI. Alternatively, you can set `SOCIAL_ACCOUNT_ALLOW_REGISTRATION` in your config file.
For the first scenario, you can control new account registration by toggling `DJANGO_SOCIAL_ACCOUNT_ALLOW_REGISTRATION` to `true` or `false` with Ghostwriter CLI.
Alternatively, you can set `SOCIAL_ACCOUNT_ALLOW_REGISTRATION` in your config file.

Using Ghostwriter CLI for these configuration changes makes everything easier. To apply the change (e.g., turning registration on or off), you must only bring the containers down and back up. If you change a Python config file, the containers must be rebuilt.
Using Ghostwriter CLI for these configuration changes makes everything easier. To apply the change (e.g., turning registration on or off), you must only bring the containers
down and back up. If you change a Python config file, the containers must be rebuilt.

You may want to allow registration but only for specific domains. The domain allowlist manages email domains you want to allow to authenticate or register via SSO. Like the registration setting, you can set this via Ghostwriter CLI or in your config file.
You may want to allow registration but only for specific domains. The domain allowlist manages email domains you want to allow to authenticate or register via SSO. Like the
registration setting, you can set this via Ghostwriter CLI or in your config file.

Set `DJANGO_SOCIAL_ACCOUNT_DOMAIN_ALLOWLIST` with Ghostwriter CLI or `SOCIAL_ACCOUNT_DOMAIN_ALLOWLIST` in your config file. The allowlist can be defined as a space-separated list or a Python list (if setting it in your config file).
Set `DJANGO_SOCIAL_ACCOUNT_DOMAIN_ALLOWLIST` with Ghostwriter CLI or `SOCIAL_ACCOUNT_DOMAIN_ALLOWLIST` in your config file. The allowlist can be defined as a space-separated
list or a Python list (if setting it in your config file).

Here is what this might look like in your config file:

Expand All @@ -72,13 +83,16 @@ SOCIAL_ACCOUNT_DOMAIN_ALLOWLIST = ["specterops.io"]

These settings allow registration via an SSO provider, but only if the account's email address has the _specterops.io_ domain.

If a local account with a matching email address already exists, the user will be prompted to enter a different address for their new account. This will most likely arise when transitioning from local accounts to a new SSO provider. You will probably want to link the accounts in these cases.
If a local account with a matching email address already exists, the user will be prompted to enter a different address for their new account. This will most likely arise when
transitioning from local accounts to a new SSO provider. You will probably want to link the accounts in these cases.

<Note>
An error is raised if multiple existing accounts share the same email address. Rather than trying to connect one of them, the user will see a message encouraging them to contact an administrator.
An error is raised if multiple existing accounts share the same email address. Rather than trying to connect one of them, the user will see a message encouraging them to
contact an administrator.
</Note>

You can link accounts by enabling your provider to authenticate via the account's email address. By default, email authentication is disabled, and the provider must have pre-verified the email address. Use the following settings if you trust the provider and want to consider email addresses as verified.
You can link accounts by enabling your provider to authenticate via the account's email address. By default, email authentication is disabled, and the provider must have
pre-verified the email address. Use the following settings if you trust the provider and want to consider email addresses as verified.

```python SSO Email Authentication
SOCIALACCOUNT_PROVIDERS = {
Expand All @@ -95,16 +109,20 @@ SOCIALACCOUNT_PROVIDERS = {

These settings enable Microsoft email authentication and consider all email addresses verified for automatic connection.

If someone were to authenticate with a Microsoft account, they would only be allowed to create or link an account if registration is enabled and the domain allowlist checks passed. If either check fails, the user will be redirected to a page like this.
If someone were to authenticate with a Microsoft account, they would only be allowed to create or link an account if registration is enabled and the domain allowlist
checks passed. If either check fails, the user will be redirected to a page like this.

<Frame>
<img src="/images/features/image-1.avif" alt=""/>
</Frame>

### Additional SSO Settings

Depending on your SSO provider, you may need to consider other configuration options. One common request is how to bypass clicking twice when signing in. By default, the sign-in page redirects users to a confirmation screen. The user must click the button to initiate the handshake with the SSO provider. This is a security feature to prevent abuse of an open redirect, but you can change the behavior.
Depending on your SSO provider, you may need to consider other configuration options. One common request is how to bypass clicking twice when signing in. By default,
the sign-in page redirects users to a confirmation screen. The user must click the button to initiate the handshake with the SSO provider. This is a security feature to prevent abuse of an open redirect, but you can change the behavior.

If you wish to have users log in immediately when they click the provider button, set `DJANGO_SOCIAL_ACCOUNT_LOGIN_ON_GET` to `true` with Ghostwriter CLI. For information is available here:
If you wish to have users log in immediately when they click the provider button, set `DJANGO_SOCIAL_ACCOUNT_LOGIN_ON_GET` to `true` with Ghostwriter CLI. For information
is available here:

<CardGroup cols={1}> <Card title="Provider Configuration" icon="chevron-right" iconType="solid" href="https://docs.allauth.org/en/latest/socialaccount/configuration.html" horizontal > <span className="text-xs text-dark/7 dark:text-light/6">docs.allauth.org</span> </Card> </CardGroup>
<CardGroup cols={1}> <Card title="Provider Configuration" icon="chevron-right" iconType="solid" href="https://docs.allauth.org/en/latest/socialaccount/configuration.html"
horizontal > <span className="text-xs text-dark/7 dark:text-light/6">docs.allauth.org</span> </Card> </CardGroup>
Loading
Loading