Skip to main content

A NASA Astronomy Picture of the Day CLI tool.

Project description

Astra

NASA's Astronomy Picture of the Day, rendered directly in your terminal.

APOD 2026-01-31

Features

  • Auto-detected graphics: Kitty protocol, SIXEL, or block-character fallback
  • Cross-platform: Windows, Linux, macOS
  • Works with Windows Terminal, Ghostty, Kitty, WezTerm, Alacritty, and more
  • Terminal greeter — show today's APOD when you open your shell
  • Browse by date, view random APODs, read full explanations
  • Search all APOD titles from APOD Archive
  • Save HD images of APODs
  • Works out of the box with DEMO_KEY

Install

pip install astra-apod

Usage

astra                              # Today's APOD
astra today                        # Same as above
astra date 2021-08-14              # APOD for a specific date
astra random                       # Random APOD 
astra search <title>               # Search APOD archive by title 
astra info                         # Full explanation of last viewed APOD
astra save                         # Save last viewed APOD

Configuration

astra config --show                # Show current configuration
astra config --api-key <key>       # Set NASA API key
astra config --size full           # Full terminal width image
astra config --size default        # 60% terminal width image 
astra config --bg "#0c0c0c"        # Set background color manually
astra config --save-dir <path>     # Set default save directory
astra config --clear-cache         # Clear cached images
astra config --reset               # Reset all settings to defaults

Terminal Greeter

Auto-display today's APOD when you open your terminal:

astra config --greeter on --shell cmd          # CMD (Windows)
astra config --greeter on --shell powershell   # PowerShell (Windows)
astra config --greeter on --shell bash         # Bash (Linux/macOS)
astra config --greeter on --shell zsh          # Zsh (Linux/macOS)
astra config --greeter on --shell fish         # Fish (Linux/macOS)

Control how often it runs:

astra config --greeter-freq daily    # Once per day (default)
astra config --greeter-freq always   # Every terminal open

Disable it:

astra config --greeter off --shell <shell>

Optimization

Astra v0.3.0 implements four optimization techniques that significantly reduce install size, startup time, memory usage, and network bandwidth.

1. Dependency Elimination — Dropped NumPy (~87% smaller install)

NumPy (~65 MB installed) was used only in the SIXEL encoder for pixel array reshaping, palette scaling, and bitwise encoding. All NumPy operations were replaced with pure Python equivalents (list slicing, set() comprehensions, bitwise OR loops).

Metric Before (v0.2.3) After (v0.3.0) Improvement
Dependency install size ~75 MB ~10 MB ~87% smaller
Number of dependencies 5 4 1 fewer C-extension package

2. Lazy Imports — Load Modules on Demand (~57% faster startup)

Heavy modules (requests, Pillow, SIXEL/Kitty/block renderers) were imported at the top of cli.py, meaning every command — even astra --version or astra config --show — paid the full import cost.

Now, these imports are deferred to the functions that actually use them. Lightweight commands only load typer and rich.

Metric Before (v0.2.3) After (v0.3.0) Improvement
astra --version import time ~2400 ms ~700 ms ~71% faster
astra today import time ~2400 ms ~1030 ms ~57% faster

3. Efficient Block Renderer — Reduced Memory & ANSI Output

The block-character renderer (blockimg.py) was rewritten with two optimizations:

  • Direct pixel access: Replaced list(img.getdata()) (which copies every pixel into a Python list) with img.load() for O(1) direct access — no allocation, no copy.
  • Redundant ANSI code elimination: Adjacent pixels that share foreground or background colors now skip the unchanged escape codes. For typical images, this reduces output size by ~30-40% since natural photos have many runs of similar colors.

4. HTTP Conditional Caching — Smarter Archive Fetches

The APOD archive index (~2 MB HTML) was previously re-downloaded unconditionally every 24 hours. Now, ETag and Last-Modified headers are cached locally. On subsequent fetches, conditional headers (If-None-Match / If-Modified-Since) are sent, and if the server responds with 304 Not Modified, zero bytes are transferred.

Metric Before (v0.2.3) After (v0.3.0) Improvement
Archive refresh (unchanged) ~2 MB download 0 bytes (304) ~100% bandwidth saved
Archive refresh (changed) ~2 MB download ~2 MB download Same (expected)

Built with

Python · Typer · Rich · Pillow

License

MIT © 2026 Asutosh Shrestha

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

astra_apod-0.3.0.tar.gz (15.5 kB view details)

Uploaded Source

Built Distribution

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

astra_apod-0.3.0-py3-none-any.whl (17.8 kB view details)

Uploaded Python 3

File details

Details for the file astra_apod-0.3.0.tar.gz.

File metadata

  • Download URL: astra_apod-0.3.0.tar.gz
  • Upload date:
  • Size: 15.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.3

File hashes

Hashes for astra_apod-0.3.0.tar.gz
Algorithm Hash digest
SHA256 57d7b934178f4cdcffd4a531226dd4f610039772c10939c001ad46416273a9c4
MD5 d446130d1a106b5b16dc53591a5c3d8d
BLAKE2b-256 f7e322cfe92080e10f27d5b863e2ba31d342aacdc2cf587bdcea20d18a2b6dbe

See more details on using hashes here.

File details

Details for the file astra_apod-0.3.0-py3-none-any.whl.

File metadata

  • Download URL: astra_apod-0.3.0-py3-none-any.whl
  • Upload date:
  • Size: 17.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.3

File hashes

Hashes for astra_apod-0.3.0-py3-none-any.whl
Algorithm Hash digest
SHA256 c3c95b5003e731b8df42bfbb1c164bb890caac30e7531e01c20684a7a64d37ff
MD5 7e868b0a635c370dc6e722e4c9a225a5
BLAKE2b-256 84b8ac04910a79f464edd60c285881481508390f020e045de7c83e01e0af8d36

See more details on using hashes here.

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