Display near-real-time satellite imagery on your desktop.

Overview

Satpaper

Display near-real-time satellite imagery on your desktop.


(Click to see full-size version)

Satpaper generates live wallpapers for your desktop, using near-real-time imagery from RAMMB SLIDER.

There are several satellites to choose from, each covering a different region of the world.

  • GOES East (used in the sample image - covers most of North and South America)
  • GOES West (Pacific Ocean and parts of the western US)
  • Himawari (Oceania and East Asia)
  • Meteosat 9 (Africa, Middle East, India, Central Asia)
  • Meteosat 10 (Atlantic Ocean, Africa, Europe)

It's also possible to specify a custom background image, if desired.

Warning - Data Usage

Satpaper downloads satellite imagery at the highest available resolution and downscales it to fit your specifications. The exact download size varies depending on which satellite you are using and the image contents, but it's typically in the ballpark of twenty megabytes.

If you're on a metered and/or severely bandwidth-limited connection, twenty megabytes every ten to fifteen minutes can really add up. You have been warned!

Installation

Automatically Supported Environments

  • GNOME
  • KDE
  • Windows (tested to work on 10/11)
  • macOS (tested to work on Ventura)
    • Satpaper will ask for System Event permission when running for the first time - you will need to grant access then restart the program for it to work.

If your environment is not supported, you have a few options:

  • Use the --wallpaper-command/SATPAPER_WALLPAPER_COMMAND argument to specify a command to run whenever a new wallpaper is generated.
  • Use the --once flag to turn Satpaper into a one-off wallpaper generator, allowing it to be integrated into a larger script or program.

PRs to add automatic support are also welcome!

Precompiled Binaries

Precompiled versions of Satpaper are available for:

  • Linux (compiled against x86_64-unknown-linux-musl, which should Just Work™ on most distributions)
  • Windows (compiled on Github actions windows-latest)
  • macOS (compiled on Github actions macos-latest)

All binaries can be found in the releases section. Additionally, please note that I'm only able to test the Linux binary - please open an issue if there's something wrong with the binary for your platform (doesn't work at all, only works on the newest version, whatever.)

From Source

Dependencies:

  • The most recent stable Rust toolchain.
  • A C/C++ toolchain (such as gcc.)

Just use cargo install, and Satpaper will be compiled and added to your PATH.

cargo install --locked --git https://github.com/Colonial-Dev/satpaper --branch master

To automatically start Satpaper when you log in, you can use a systemd unit or equivalent.

[Unit]
Description=Run Satpaper on login.

# You should adjust these values as needed/preferred.
[Service]
Environment=SATPAPER_SATELLITE=goes-east
Environment=SATPAPER_RESOLUTION_X=2560
Environment=SATPAPER_RESOLUTION_Y=1440
Environment=SATPAPER_DISK_SIZE=94
Environment=SATPAPER_TARGET_PATH=/var/home/colonial/.local/share/backgrounds/

ExecStart=/var/home/colonial/.cargo/bin/satpaper
Restart=on-failure
RestartSec=5

[Install]
WantedBy=default.target
# (Write out or paste in your unit file)
nano $HOME/.config/systemd/user/satpaper.service
systemctl --user enable satpaper
systemctl --user start satpaper

Using Docker

Thanks to cyberbit, everything you need to build and run a Satpaper Docker image can be found in the docker/ directory.

Command Line Options

Basic/Required

  • -s/--satellite/SATPAPER_SATELLITE - the satellite to source imagery from.
    • Possible values: goes-east, goes-west, himawari, meteosat9, and meteosat10.
  • -x/--resolution-x/SATPAPER_RESOLUTION_X (and equivalents for the y dimension) - the width/height of the generated wallpaper.
    • Any arbitary resolution should work, including vertical aspect ratios.
  • -d/--disk-size/SATPAPER_DISK_SIZE - the size of the "disk" (Earth) relative to the generated wallpaper's smaller dimension.
    • Required to be an integer value in the range [1, 100] inclusive, mapping to a percentage value.
    • For most desktop environments, a value in the 90-95 range will give the most detail while preventing parts from being cut off by UI elements like taskbars.
  • -t/--target-path/SATPAPER_TARGET_PATH - where the generated wallpaper should be saved.
    • Satpaper will output to a file called "satpaper_latest.png" at this path.
    • Example: if the argument is /home/user/Pictures, the output will be at /home/user/Pictures/satpaper_latest.png.

Advanced

  • -b/--background-image/SATPAPER_BACKGROUND_IMAGE - the path to an image to use as the background.
    • Most common image formats are supported.
    • For best results, the image should match the specified resolution, but Satpaper will resize the image to fit if need be.
    • Satpaper uses a basic "marching" algorithm to find the bounds of the Earth and apply transparency to the original image, but it's not perfect - some black bordering and/or jagged edges may remain. (Unfortunately, the canonical algorithm for this problem - flood filling - doesn't really work, because it tends to end up eating into the Earth at night. If you have an idea for a better solution, please let me know!)
  • -w/--wallpaper-command/SATPAPER_WALLPAPER_COMMAND - custom command to run when a wallpaper is generated.
    • This overrides the automatic update handling.
    • Currently, this only works on Unix. The command will be run as sh -c "{command} file://{image_path}.
  • -o/--once/SATPAPER_ONCE - whether or not to only run once.
    • By default, Satpaper is designed to run as a daemon - it stays resident once launched and periodically attempts to update your wallpaper.
    • With --once set, Satpaper will generate one wallpaper and terminate, without altering your existing wallpaper.
    • This is ideal if you want to use Satpaper as a simple wallpaper generator or as part of a larger script/program.

FAQ

Why is Satpaper using hundreds of megs of RAM?

There are two possible causes:

  • You're seeing RAM usage spike to 500+ megabytes whenever Satpaper is compositing a new wallpaper. This is expected and unavoidable - the raw satellite imagery alone is ~450 megabytes after being decompressed and stitched together. However, this spike should only last several seconds - once composition is complete, the image buffers are all freed, and libmimalloc_sys::mi_collect is called to ensure as much memory as possible is returned to the OS.
  • You're using an early version of Satpaper. Early versions had issues with libc's free deciding it was fine to just... not return multi-hundred-megabyte allocations to the OS, as well as the tokio runtime being fairly memory heavy. I resolved these issues by switching to mimalloc and transitioning away from async, so behavior should improve if you update.

Why are continents purple in night imagery? / Why does night imagery look kinda weird?

This is a byproduct of the CIRA GeoColor processing algorithm used to generate full-color images from the raw satellite data. GeoColor uses infrared for night-time imaging, which is then overlaid with false city lights and whitened clouds. The resulting image usually looks pretty good at a glance, but might begin to seem unnatural upon closer inspection.

Unfortunately, this is a necessary evil, as geostationary weather satellites don't capture enough visible spectrum light to generate a true-color night-time image.

I live at $EXTREME_LATITUDE - is there a way to get better imagery of my location?

Not really. Geostationary orbits (required for the type of imaging we want) can only be achieved at a very specific altitude directly above the equator.

Why am I seeing glitchy imagery from GOES East at night?

You're most likely seeing something like this:

This is not a software error, but is instead lens flare from the Sun peeking over from the other side of the Earth. This is caused by the Earth's tilt, and is most visible in late February and August.

You can find a more detailed explanation here.

