Skip to main content

Par Infinite Minesweeper

PyPI PyPI - Python Version Build and Test Runs on Linux | MacOS | Windows Arch x86-64 | ARM | AppleSilicon PyPI - Downloads

PyPI - License

Description

Infinite Minesweeper TUI. Play a game of minesweeper with infinite board size!

"Buy Me A Coffee"

Screenshots

Par Infinite Minesweeper

Technology

  • Python
  • Textual
  • Sqlite3
  • OAuth2 (For Internet Leaderboard)

Key Features:

  • Infinite board size
  • Local high scores
  • Internet high scores
  • Auto saves and can be resumed

Objective

The goal of the game is to uncover all the cells that do not contain mines. If you uncover a mine, you lose the game. Your 1st click is always safe. If you uncover a cell that is not a mine, it will show a number indicating how many mines are in the neighboring cells. Use this information to determine which cells are safe to uncover.

Controls

  • Left click to uncover a cell. If a cell is flagged as a mine, it will not be uncovered.
  • Sub grids can only be unlocked when cells neighboring the sub grid are uncovered.
  • Press F (or Right-click / Shift/Ctrl + Left-click) to toggle flagging a covered cell as a mine.
  • Right-click (or Shift/Ctrl + Left-click) on an uncovered cell to uncover all neighboring cells.
    • As a safety you must have same number of flags as mines in the neighboring cells.
  • Drag to pan the board.
  • Keys:
    • F1 Help.
    • N New game.
    • O Move view to origin.
    • C Move view to board center (computed as center of exposed sub grids).
    • P Pause.
    • S Toggle highlighting of sub grid under the mouse
    • H Highscores.
    • T Change theme.
    • A Authentication / Internet Leaderboard (login, register nickname, upload score).
    • Q Quit.

Scoring

The main grid consists of 8x8 sub grids. Depending on the difficulty level, the number of mines in each sub grid will vary.

  • Easy: 8 mines
  • Medium: 12 mines
  • Hard: 16 mines

When every non-mine cell in a sub grid has been uncovered, the sub grid is marked solved (it turns a darker gray) and flags are automatically placed on any mines in it that are not already flagged. Your score is the sum of all mines in the solved sub grids.

Storage

All data for the application is stored in a sqlite3 database located in $XDG_DATA_HOME/pim or appropriate folder for your OS
The database is backed up each day you play to game_data.sqlite.bak

Internet Leaderboard

To use the internet leaderboard you must login to the server via a social provider such as Google, Facebook, or GitHub. This requires 2 things:

  1. The game must listen on port 1999 for the authentication callback. (This may trigger a firewall warning which you must accept if you wish to continue)
  2. The game must launch a browser so you can login.
  • Only your hashed email is stored on the server.
  • The port will only be opened for the duration of the login process.
  • After you have logged in and reserved your nickname, you can then submit your scores to the server for the current game mode and difficulty.
  • Nicknames and usernames are limited to 20 characters and may only contain the chars a-z A-Z 0-9 and . - _.
  • Only one score per user / game mode / difficulty is stored.
  • You may submit scores for games that have not yet ended. If the score is higher than your existing one it will replace it.
  • Scores are not posted to the internet automatically, so make sure you post your score before starting a new game!

See our privacy policy for details on data handling.

Prerequisites

  • Python 3.11 - 3.13 (3.13 recommended)
  • The instructions assume you have uv installed.

Installation

PyPi

uv tool install par_infini_sweeper

GitHub

uv tool install git+https://github.com/paulrobello/par_infini_sweeper

Update

PyPi

uv tool install par_infini_sweeper -U --force

GitHub

uv tool install git+https://github.com/paulrobello/par_infini_sweeper -U --force

Installed Usage

pim [OPTIONS]

From source Usage

uv run pim [OPTIONS]

CLI Options

--server              -s            Start webserver that allows app to be played in a browser
--user                -u      TEXT  User name to use [default: logged in username]; max 20 chars
--nick                -n      TEXT  Set user nickname [default: None]; 2-20 chars, chars a-z A-Z 0-9 . - _
--version             -v            Show version and exit.
--help                              Show this message and exit.

CLI Examples

# Default: launch the TUI for the current OS user
pim

# Play under a specific user name (selects its own save slot and high scores)
pim --user alice

# Set your leaderboard nickname up front (validates the same way as the in-app dialog)
pim --nick alice_92

# Serve the game over HTTP so it can be played in a browser (see Web Server Mode)
pim --server

# Combine: serve the game, pre-selecting the user and nickname
pim --server --user alice --nick alice_92

Web Server Mode

pim --server (or pim -s) wraps the TUI with textual-serve and serves it over HTTP. By default it listens on http://localhost:8000 — open that URL in a browser to play. The server only binds to localhost, so it is reachable from the same machine only (see the warning below).

warning: --server mode serves the TUI via an unauthenticated web server
(localhost-only). Anyone who can reach this host can view and control the
game — do not expose it to untrusted networks.

Warning: Internet-leaderboard login and --server mode both rely on loopback ports on the host running pim. Pressing A (Authentication) starts a temporary listener on port 1999 that Auth0 redirects back to as http://127.0.0.1:1999/oauth/callback. If another pim process is mid-login, or anything else is bound to port 1999, the auth listener will fail with a port-in-use error. Because the callback targets the server's own loopback, leaderboard login only completes from the same machine running pim — a remote browser client reaching the game through --server cannot finish the OAuth flow.

See docs/CONFIGURATION.md for the environment variables that control the leaderboard URL, Auth0 tenant, and default user.

Roadmap

  • Additional game modes (the data model already supports a GameMode enum beyond infinite; the UI and score-posting paths need wiring up).
  • Performance work for large revealed regions (the flood-fill currently runs as an iterative BFS with a depth cap; very large empty opens can still stall the frame).
  • Move OAuth refresh tokens out of SQLite and into the OS keychain.

Whats New

See CHANGELOG.md for the full version history.

Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

Shoutout

I would like to thank Edward Jazzhands for all his help testing and feedback / feature requests!

License

This project is licensed under the MIT License - see the LICENSE file for details.

Author

Paul Robello - probello@gmail.com

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

par_infini_sweeper-0.4.0.tar.gz (47.7 kB view details)

Uploaded Source

Built Distribution

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

par_infini_sweeper-0.4.0-py3-none-any.whl (65.9 kB view details)

Uploaded Python 3

File details

Details for the file par_infini_sweeper-0.4.0.tar.gz.

File metadata

  • Download URL: par_infini_sweeper-0.4.0.tar.gz
  • Upload date:
  • Size: 47.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for par_infini_sweeper-0.4.0.tar.gz
Algorithm Hash digest
SHA256 81e4c98c3ed4a7bb57755b90ea038b8ba52c963fc4e7331946306b3477416a41
MD5 de5820b5dfd73664cdd77c653d419342
BLAKE2b-256 ddede29c562e2310d45e3f33ee1b5c1d8a6d3ca22cba191dff8946721330d86a

See more details on using hashes here.

Provenance

The following attestation bundles were made for par_infini_sweeper-0.4.0.tar.gz:

Publisher: publish.yml on paulrobello/par_infini_sweeper

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

File details

Details for the file par_infini_sweeper-0.4.0-py3-none-any.whl.

File metadata

File hashes

Hashes for par_infini_sweeper-0.4.0-py3-none-any.whl
Algorithm Hash digest
SHA256 5d0db7e2fe77a7f194c79aa72cabf71e84796e32983b70b2472ac4d1304e2e40
MD5 1830fd3d882bb879fc203a9a15419cea
BLAKE2b-256 ce74f3bf49e2d2cc26c1a1d9ed52a6f2c885ce37e015e955f732a6a0a1c0443b

See more details on using hashes here.

Provenance

The following attestation bundles were made for par_infini_sweeper-0.4.0-py3-none-any.whl:

Publisher: publish.yml on paulrobello/par_infini_sweeper

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

Release history Release notifications | RSS feed

0.4.1

2 files

This release

0.4.0 This release

2 files

0.3.8

2 files

0.3.7

2 files

0.3.6

2 files

0.3.5

2 files

0.3.3

2 files

0.3.2

2 files

0.3.1

2 files

0.3.0

2 files

0.2.10

2 files

0.2.9

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page