Graphify changelog: what's new each month
Every stable Graphify release summarised by month: the highlights, new features, improvements, fixes and anything you need to act on. 4 months covered; the current month updates daily.
October 2026 · so far
20 releases: 0.9.74 → 0.9.93
October brought comprehensive improvements to cross-file member call resolution across a dozen languages, along with fixes for edge cases in type handling, import resolution, and incremental builds. The month focused on correctness and reducing spurious nodes that distorted code structure analysis.
Highlights
- Member calls now resolve through class hierarchies and type annotations across Python, TypeScript, C#, Java, and other languages, including inherited methods from base classes.
- Partial class merging, generic type disambiguation, and namespace scoping fixes ensure that structurally identical definitions merge correctly while distinct types remain separate.
- Cross-file type resolution improved for type aliases, delegate declarations, and generic types, eliminating spurious stubs that bloated the graph.
- Incremental builds now preserve edges correctly, avoid false deletion reports, and skip unnecessary re-clustering when the graph is unchanged.
- Import and include resolution became more precise, preferring source files over built artifacts and handling workspace packages, relative paths, and conditional imports.
New
- Verilog header files (.vh) are now extracted alongside .v and .sv files.
- Bash script invocations through non-shell interpreters (python3 build.py, node build.js) are recorded as invokes edges.
- Python @property reads now link to the property's getter instead of being dropped.
- Java methods inside anonymous class bodies are now extracted.
- Solidity inherited calls, super calls, and modifiers resolve through C3 linearization.
- Objective-C NSENUM and NSOPTIONS declarations are extracted as enum types with members.
- Interface dispatch now links to every implementer rather than just one.
- Python pytest fixture parameters are typed from the fixture's returned class.
Improved
- Self/this/super member calls resolve to the caller's own class chain instead of file-wide last-definition across Python, Kotlin, Swift, and C#.
- Elixir unqualified calls resolve to functions brought in by import/use, scoped per module.
- Rust prelude types no longer accumulate spurious in-degree.
- Obsidian wikilinks to notes with dots in their names now resolve correctly.
- C# member calls through casts, interface-typed properties, and member chains resolve to the correct method.
- Python typed-receiver resolution finds nested function files by climbing to the real file node.
- TypeScript field receivers are typed from class field declarations, not only constructor parameters.
- Incremental updates preserve placeholder nodes for unscanned referenced files.
Fixed
- Source files are now decoded before parsing, handling UTF-16, cp1252, and other encodings correctly.
- C# namespace scope ids use row/column instead of byte offset, ensuring consistency between CRLF and LF checkouts.
- R symbol-only bindings no longer collapse onto the file node.
- C++ classes behind export macros are preserved by blanking the macro before parsing.
- Node ids and manifest keys no longer embed local checkout paths or OS usernames, making clones produce identical graphs.
- Zero-byte source files keep their node without claiming a misleading line-1 source location.
September 2026
20 releases: 0.9.54 → 0.9.73
September brought major improvements to cross-file and cross-language symbol resolution, with five new language extractors added and numerous fixes to edge and node handling across existing languages. Performance and security also received attention.
Highlights
- Five new language extractors added: COBOL, plus structural improvements to OCaml, Groovy, Solidity, and others.
- Cross-file method resolution now works in Rust, Kotlin, Swift, Ruby, and C++ through improved type and inheritance chain walking.
- Graph determinism fixed by pinning PYTHONHASHSEED, and edge deduplication now prefers higher-confidence relationships.
- Markdown code-span mentions and JSX component calls now produce queryable edges to named symbols.
- Python 3.14 support added with fallback dependencies, and multiple security fixes for shell injection and file access.
New
- Five new language extractors: COBOL (.cbl/.cob/.cobol/.cpy files with programs, paragraphs, PERFORM/CALL/COPY).
- Terraform module calls with local sources now resolve to module nodes and expose caller→implementation topology.
- Terraform block attributes (ami, instance_type, cidr_block, tags, etc.) are now preserved and queryable on resource/data/module nodes.
- JavaScript inside inline PHP <script> blocks is now indexed as JS functions and calls under the PHP file node.
- SQL CREATE TRIGGER statements are extracted and linked to their table, including OR REPLACE/OR ALTER and INSTEAD OF variants.
- PHP closures (anonymous functions, arrow functions, callbacks) are now extracted with inner calls captured.
- Markdown inline code spans emit references edges to symbols they name, when exactly one match exists.
- Blade template views are now linked to their @extends layout.
Improved
- Python symbol resolution is 47% faster through path memoization, single-pass parsing, and iterative tree walking.
- Cross-file method resolution extended to Rust, Kotlin, Swift, Ruby, and C++ with conservative inheritance chain and type parameter handling.
- Module docstrings preceded by shebang, encoding, or license headers are now extracted instead of dropped.
- Named re-exports and complex export chains (import { x } from './a'; export { x }) now resolve to the original binding.
- Package.json exports map resolution now prefers runtime conditions over types, preventing drops to non-existent .d.ts files.
- Go interface method requirements and parameter/return types now emit references edges.
- Type references in C# no longer collect named tuple element names; only element types are referenced.
- Incremental rebuilds now preserve cross-file edges whose target symbols live in unchanged files.
Fixed
- Python private/dunder member collisions (leading underscores) no longer silently drop definitions; members are now salted.
- Ghost nodes from mentions in docs no longer survive merges; conservative fallback uses unique-label matching.
- Dynamic imports are no longer blanked by TS type-argument normalization; masking now occurs only in genuine call positions.
- Rust trait method declarations (signature-only and default-bodied) are now extracted as nodes.
- Incremental rebuilds no longer wipe cross-file project AST nodes or prune authored Markdown links.
- Graph.json determinism fixed across runs by pinning PYTHONHASHSEED; hash-seed-sensitive community detection now produces consistent results.
August 2026
22 releases: 0.9.32 → 0.9.53
August brought substantial improvements to extraction accuracy across multiple languages, better handling of edge cases in incremental rebuilds, and support for two new languages. The month focused on fixing false positives, false negatives, and data corruption issues that could silently drop content.
Highlights
- Added OCaml and Common Lisp language support with full extraction of definitions and references.
- Fixed numerous silent data-loss bugs where extraction, merging, or incremental updates would drop nodes or edges without warning.
- Improved C# with property nodes, constructor calls, interface dispatch edges, and better type resolution across files.
- Added Robot Framework support and JavaScript/TypeScript constructor call tracking.
- Resolved cross-language inheritance and symbol resolution issues affecting Java, C#, JavaScript, Python, Ruby, and others.
New
- OCaml extraction via tree-sitter-ocaml, including modules, functions, types, and variant constructors.
- Common Lisp extraction covering packages, classes, functions, methods, generics, and macros.
- Robot Framework test automation support with test cases, keywords, and import tracking.
- C# property nodes as distinct graph members alongside fields and methods.
- C# constructor calls via new expressions and dispatch edges from interfaces to single implementations.
- JavaScript/TypeScript factory functions that assign callables to object literals now retain those members.
- TypeScript and C# enum members as nodes with caseof edges to their parent enum.
- Graphify hook install now reads project-wide visualization limits from .graphifyrc.
Improved
- Merge now tier-aware: AST re-extracts replace only AST nodes and preserve semantic tier data.
- Graphify update now retries files whose extractors failed on previous runs instead of stamping them up-to-date.
- Extraction now bisects on timeout per file chunk instead of failing the entire chunk, preventing slow files from dropping sibling files.
- Symlink caching now gives distinct identities to symlink aliases and targets, preventing displacement.
- Leiden clustering now canonicalizes edge endpoints before sorting, preventing community assignment drift across rebuilds.
- Graph provenance (builtatcommit) now stamped from the analysed repo instead of shell working directory.
- Graphify install platform stamping now advances only for the platform being installed, not all platforms.
- Ignore-pattern evaluation now computes relative paths lexically instead of building Path objects per pattern.
Fixed
- Incremental extraction and rebuild no longer drop files' other tiers when merging AST changes.
- Graphify update no longer drops member-call and indirectcall edges from changed files into unchanged targets.
- Graphify extract no longer silently substitutes empty results when a worker crashes.
- Partial class merges no longer conflate same-named classes from different assemblies.
- Hyperedges are no longer dropped during merge-graphs and buildfromjson operations.
- Stored paths are now canonicalized to POSIX separators, preventing non-portable node ids on Windows.
July 2026
19 releases: 0.9.13 → 0.9.31
July brought substantial stability improvements and security fixes to Graphify, along with better handling of edge cases in incremental updates and cross-file references. The month focused on correctness: eliminating data loss scenarios, closing information leaks, and fixing broken features that had accumulated over many releases.
Highlights
- Query log is now opt-in to prevent undocumented storage of search queries.
- Eliminated multiple data-loss scenarios in incremental updates and semantic caching.
- Closed security issues including stored XSS in exported HTML and username leaks in committed graphs.
- Fixed graph corruption bugs from nested .gitignore patterns and resolved missing or duplicate nodes.
- Improved incremental rebuild performance and determinism across cache operations.
New
- Ruby .rake files and cross-file Bash script execution edges now supported.
- Strict PreToolUse hook option to enforce agent use of the graph before reading raw files.
- Diagnostic field in detection output records files and directories dropped by ignore rules.
- Directory-qualified labels for files sharing the same basename so they can be distinguished.
- Tokenbudget parameter for MCP getneighbors and getcommunity to prevent context flooding.
Improved
- Incremental updates no longer silently evict nodes for ignored files still on disk.
- Markdown files no longer duplicate into separate nodes across quick-scan and semantic passes.
- Graph export and CLI no longer fail silently; errors surface clearly.
- Query deduplication prevents homonymous symbols from flooding results.
- Community labels now persist through incremental rebuilds instead of resetting to numeric IDs.
- Nested .gitignore and .graphifyignore patterns now correctly scoped to their own subtrees.
- Python import resolution no longer depends on scan root location.
- Cross-file concept nodes with identical normalized labels now properly merge.
Fixed
- Stored XSS vulnerability in exported graph.html neighbor links is patched.
- Username and absolute-path leaks closed for VS solution nodes, out-of-root references, and degenerate symbols.
- CLI exits cleanly when downstream readers close pipes early, fixing CI integration.
- Semantic cache no longer replays stale extractions after upgrades.
- Incomplete extractions no longer overwrite complete graphs; JSON artifacts now written atomically.
- Watch and update no longer re-scan and duplicate concept-only semantic documents.
Summaries are written automatically from the official release notes (full changelog ↗); check the original notes before relying on a detail. Graphify: pricing, features and alternatives · All changelogs