Comments
  • failed to lookup address

    failed to lookup address

    Seems like it tries to lookup 'rammb-slider.cira.colostate.edu:443' instead of 'rammb-slider.cira.colostate.edu':

    satpaper --version
    satpaper 0.5.0
    ...
    Sep  5 09:42:07 Shiva satpaper[309932]: Error: An error occurred in the wallpaper updating loop
    Sep  5 09:42:07 Shiva satpaper[309932]: Caused by:
    Sep  5 09:42:07 Shiva satpaper[309932]:     0: https://rammb-slider.cira.colostate.edu/data/imagery/2023/09/05/goes-16--- full_disk/geocolor/20230905062020/04/004_003.png: Dns Failed: resolve dns name 'rammb-slider.cira.colostate.edu:443': failed to lookup address information: Try again
    Sep  5 09:42:07 Shiva satpaper[309932]:     1: failed to lookup address information: Try again
    ...
    host rammb-slider.cira.colostate.edu
    rammb-slider.cira.colostate.edu is an alias for rammb-slider6.cira.colostate.edu.
    rammb-slider6.cira.colostate.edu has address 129.82.20.136
    
    opened by Sfinx 9
  • Add docker support

    Add docker support

    Here is a Dockerfile I got working, supporting compose and run. It launches the binary through supervisor to manage any unhandled crashes. The compose file points to my own published image at the moment (https://hub.docker.com/r/cyberbit/satpaper), but replacing image: cyberbit/satpaper with build: . allows building the image locally.

    The final image from Docker Hub is around 30 MB compressed, or ~1.5 Satpaper cycles.

    opened by cyberbit 4
  • Support generating image only?

    Support generating image only?

    Is building in support to generate an image only something that is out of scope for this project? I'm considering building out a Docker container that builds from source and outputs a file to a network share so I can reuse the generated image across machines.

    opened by cyberbit 4
  • Add Windows Support

    Add Windows Support

    This hacky PowerShell script implementation adds support for Windows. Although the formatting of the script is ugly, please do NOT CHANGE the formatting of the script, otherwise the script will break!

    (Also I just noticed that my code formatting rules might not adhere to the previous code formatting rules, I do apologize for that!)

    I tested this on my Windows 11 and Windows 10 machine, and it seems to work fine :)

    opened by Dan0xE 4
  • Connection timeouts cause crash

    Connection timeouts cause crash

    While running satpaper, if the connection experiences a momentary outage (either on client or SLIDER end) while tiles are being collected, the program loop crashes. Here's an excerpt of the log when that occurs:

    image

    The exact message and segment of code varies depending on what stage of the loop is running. Maybe a gated "retry x times" flag with exponential backoff would be good here? If retrying each tile isn't feasible, then maybe logging the error was caught and waiting for next schedule to retry. I figured failing outright probably isn't intended.

    opened by cyberbit 3
  • Silence `Checking timestamp...` message

    Silence `Checking timestamp...` message

    In journalctl I see sprees of:

    Sep 10 11:12:34 pc-zug satpaper[46718]: [2023-09-10T09:12:34Z INFO  satpaper] Checking timestamp...
    Sep 10 11:13:34 pc-zug satpaper[46718]: [2023-09-10T09:13:34Z INFO  satpaper] Checking timestamp...
    Sep 10 11:14:35 pc-zug satpaper[46718]: [2023-09-10T09:14:35Z INFO  satpaper] Checking timestamp...
    Sep 10 11:15:35 pc-zug satpaper[46718]: [2023-09-10T09:15:35Z INFO  satpaper] Checking timestamp...
    Sep 10 11:16:36 pc-zug satpaper[46718]: [2023-09-10T09:16:36Z INFO  satpaper] Checking timestamp...
    Sep 10 11:17:36 pc-zug satpaper[46718]: [2023-09-10T09:17:36Z INFO  satpaper] Checking timestamp...
    Sep 10 11:18:37 pc-zug satpaper[46718]: [2023-09-10T09:18:37Z INFO  satpaper] Checking timestamp...
    Sep 10 11:19:37 pc-zug satpaper[46718]: [2023-09-10T09:19:37Z INFO  satpaper] Checking timestamp...
    Sep 10 11:20:38 pc-zug satpaper[46718]: [2023-09-10T09:20:38Z INFO  satpaper] Checking timestamp...
    Sep 10 11:21:38 pc-zug satpaper[46718]: [2023-09-10T09:21:38Z INFO  satpaper] Checking timestamp...
    Sep 10 11:22:39 pc-zug satpaper[46718]: [2023-09-10T09:22:39Z INFO  satpaper] Checking timestamp...
    
    ...
    
    Sep 10 11:32:25 pc-zug satpaper[46718]: [2023-09-10T09:32:25Z INFO  satpaper] Checking timestamp...
    Sep 10 11:33:25 pc-zug satpaper[46718]: [2023-09-10T09:33:25Z INFO  satpaper] Checking timestamp...
    Sep 10 11:34:26 pc-zug satpaper[46718]: [2023-09-10T09:34:26Z INFO  satpaper] Checking timestamp...
    Sep 10 11:35:26 pc-zug satpaper[46718]: [2023-09-10T09:35:26Z INFO  satpaper] Checking timestamp...
    Sep 10 11:36:27 pc-zug satpaper[46718]: [2023-09-10T09:36:27Z INFO  satpaper] Checking timestamp...
    Sep 10 11:37:27 pc-zug satpaper[46718]: [2023-09-10T09:37:27Z INFO  satpaper] Checking timestamp...
    Sep 10 11:38:28 pc-zug satpaper[46718]: [2023-09-10T09:38:28Z INFO  satpaper] Checking timestamp...
    Sep 10 11:39:28 pc-zug satpaper[46718]: [2023-09-10T09:39:28Z INFO  satpaper] Checking timestamp...
    Sep 10 11:40:29 pc-zug satpaper[46718]: [2023-09-10T09:40:29Z INFO  satpaper] Checking timestamp...
    Sep 10 11:41:29 pc-zug satpaper[46718]: [2023-09-10T09:41:29Z INFO  satpaper] Checking timestamp...
    Sep 10 11:42:30 pc-zug satpaper[46718]: [2023-09-10T09:42:30Z INFO  satpaper] Checking timestamp...
    Sep 10 11:43:30 pc-zug satpaper[46718]: [2023-09-10T09:43:30Z INFO  satpaper] Checking timestamp...
    
    

    Could these be silenced or reduced to an occasional message?

    opened by benruijl 2
  • Part of the earth is white

    Part of the earth is white

    This just happened:

    image

    There are no errors in the log

    Sep 11 18:02:32 pc-zug satpaper[3723]: [2023-09-11T16:02:32Z INFO  satpaper] Timestamp has changed!
    Sep 11 18:02:32 pc-zug satpaper[3723]: [2023-09-11T16:02:32Z INFO  satpaper] Fetching updated source and compositing new wallpaper...
    Sep 11 18:02:33 pc-zug satpaper[3723]: [2023-09-11T16:02:33Z INFO  satpaper::slider] Stitching tiles...
    Sep 11 18:03:21 pc-zug satpaper[3723]: [2023-09-11T16:03:21Z INFO  satpaper::slider] Compositing...
    Sep 11 18:03:21 pc-zug satpaper[3723]: [2023-09-11T16:03:21Z INFO  satpaper::slider] Resizing source image...
    Sep 11 18:03:23 pc-zug satpaper[3723]: [2023-09-11T16:03:23Z INFO  satpaper::slider] Generating destination image...
    Sep 11 18:03:23 pc-zug satpaper[3723]: [2023-09-11T16:03:23Z INFO  satpaper::slider] Compositing source into destination...
    Sep 11 18:03:23 pc-zug satpaper[3723]: [2023-09-11T16:03:23Z INFO  satpaper::slider] Compositing complete.
    Sep 11 18:03:23 pc-zug satpaper[3723]: [2023-09-11T16:03:23Z INFO  satpaper::slider] Output saved.
    Sep 11 18:03:23 pc-zug satpaper[3723]: [2023-09-11T16:03:23Z INFO  satpaper] New wallpaper composited and set.
    Sep 11 18:04:23 pc-zug satpaper[3723]: [2023-09-11T16:04:23Z INFO  satpaper] Checking timestamp...
    
    opened by benruijl 1
  • Desktop ubuntu:GNOME is not supported

    Desktop ubuntu:GNOME is not supported

    When I started a binary file

    ./satpaper-x86_64-unknown-linux-musl
    

    I got this error

    [2023-09-05T10:01:02Z INFO  satpaper] Checking timestamp...
    [2023-09-05T10:01:02Z INFO  satpaper] Timestamp has changed!
    [2023-09-05T10:01:02Z INFO  satpaper] Fetching updated source and compositing new wallpaper...
    [2023-09-05T10:01:03Z INFO  satpaper::slider] Downloading tiles...
    [2023-09-05T10:01:03Z INFO  satpaper::slider] Stitching tiles...
    [2023-09-05T10:01:09Z INFO  satpaper::slider] Compositing...
    [2023-09-05T10:01:09Z INFO  satpaper::slider] Resizing source image...
    [2023-09-05T10:01:12Z INFO  satpaper::slider] Generating destination image...
    [2023-09-05T10:01:12Z INFO  satpaper::slider] Compositing source into destination...
    [2023-09-05T10:01:12Z INFO  satpaper::slider] Compositing complete.
    [2023-09-05T10:01:12Z INFO  satpaper::slider] Output saved.
    thread 'main' panicked at 'Desktop ubuntu:GNOME is not supported.', src/wallpaper.rs:27:26
    stack backtrace:
       0:     0x7fcab80380a7 - <unknown>
       1:     0x7fcab7eca16f - <unknown>
       2:     0x7fcab80043b6 - <unknown>
       3:     0x7fcab80397ef - <unknown>
       4:     0x7fcab80393b3 - <unknown>
       5:     0x7fcab803a3b5 - <unknown>
       6:     0x7fcab8039eb2 - <unknown>
       7:     0x7fcab8039e16 - <unknown>
       8:     0x7fcab8039e01 - <unknown>
       9:     0x7fcab7e307d2 - <unknown>
      10:     0x7fcab7e5ee30 - <unknown>
      11:     0x7fcab7e57b3c - <unknown>
      12:     0x7fcab7e48be3 - <unknown>
      13:     0x7fcab7e645a1 - <unknown>
    

    echo $XDG_CURRENT_DESKTOP ubuntu:GNOME

    opened by insigmo 1
  • Mac support

    Mac support

    This adds basic macos support (tested on macOS Ventura) Also, when running the first time, it will ask for the system event permission, so you will have to restart the app after pressing Ok

    opened by Dan0xE 1
Releases(0.5.5)
Owner
null
Display ZFS datasets' I/O in real time

ztop Display ZFS datasets' I/O in real time Overview ztop is like top, but for ZFS datasets. It displays the real-time activity for datasets. The buil

Alan Somers 40 Nov 23, 2022
Rust code for T-Display S3 AMOLED, ESP32-S3 board with RM67162 AMOLED display

T-Display S3 AMOLED What is it? This is a Rust BSP for the Lilygo's T-Display S3 AMOLED board. RM67162 AMOLED driver in QSPI mode RM67162 AMOLED drive

BH1XUW 4 Jun 28, 2023
🛡️ Terminal-based, real-time traffic monitoring and statistics for your AdGuard Home instance

AdGuardian-Term Terminal-based, real-time traffic monitoring and statistics for your AdGuard Home instance About AdGuardian Terminal Eddition - Keep a

Alicia Sykes 629 Jun 14, 2023
Real-time CLI level meter built in Rust.

Meter This is a very simple command line utility written in Rust for measuring the gain of a microphone. It displays the values in dBFS. This is usefu

Chris Burgess 16 Sep 8, 2022
An experimental real-time operating system (RTOS) written in Rust

An experimental real-time operating system (RTOS) written in Rust

null 0 Nov 14, 2022
Real-time stock tickers from the command-line. Written in Rust.

ticker-rs Real-time stock tickers from the command-line written in Rust. CLI tool using the Yahoo Finance API as a data source. It features colored ou

Patrick Stadler 4 Nov 17, 2022
Minimal and blazing-fast file server. For real, this time.

Zy Minimal and blazing-fast file server. For real, this time. Features Single Page Application support Partial responses (Range support) Cross-Origin

Miraculous Owonubi 17 Dec 18, 2022
Revolutionize handheld gaming with adaptive game settings. Optimize graphics and gameplay experience based on real-time system metrics. Open-source project empowering developers to enhance games on portable devices

Welcome to the server-side application for the HarmonyLink project. This innovative software is developed with the Rust programming language and is ai

Jordon Brooks 5 Jun 28, 2023
Kiomet.com real-time strategy game

Kiomet.com Kiomet.com is an online multiplayer real-time strategy game. Command your forces wisely and prepare for intense battles! Build Instructions

Softbear 26 Oct 10, 2023
A universal load testing framework for Rust, with real-time tui support.

rlt A Rust Load Testing framework with real-time tui support. rlt provides a simple way to create load test tools in Rust. It is designed to be a univ

Wenxuan 129 Jul 20, 2024
Blaze is a Rust script that continuously monitors server resource usage and sends real-time summaries and alerts to a Discord channel via Webhook.

Blaze Blaze is a Rust script designed to run 24/7 on a server, providing a summary of resource usage every 30 minutes (configurable) to a Discord chan

ShadowArcanist 18 Sep 23, 2024
belt is a command line app that can show your time from a list of selected time zones

A CLI app to show your time from a list of selected time zones, and a rust lib to parse dates in string formats that are commonly used.

Rollie Ma 23 Nov 4, 2022
Display a random Shiba from your terminal whenever you feel the need to. Because why not?

Shiba CLI Command-line interface (CLI) to display a random Shiba Inu whenever needed, by just running shiba on your terminal. How To Use • How Does It

null 17 Sep 25, 2022
Display candlestick chart in your terminal.

cli-candlestick-chart This module allows you to display candle charts directly in your terminal. I did this project mainly to learn Rust, so the code

Julien 178 Dec 18, 2022
on-screen keyboard display for your coding streams.

⌨ OSKD (On-screen key display) OSKD is an on-screen keyboard display that can be used during streams. It provides an intuitive and easy-to-use interfa

Sammwy 46 May 6, 2023
A monitor (service) for your monitor (display). Intercepts window behaviour when monitor configuration changes.

Mon-Mon A monitor (service) for your monitor (display). Listens for changes to display configuration (e.g. plugging in an additional screen) and allow

dan 5 Sep 29, 2023
CLI utility that screencaptures your Linux desktop and streams it to Kodi via UPNP/DLNA and RTSP

desktopcast Desktopcast is a little CLI application that allows you to cast your Linux desktop to any UPNP/DLNA device capable of the AVTransfer servi

Markus Ebner 25 Apr 16, 2023
A cross-platofrm desktop app to manage your ports made with Dioxus and Rust.

Port Manager A cross-platofrm desktop app to manage your ports made with Dioxus and Rust. This app has been tested only on macOS. Test on other platfo

Muideen 3 Mar 30, 2024
Helps you keep track of time for team members across different time zones & DST changes

Teamdate Helps you keep track of time for team members across different timezones and other daylight saving changes based off their location. Because

Alex Snaps 7 Jan 9, 2023