Skip to main content

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 sandevistan and sandy commands work identically. Examples below use sandy for 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)
  • ๐Ÿ“ฆ uv package 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!

  1. Fork the repo
  2. Create a feature branch (git checkout -b feature/amazing-feature)
  3. Commit your changes (git commit -m 'Add amazing feature')
  4. Push to the branch (git push origin feature/amazing-feature)
  5. Open a Pull Request

๐Ÿ“„ License

MIT License - see LICENSE file for details


๐Ÿ™ Acknowledgments


โšก 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

sandevistan-0.2.5.tar.gz (12.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

sandevistan-0.2.5-py3-none-any.whl (10.0 kB view details)

Uploaded Python 3

File details

Details for the file sandevistan-0.2.5.tar.gz.

File metadata

  • Download URL: sandevistan-0.2.5.tar.gz
  • Upload date:
  • Size: 12.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for sandevistan-0.2.5.tar.gz
Algorithm Hash digest
SHA256 afe31d2449dadc216c5e04410e4d48271fe5873483438b35498a0bfc3ed3ded0
MD5 600b32b17d272f700c7dc29f3d3075f0
BLAKE2b-256 9fa3820ae1ac3250afd34f030083644b27221661087a3d8ab084806201271a69

See more details on using hashes here.

Provenance

The following attestation bundles were made for sandevistan-0.2.5.tar.gz:

Publisher: pypi-publish.yml on Dil4rd/sandevistan

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file sandevistan-0.2.5-py3-none-any.whl.

File metadata

  • Download URL: sandevistan-0.2.5-py3-none-any.whl
  • Upload date:
  • Size: 10.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for sandevistan-0.2.5-py3-none-any.whl
Algorithm Hash digest
SHA256 9bab43a8d45ce3ee72e485231574e1199966f4bb5dc9ea5fdc23bfde8f732b4e
MD5 fec824a53fa0795c31f278fe5a82891e
BLAKE2b-256 960faea1a4c5a531ec20b73b9abc4c5398df175bf0d2857f32b3031a163a85fe

See more details on using hashes here.

Provenance

The following attestation bundles were made for sandevistan-0.2.5-py3-none-any.whl:

Publisher: pypi-publish.yml on Dil4rd/sandevistan

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page