AI-powered CLI tool to analyze Apple crash files
Project description
โก Sandevistan
AI-augmented Apple security research toolkit
Sandevistan augments your security research with AI-powered tools for analyzing Apple crash reports, tracking security updates, and more.
sandy analyze crash.ips # AI-powered crash analysis
sandy scrape # Fetch Apple security updates
# โจ Powered by Google Gemini Flash
๐ฏ Why Sandevistan?
Like the Cyberpunk cyberware it's named after, Sandevistan augments your capabilitiesโletting you process security data at machine speed.
| Challenge | How Sandevistan Helps |
|---|---|
| ๐ต Crash logs are cryptic | ๐ AI translates IPS files to plain English |
| โฐ Tracking updates is tedious | ๐ Auto-scrape Apple security advisories |
| ๐ค CVE details scattered | ๐ Structured data export (JSON/CSV/SQLite) |
| ๐ Need deep Apple internals knowledge | ๐ค AI handles the technical analysis |
๐ Quick Start
๐ฆ Installation
macOS (Homebrew):
brew tap Dil4rd/sandevistan
brew install sandevistan
Cross-platform (uvx - recommended):
uvx sandevistan # or 'sandy' for short
Alternative (pipx):
pipx install sandevistan
๐ Setup (one-time)
sandy config --api-key YOUR_GOOGLE_API_KEY
๐ Get your free API key: Google AI Studio
๐ง Features
Note: Both
sandevistanandsandycommands work identically. Examples below usesandyfor brevity.
๐ง Crash Analysis
Analyze Apple IPS crash files with AI-powered explanations.
# Single file
sandy analyze crash.ips
# Entire folder
sandy analyze ~/Library/Logs/DiagnosticReports/
When multiple files are found, you'll get an interactive menu:
Found 3 IPS files in ./crashes:
[0] All files
[1] AppCrash_2024-01-15.ips
[2] KernelPanic_2024-01-16.ips
[3] SegFault_2024-01-17.ips
Select files to analyze (e.g., "1,3" or "0" for all): _
What you get:
- โ What crashed โ Process, thread, and component that failed
- โ Why it crashed โ Root cause in plain English
- โ Key details โ Exception types, addresses, and code symbols
๐ Security Updates Scraper
Scrape Apple's security updates and CVE data into structured formats.
# Scrape to all formats (JSON, CSV, SQLite)
sandy scrape
# Specific format(s)
sandy scrape -f json
sandy scrape -f json -f csv
# Custom output filename
sandy scrape -o security_updates
# Fast mode (skip detailed CVE scraping)
sandy scrape --skip-advisories
Output includes:
- ๐ Security update metadata (date, OS, version, URL)
- ๐ CVE entries with descriptions
- ๐ Links to full advisories
โ๏ธ Configuration
sandy config --show # ๐ View current settings
sandy config --path # ๐ Show config location
sandy config --api-key YOUR_KEY # ๐ Update API key
sandy config --model gemini-2.0 # ๐ค Change AI model
sandy config --delay 2.0 # โฑ๏ธ Set scraper rate limit
๐ Example Output
Crash Analysis
Analyzing file: MyApp_2024-01-15.ips
Using model: gemini-2.0-flash-exp
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
**What crashed:** MyApp (process) crashed in the main thread
**Why it crashed:** Null pointer dereference - The app attempted to access
memory at address 0x0, which is not a valid memory location.
**Key technical details:**
- Exception Type: EXC_BAD_ACCESS (SIGSEGV)
- Exception Codes: KERN_INVALID_ADDRESS at 0x0000000000000000
- Crashed Thread: 0 (Main thread)
- Relevant Frame: MyApp`-[MyViewController buttonTapped:] + 42
Security Updates Scrape
Scraping Apple security updates...
Found 156 security updates
Fetching advisory details... [โโโโโโโโโโโโโโโโโโโโ] 100%
Exported to: security_updates.json, security_updates.csv, security_updates.db
๐ ๏ธ Development
Local development
# Clone the repo
git clone https://github.com/Dil4rd/sandevistan.git
cd sandevistan
# Run without installation
uvx --from . sandy --help
# Install in editable mode
uv pip install -e .
Requirements
- ๐ Python 3.11+
- ๐ Google API key (free tier available)
- ๐ฆ
uvpackage manager (install here)
๐๏ธ Architecture
Built with modern Python tools for speed and reliability:
- ๐ง AI Engine: Google Gemini Flash (fast, accurate analysis)
- ๐ Workflow: LangGraph (structured multi-step pipelines)
- โ๏ธ CLI: Click (user-friendly command interface)
- ๐ฆ Package Manager: uv (blazing fast dependency resolution)
๐บ๏ธ Roadmap
Future augmentations planned:
- IPS explannation caching for efficient token reuse
- IPS deduplication
- Incremental security updates scrape
- Advanced analytics of security udpates
๐ค Contributing
Found a bug? Have an idea? Contributions are welcome!
- Fork the repo
- Create a feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
๐ License
MIT License - see LICENSE file for details
๐ Acknowledgments
- Powered by Google Gemini
- Built with LangGraph
- Package management by uv
โก Augment your Apple security research
Get Started โข Report Bug โข Request Feature
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file sandevistan-0.3.0.tar.gz.
File metadata
- Download URL: sandevistan-0.3.0.tar.gz
- Upload date:
- Size: 17.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
540b751ec9565608ea561bc0615393f8d82631d3efad99e89624d40bbb365cce
|
|
| MD5 |
1929b8c32fdef3e0d32b887b49976a09
|
|
| BLAKE2b-256 |
24151c1dfa87c6acf5607f44295e9ee672f78dec709fdcffacdc89d8ac68d267
|
Provenance
The following attestation bundles were made for sandevistan-0.3.0.tar.gz:
Publisher:
pypi-publish.yml on Dil4rd/sandevistan
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
sandevistan-0.3.0.tar.gz -
Subject digest:
540b751ec9565608ea561bc0615393f8d82631d3efad99e89624d40bbb365cce - Sigstore transparency entry: 831764410
- Sigstore integration time:
-
Permalink:
Dil4rd/sandevistan@67b84cf67ad9b4e68a9fb08a5df6e4ddd47547ae -
Branch / Tag:
refs/tags/v0.3.0 - Owner: https://github.com/Dil4rd
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
pypi-publish.yml@67b84cf67ad9b4e68a9fb08a5df6e4ddd47547ae -
Trigger Event:
push
-
Statement type:
File details
Details for the file sandevistan-0.3.0-py3-none-any.whl.
File metadata
- Download URL: sandevistan-0.3.0-py3-none-any.whl
- Upload date:
- Size: 14.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2ea17592617a64397dcd19eccb4072f3fc0abc54a4114f8697fefb2555d717d8
|
|
| MD5 |
0ddab88517a67f334d6408f73d3aaa3e
|
|
| BLAKE2b-256 |
72197b38b6b67225526459c97a7be1c33b8586d450980cc46f0b5ad319cf85f0
|
Provenance
The following attestation bundles were made for sandevistan-0.3.0-py3-none-any.whl:
Publisher:
pypi-publish.yml on Dil4rd/sandevistan
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
sandevistan-0.3.0-py3-none-any.whl -
Subject digest:
2ea17592617a64397dcd19eccb4072f3fc0abc54a4114f8697fefb2555d717d8 - Sigstore transparency entry: 831764413
- Sigstore integration time:
-
Permalink:
Dil4rd/sandevistan@67b84cf67ad9b4e68a9fb08a5df6e4ddd47547ae -
Branch / Tag:
refs/tags/v0.3.0 - Owner: https://github.com/Dil4rd
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
pypi-publish.yml@67b84cf67ad9b4e68a9fb08a5df6e4ddd47547ae -
Trigger Event:
push
-
Statement type: