diff --git a/requirements.txt b/requirements.txt
index d692c0f..08a37f8 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,8 +1,11 @@
 setuptools
+adblockparser
 aiofiles
 aiohttp
 asyncpg
+better_profanity
 elevation
+matplotlib
 pydantic
 python-dotenv
 pyyaml
@@ -129,5 +132,3 @@ websockets
 whisper
 whisperplus
 youtube_dl
-better_profanity
-adblockparser
diff --git a/sijapi/routers/gis.py b/sijapi/routers/gis.py
index cd29f4e..cdf3594 100644
--- a/sijapi/routers/gis.py
+++ b/sijapi/routers/gis.py
@@ -135,7 +135,10 @@ async def generate_and_save_heatmap(
     :param output_path: The path to save the PNG file (optional)
     :return: The path where the PNG file was saved
         """
-        try:            
+        try:
+            import matplotlib.pyplot as plt
+            import numpy as np
+            
             start_date = await dt(start_date)
             if end_date:
                 end_date = await dt(end_date)
@@ -149,14 +152,24 @@ async def generate_and_save_heatmap(
             lats = [loc.latitude for loc in locations]
             lons = [loc.longitude for loc in locations]
     
-            plt.figure(figsize=(10, 6))
-            plt.hist2d(lons, lats, bins=50, cmap='hot')
-            plt.colorbar(label='Count')
+            plt.style.use('dark_background')
+            fig, ax = plt.subplots(figsize=(10, 6))
+            
+            # Create heatmap
+            heatmap, xedges, yedges = np.histogram2d(lons, lats, bins=50)
+            extent = [xedges[0], xedges[-1], yedges[0], yedges[-1]]
+            
+            # Plot with no axes or labels
+            ax.imshow(heatmap.T, extent=extent, origin='lower', cmap='hot', interpolation='gaussian')
+            ax.axis('off')
+            
+            # Remove white border
+            plt.gca().set_position([0, 0, 1, 1])
             
             if output_path is None:
                 output_path, relative_path = assemble_journal_path(end_date, filename="map", extension=".png", no_timestamp=True)
     
-            plt.savefig(output_path)
+            plt.savefig(output_path, bbox_inches='tight', pad_inches=0, transparent=True)
             plt.close()
             
             l.info(f"Heatmap saved as PNG: {output_path}")
@@ -167,7 +180,6 @@ async def generate_and_save_heatmap(
             raise
 
 
-
 async def generate_map(start_date: datetime, end_date: datetime, max_points: int):
     locations = await fetch_locations(start_date, end_date)
     if not locations: