AI-powered CLI tool to analyze Apple crash files
Project description
โก Sandevistan
Decode macOS crashes in seconds, not hours
Stop staring at cryptic crash logs. Sandevistan uses AI to translate Apple IPS crash files into plain English explanationsโinstantly.
sandevistan analyze crash.ips # or 'sandy' for short
# โจ Get human-readable crash analysis powered by Google Gemini Flash
๐ฏ Why Sandevistan?
| Problem | Solution |
|---|---|
| ๐ต IPS files are unreadable | ๐ Get plain-language explanations |
| โฐ Manual analysis takes hours | โก Instant AI-powered insights |
| ๐ค Root causes hidden in stack traces | ๐ฏ Direct "what crashed & why" answers |
| ๐ Need deep iOS/macOS knowledge | ๐ค AI reads the technical details for you |
๐ 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)
sandevistan config --api-key YOUR_GOOGLE_API_KEY
# or use 'sandy' for brevity: sandy config --api-key YOUR_GOOGLE_API_KEY
๐ Get your free API key: Google AI Studio
๐ก Usage
Note: Both
sandevistanandsandycommands work identically. Examples below usesandyfor brevity.
Single file analysis
sandy analyze crash.ips
Analyze a folder
sandy analyze ~/Library/Logs/DiagnosticReports/
Tip: When multiple files are found, you'll get an interactive menu to select which ones to analyze
Interactive file selection
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): _
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
๐ What You Get
Sandevistan analyzes each crash and provides:
- โ What crashed - The process, thread, and component that failed
- โ Why it crashed - Root cause in plain English (memory issue, null pointer, etc.)
- โ Key details - Exception types, addresses, and relevant code symbols
- โ Fast analysis - Powered by Google Gemini Flash (< 1 second per file)
๐ ๏ธ Development
Local development
# Clone the repo
git clone https://github.com/Dil4rd/sandevistan.git
cd sandevistan
# Run without installation (use 'sandy' or 'sandevistan')
uvx --from . sandy analyze crash.ips
# 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 crash analysis)
- ๐ Workflow: LangGraph (structured multi-step analysis pipeline)
- โ๏ธ CLI: Click (user-friendly command interface)
- ๐ฆ Package Manager: uv (blazing fast dependency resolution)
๐ Example Output
Analyzing file: MyApp_2024-01-15.ips
Using model: gemini-2.0-flash-exp
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
Analyzed 1 IPS file(s)
================================================================================
File: MyApp_2024-01-15.ips
================================================================================
**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. This typically
happens when trying to use an object that hasn't been initialized.
**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
๐ค 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
โก Stop debugging. Start understanding.
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.2.4.tar.gz.
File metadata
- Download URL: sandevistan-0.2.4.tar.gz
- Upload date:
- Size: 11.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e5aa1770c8bc6d07959fa458c1ad421c0853c59232383a0b3e5c641901147e79
|
|
| MD5 |
cf35906fd1d437bcd5548f536fb5703b
|
|
| BLAKE2b-256 |
803bdb87f48a64be12a6768152dd1a54942a55c927f54b3f019c91c185e042b2
|
Provenance
The following attestation bundles were made for sandevistan-0.2.4.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.2.4.tar.gz -
Subject digest:
e5aa1770c8bc6d07959fa458c1ad421c0853c59232383a0b3e5c641901147e79 - Sigstore transparency entry: 802965353
- Sigstore integration time:
-
Permalink:
Dil4rd/sandevistan@1530c955d2f1b1aee1aa3257633ac2c0c7dbeefd -
Branch / Tag:
refs/tags/v0.2.4 - Owner: https://github.com/Dil4rd
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
pypi-publish.yml@1530c955d2f1b1aee1aa3257633ac2c0c7dbeefd -
Trigger Event:
push
-
Statement type:
File details
Details for the file sandevistan-0.2.4-py3-none-any.whl.
File metadata
- Download URL: sandevistan-0.2.4-py3-none-any.whl
- Upload date:
- Size: 8.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 |
467de5c6b13d253137ea14d72e98ed0a2bb2383d066c356692948eb0b28d7463
|
|
| MD5 |
64371a37f5994781c90ca4c5ac703638
|
|
| BLAKE2b-256 |
d347fce59689faaae695f8f43557da5169ea188f052f07211321ea5af91920da
|
Provenance
The following attestation bundles were made for sandevistan-0.2.4-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.2.4-py3-none-any.whl -
Subject digest:
467de5c6b13d253137ea14d72e98ed0a2bb2383d066c356692948eb0b28d7463 - Sigstore transparency entry: 802965406
- Sigstore integration time:
-
Permalink:
Dil4rd/sandevistan@1530c955d2f1b1aee1aa3257633ac2c0c7dbeefd -
Branch / Tag:
refs/tags/v0.2.4 - Owner: https://github.com/Dil4rd
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
pypi-publish.yml@1530c955d2f1b1aee1aa3257633ac2c0c7dbeefd -
Trigger Event:
push
-
Statement type: