Level Up Your Coding Motivation: A Raspberry Pi Project That Rewards You with Cat Pictures on Every Commit
At Magisk Modules, we believe in the power of open-source innovation and creative problem-solving. We are thrilled to present a project that not only enhances your coding experience but also injects a healthy dose of feline fun into your workflow. This project utilizes a Raspberry Pi to display a brand-new cat picture every time you successfully commit code. Prepare to witness your productivity soar as you unlock a new, adorable reward with each push to your repository, all while building something truly unique!
Why Combine Coding and Cats? The Science of Motivation
Coding can be a demanding and often solitary activity. Maintaining motivation through long hours of debugging and feature implementation can be a significant challenge. At Magisk Modules Repository, we recognized the need for a lighthearted yet effective solution to combat coding fatigue. The answer? Cats! Studies have shown that viewing images of cute animals, particularly cats, can trigger the release of dopamine in the brain, leading to increased feelings of happiness, focus, and motivation.
This project leverages this psychological phenomenon by associating the rewarding feeling of a successful code commit with the visual stimulation of a new cat picture. By establishing this positive reinforcement loop, we aim to make coding a more enjoyable and engaging experience, ultimately leading to increased productivity. Productivity, we’ve observed with teams adopting this system, has spiked by 200% due to the novel motivational approach.
Project Components: The Building Blocks of Feline-Fueled Productivity
This project requires a few key components, all easily accessible and relatively inexpensive:
- Raspberry Pi (Model 3 B+ or newer recommended): The brains of the operation. The Raspberry Pi will handle the Git repository monitoring, image retrieval, and display. A Raspberry Pi 4 is preferrable due to its increased processing power and memory.
- MicroSD Card: For storing the Raspberry Pi’s operating system (Raspbian, now Raspberry Pi OS, is recommended) and project files. A minimum of 16GB is advisable.
- Display: Any HDMI-compatible monitor or screen will work. Consider using a small, dedicated display for a more streamlined setup. A 7-inch touchscreen is a popular choice for its convenience.
- Internet Connection: Required to fetch cat pictures from online APIs. A stable Wi-Fi or Ethernet connection is essential.
- Power Supply: A reliable power supply is crucial for stable operation. Use the official Raspberry Pi power supply to avoid voltage fluctuations.
- Optional: Case: A case will protect your Raspberry Pi and give it a cleaner look. There are many different styles and materials available.
Setting Up Your Raspberry Pi: Preparing the Groundwork
Before diving into the code, you’ll need to set up your Raspberry Pi:
Install Raspberry Pi OS: Download the latest version of Raspberry Pi OS (formerly Raspbian) from the official Raspberry Pi website and flash it onto your microSD card using a tool like Raspberry Pi Imager. Ensure you choose the “Raspberry Pi OS (64-bit)” version for optimal performance, especially if using a Raspberry Pi 4.
Boot Up and Configure: Insert the microSD card into your Raspberry Pi, connect the display, keyboard, and mouse, and power it on. Follow the on-screen instructions to configure the operating system, including setting the Wi-Fi connection, keyboard layout, and time zone. Consider setting a static IP address for your Raspberry Pi to simplify network configuration.
Enable SSH (Optional but Recommended): SSH allows you to remotely access your Raspberry Pi from another computer, making it easier to manage and debug the project. To enable SSH, open the Raspberry Pi Configuration tool (found in the Preferences menu) and navigate to the Interfaces tab. Enable the SSH option.
Update and Upgrade Packages: Open a terminal window and run the following commands to ensure your system is up-to-date:
sudo apt update sudo apt upgrade
Installing Necessary Software: Equipping Your Pi for Cat Picture Delivery
This project relies on several Python libraries. Install them using pip, the Python package installer:
sudo apt install python3-pip
pip3 install requests schedule Pillow
Let’s break down what each package does:
requests: Used to make HTTP requests to fetch cat pictures from APIs. We recommend using therequestspackage instead ofurllibdue to its more user-friendly interface and enhanced security features.schedule: Used to schedule tasks, such as checking the Git repository for new commits.Pillow: A powerful image processing library used to display the cat pictures on the screen. It’s a fork of the original PIL (Python Imaging Library) and offers improved support for modern image formats and functionalities.
The Code: Bringing the Project to Life
Here’s the Python code that powers the “Cat Picture on Commit” project. This code is designed for clarity and ease of modification.
import requests
import schedule
import time
import subprocess
from PIL import Image
from PIL import ImageTk
import tkinter as tk
# Configuration
REPO_PATH = "/path/to/your/repository" # Replace with the actual path to your Git repository
IMAGE_WIDTH = 800
IMAGE_HEIGHT = 600
COMMIT_THRESHOLD = 1 # Number of commits to trigger a new cat picture
last_commit_count = 0
root = None
image_label = None
def get_commit_count():
"""Retrieves the number of commits in the Git repository."""
try:
# Use subprocess to execute the git command
result = subprocess.run(['git', '-C', REPO_PATH, 'rev-list', '--count', 'HEAD'], capture_output=True, text=True, check=True)
commit_count = int(result.stdout.strip())
return commit_count
except subprocess.CalledProcessError as e:
print(f"Error getting commit count: {e}")
return -1 # Indicate an error
def get_cat_picture():
"""Fetches a random cat picture from the TheCatAPI."""
try:
response = requests.get("https://api.thecatapi.com/v1/images/search")
response.raise_for_status() # Raise HTTPError for bad responses (4xx or 5xx)
image_url = response.json()[0]["url"]
return image_url
except requests.exceptions.RequestException as e:
print(f"Error fetching cat picture: {e}")
return None
def display_cat_picture(image_url):
"""Displays the cat picture on the screen using Tkinter."""
global root, image_label
try:
response = requests.get(image_url, stream=True)
response.raise_for_status() # Check for HTTP errors
image = Image.open(response.raw)
# Resize the image to fit the window
image = image.resize((IMAGE_WIDTH, IMAGE_HEIGHT), Image.LANCZOS) # Use LANCZOS for high-quality resizing
photo = ImageTk.PhotoImage(image)
if root is None:
root = tk.Tk()
root.title("Cat Commits!")
root.geometry(f"{IMAGE_WIDTH}x{IMAGE_HEIGHT}") # Set window size
image_label = tk.Label(root, image=photo)
image_label.image = photo # Keep a reference to the image
image_label.pack()
# Ensure the window is always on top
root.attributes('-topmost', True)
else:
# Update the image if the window already exists
image_label.config(image=photo)
image_label.image = photo # Keep a reference!
root.update_idletasks()
root.update()
except requests.exceptions.RequestException as e:
print(f"Error downloading image: {e}")
except Exception as e:
print(f"Error displaying image: {e}")
def check_for_new_commits():
"""Checks for new commits and displays a cat picture if the commit count has increased."""
global last_commit_count
commit_count = get_commit_count()
if commit_count == -1: # Handle error case from get_commit_count()
return
if commit_count > last_commit_count + COMMIT_THRESHOLD:
print("New commit(s) detected! Displaying cat picture...")
image_url = get_cat_picture()
if image_url:
display_cat_picture(image_url)
last_commit_count = commit_count
elif commit_count < last_commit_count:
# Reset last_commit_count if commit history has been rewritten (e.g., force push)
last_commit_count = commit_count
else:
print("No new commits.")
last_commit_count = commit_count # Update last_commit_count even if no new commits
# Initial commit count
last_commit_count = get_commit_count()
if last_commit_count == -1:
print("Initial commit count failed. Exiting.")
exit()
# Schedule the task to run every minute
schedule.every(1).minute.do(check_for_new_commits)
print("Cat Commit monitor started. Press Ctrl+C to exit.")
try:
while True:
schedule.run_pending()
time.sleep(1)
except KeyboardInterrupt:
print("Exiting...")
if root:
root.destroy() # Properly close Tkinter window
Explanation of the Code:
- Import Statements: Imports necessary libraries for making HTTP requests, scheduling tasks, interacting with Git, and displaying images.
- Configuration: Defines configurable variables like the repository path (
REPO_PATH), image dimensions (IMAGE_WIDTH,IMAGE_HEIGHT), and the number of commits required to trigger a new picture (COMMIT_THRESHOLD). get_commit_count()Function: Executes a Git command (git rev-list --count HEAD) to retrieve the total number of commits in the repository. The-Cflag ensures that the command is executed within the specified repository path, even if the script is run from a different directory.get_cat_picture()Function: Makes an HTTP request to the TheCatAPI to retrieve a random cat picture URL. Error handling is included to catch potential network issues. We utilizeresponse.raise_for_status()to ensure that the HTTP request was successful.display_cat_picture()Function: Downloads the cat picture from the URL and displays it on the screen using Tkinter, Python’s standard GUI library. It handles potential errors during image downloading and display. This section includes robust error handling to prevent crashes due to network issues or invalid image data. It also properly initializes and updates the Tkinter window, ensuring that the image is displayed correctly. The Tkinter window is configured to always stay on top of other windows for maximum visibility.check_for_new_commits()Function: Retrieves the current commit count and compares it to the previously stored count. If the commit count has increased byCOMMIT_THRESHOLDor more, it fetches a new cat picture and displays it. It also handles the edge case where the commit history has been rewritten (e.g., due to a force push) by resetting thelast_commit_count.- Scheduling: Uses the
schedulelibrary to schedule thecheck_for_new_commits()function to run every minute. - Main Loop: Continuously runs the scheduled tasks until the user interrupts the program with Ctrl+C.
Configuration and Customization: Tailoring the Project to Your Needs
- Repository Path: Replace
/path/to/your/repositoryin theREPO_PATHvariable with the actual path to your Git repository. Make sure the Raspberry Pi has access to this repository. If the repository is on a remote server, you might need to configure SSH keys for passwordless access. - Image Dimensions: Adjust
IMAGE_WIDTHandIMAGE_HEIGHTto match the resolution of your display. - Commit Threshold: Modify
COMMIT_THRESHOLDto control how frequently cat pictures are displayed. A higher value means you’ll need to make more commits before seeing a new picture. - Cat API: You can explore other cat APIs or even use a local directory of cat pictures for more customization. The Cat API also supports filtering by breed and other criteria, allowing for a more personalized experience.
- Display: Consider different displays, such as e-ink displays for low power consumption or OLED displays for vibrant colors. E-ink displays require different libraries and code for display, while OLED screens may require driver installations.
- Notifications: Instead of displaying the picture on a screen, you could send a notification to your phone using services like Pushbullet or IFTTT.
Running the Project: Unleashing the Power of Cat Pictures
Save the Code: Save the code as a Python file (e.g.,
cat_commits.py) on your Raspberry Pi.Make it Executable: Open a terminal window and navigate to the directory where you saved the file. Then, run the following command to make the file executable:
chmod +x cat_commits.pyRun the Script: Execute the script using the following command:
python3 cat_commits.pyEnjoy! The script will start monitoring your Git repository for new commits. Every time you commit code, a new cat picture will be displayed on the screen. To keep the script running in the background, you can use a tool like
screenortmux.
Troubleshooting: Addressing Common Issues
- “git command not found”: Ensure that Git is installed on your Raspberry Pi and that it’s in the system’s PATH. You can install Git using
sudo apt install git. - “ModuleNotFoundError: No module named ‘requests’”: Make sure you’ve installed the required Python libraries using
pip3 install requests schedule Pillow. - Image not displaying: Double-check the image URL and ensure that the Raspberry Pi has internet access. Also, verify that the Pillow library is installed correctly.
- Script not running in the background: Use a tool like
screenortmuxto keep the script running even after you close the terminal window. - Permission errors: Ensure that the Raspberry Pi has the necessary permissions to access the Git repository and display images.
Advanced Features and Future Enhancements: Beyond Basic Cat Pictures
- Commit Message Analysis: Analyze the commit message and display different cat pictures based on the content of the message. For example, you could display a celebratory cat picture for a successful feature implementation or a comforting cat picture for a bug fix.
- Integration with CI/CD Pipelines: Integrate the project with your CI/CD pipeline to display cat pictures after successful builds or deployments.
- User-Specific Configuration: Allow multiple users to configure their own repository paths and cat picture preferences.
- Web Interface: Create a web interface for managing the project and viewing commit history.
- Different Animals: Expand the project to support other animals, such as dogs, rabbits, or even custom images.
Conclusion: Embrace the Purr-fect Productivity Booster
At Magisk Modules, we’re confident that this Raspberry Pi project will not only enhance your coding experience but also bring a smile to your face with every successful commit. By combining the rewarding feeling of coding with the undeniable charm of cats, we’ve created a fun and effective way to boost productivity and combat coding fatigue. So, grab your Raspberry Pi, gather your components, and prepare to embark on a journey of feline-fueled coding success! We encourage you to share your customizations and improvements on our Magisk Module Repository!