README
¶
GG_Images
Download profile photos from the GG internet messenger in full resolution
Table of contents
- About
- Screenshots
- Features
- Project structure
- Application navigation
- How download works
- Building from source
- Running with Docker or Podman
- BlackArch / OSINT usage
- Configuration and settings
- TODO
- Licensing
About
GG (Gadu-Gadu) is a Polish internet messenger. Profile photos of GG users appear small inside the messenger, but the GG avatar server allows downloading them in much larger sizes (up to 800x800 px) through a public URL — no login required.
GG_Images is a simple GUI tool that automates this process. You enter a GG number (or a range of numbers), and the application downloads the corresponding profile photo in full resolution. The tool is straightforward but can be useful during OSINT investigations and authorized security assessments.
This application does not exploit any vulnerability. It only provides easier access to publicly available data.
You can also download any profile photo manually by entering one of these URLs in a web browser:
https://avatars.gg.pl/user,GG_number/s,800x800https://avatars.gg.pl/user,GG_number/
Replace GG_number with the actual user number (for example 12345678).
Warning: Some application features (range and all-numbers modes) send many requests in a short time. This may cause server problems and may expose you to legal consequences. Use this application for educational purposes only and authorized security testing.
Screenshots
Dark theme

Light theme

Features
- Download a profile photo from:
- One number (manual input)
- Random number
- Range of numbers
- All numbers
- Dark and light theme support
- Multi-language interface (English, Polish, German) with automatic system language detection
- Tree-based navigation panel
Operating systems
Program tested on the following operating systems:
| Operating system | Tested | In official repository | Link |
|---|---|---|---|
| Debian Bullseye | Yes | ||
| RebornOS | Yes | ||
| BlackArch | Yes | Yes | https://blackarch.org/tools.html |
Built with
Project structure
GG_Images/
├── cmd/
│ └── gg-images/ # GUI code (Fyne screens, menus, navigation)
├── internal/
│ ├── download/ # Business logic (HTTP downloads, file I/O)
│ └── i18n/ # Internationalization (EN, PL, DE)
├── build/
│ └── docker/ # Dockerfile and docker-compose.yml
├── assets/
│ ├── logo/ # Application logo (dark and light)
│ ├── screenshots/ # README screenshots
│ └── examples/ # Example JSON files
├── go.mod # Go module definition
├── go.sum # Dependency checksums
├── .dockerignore # Files excluded from Docker build context
├── README.md
├── LICENSE
└── .gitignore
Each directory contains its own README.md with detailed documentation.
Application navigation
The application uses a tree-based navigation panel. The diagram below shows the menu structure and available screens.
graph TD
Root["GG Images"]
Root --> Welcome["Welcome"]
Root --> About["About"]
Root --> Download["Download"]
Download --> OneNumber["One number"]
Download --> RandNumber["Random number"]
Download --> RangeNumbers["Range numbers"]
Download --> AllNumbers["All numbers"]
OneNumber --> EnterNumber["Enter number"]
OneNumber --> FromFile["From file"]
RangeNumbers --> PredefinedRange["Predefined range"]
RangeNumbers --> CustomRange["Custom range"]
AllNumbers --> PredefinedDelay["Predefined delay"]
AllNumbers --> CustomDelay["Custom delay"]
AllNumbers --> WithoutDelay["Without delay"]
style Root fill:#2d6a4f,color:#fff
style Download fill:#1b4332,color:#fff
style OneNumber fill:#1b4332,color:#fff
style RangeNumbers fill:#1b4332,color:#fff
style AllNumbers fill:#1b4332,color:#fff
How download works
sequenceDiagram
participant User
participant App as GG Images
participant API as avatars.gg.pl
User->>App: Enter GG number
App->>App: Build URL with GG number
App->>API: HTTP GET /user,{number}/s,800x800
API-->>App: Image data (PNG)
App->>App: Save file as {number}.png
App-->>User: File saved to working directory
Building from source
Prerequisites
| Requirement | Minimum version | Purpose |
|---|---|---|
| Go | 1.25 | Go compiler and toolchain |
| GCC or Clang | any recent | C compiler (required by CGo for OpenGL bindings) |
| pkg-config | any | Locates system libraries during build |
| OpenGL / Mesa dev headers | any | Fyne GUI rendering |
| X11 dev headers | any | Window management on Linux |
Install system dependencies
The Fyne GUI toolkit uses CGo and requires system libraries for OpenGL and X11. Install them before building.
Debian / Ubuntu
sudo apt-get update
sudo apt-get install -y \
gcc \
pkg-config \
libgl1-mesa-dev \
libx11-dev \
libxcursor-dev \
libxrandr-dev \
libxinerama-dev \
libxi-dev \
libxxf86vm-dev
Fedora / RHEL / CentOS
sudo dnf install -y \
gcc \
pkgconf-pkg-config \
mesa-libGL-devel \
libX11-devel \
libXcursor-devel \
libXrandr-devel \
libXinerama-devel \
libXi-devel \
libXxf86vm-devel
Arch Linux / BlackArch
sudo pacman -S --needed \
gcc \
pkg-config \
mesa \
libx11 \
libxcursor \
libxrandr \
libxinerama \
libxi \
libxxf86vm
Alpine Linux
sudo apk add \
gcc \
musl-dev \
pkgconf \
mesa-dev \
libx11-dev \
libxcursor-dev \
libxrandr-dev \
libxinerama-dev \
libxi-dev \
libxxf86vm-dev
Compile the binary
graph LR
A["Clone repository"] --> B["Download Go modules"]
B --> C["Build binary"]
C --> D["Run"]
Step 1. Clone the repository:
git clone https://codeberg.org/nanoory/GG_Images.git
cd GG_Images
Step 2. Download dependencies:
go mod download
Step 3. Build the binary:
CGO_ENABLED=1 go build -o gg-images ./cmd/gg-images
Step 4. Run:
./gg-images
The compiled binary gg-images is a single self-contained file. You can copy it to any machine with the same OS and architecture. It only requires the OpenGL and X11 runtime libraries listed above.
Verify the build
After building, confirm the binary works:
# Check that the binary was created
file gg-images
# Show linked libraries
ldd gg-images
# Run
./gg-images
Optional: install to system PATH
sudo install -m 755 gg-images /usr/local/bin/gg-images
Cross-compilation
Fyne uses CGo, so cross-compilation requires a C cross-compiler for the target platform. The table below shows common targets.
| Target | GOOS | GOARCH | C compiler | Command |
|---|---|---|---|---|
| Linux x86_64 | linux | amd64 | gcc | CGO_ENABLED=1 GOOS=linux GOARCH=amd64 go build -o gg-images-linux-amd64 ./cmd/gg-images |
| Linux ARM64 | linux | arm64 | aarch64-linux-gnu-gcc | CGO_ENABLED=1 GOOS=linux GOARCH=arm64 CC=aarch64-linux-gnu-gcc go build -o gg-images-linux-arm64 ./cmd/gg-images |
| Windows x86_64 | windows | amd64 | x86_64-w64-mingw32-gcc | CGO_ENABLED=1 GOOS=windows GOARCH=amd64 CC=x86_64-w64-mingw32-gcc go build -o gg-images.exe ./cmd/gg-images |
Note: Cross-compilation also requires the target platform's development libraries (headers and .a/.so files). The simplest approach for multi-platform builds is to use the fyne-cross tool, which handles cross-compilation inside Docker containers:
go install github.com/fyne-io/fyne-cross@latest fyne-cross linux -arch amd64,arm64 ./cmd/gg-images fyne-cross windows -arch amd64 ./cmd/gg-images
Install with go install
If you have Go installed, you can build and install directly:
go install codeberg.org/nanoory/GG_Images/cmd/gg-images@latest
The binary is placed in $GOPATH/bin/ (or $HOME/go/bin/ by default).
Running with Docker or Podman
This is a GUI application. It requires X11 forwarding from the host to display the window.
graph LR
subgraph Host
X11["X11 Display"]
end
subgraph Container
App["GG Images"]
end
App -- "/tmp/.X11-unix" --> X11
Prerequisites
Allow the container to access your X11 display:
xhost +local:
Docker
Build and run with Compose:
docker compose -f build/docker/docker-compose.yml up --build
Or without Compose:
docker build -t gg-images -f build/docker/Dockerfile .
docker run --rm \
-e DISPLAY=$DISPLAY \
-v /tmp/.X11-unix:/tmp/.X11-unix:ro \
--network host \
gg-images
Podman
Build and run with podman-compose:
podman-compose -f build/docker/docker-compose.yml up --build
Or without Compose:
podman build -t gg-images -f build/docker/Dockerfile .
podman run --rm \
-e DISPLAY=$DISPLAY \
-v /tmp/.X11-unix:/tmp/.X11-unix:ro \
--network host \
gg-images
Note: The Dockerfile uses
docker.io/prefixed base images for Podman compatibility. Bothdocker composeandpodman-composework with the provideddocker-compose.yml.
Docker build stages
The Dockerfile uses a multi-stage build to keep the final image small.
graph LR
A["Stage 1: golang:1.26-bookworm<br/>Install deps + compile"] --> B["Stage 2: debian:bookworm-slim<br/>Copy binary + runtime libs"]
B --> C["Final image"]
BlackArch / OSINT usage
GG_Images is included in BlackArch Linux as an OSINT tool for authorized security testing and penetration testing engagements.
GG is widely used in Poland. During security assessments, profile photos can help verify identities, correlate accounts across platforms, or confirm that a GG number belongs to a specific person. The tool is simple but useful when you need to quickly retrieve a full-resolution photo that appears tiny inside the messenger.
Install from BlackArch repository
sudo pacman -S gg-images
Typical OSINT workflow
graph TD
A["Obtain target GG number<br/>from public sources"] --> B["Run GG Images"]
B --> C{"Choose download mode"}
C --> D["Single number<br/>Known target"]
C --> E["Range of numbers<br/>Targeted scan"]
D --> F["Analyze downloaded<br/>profile photos"]
E --> F
F --> G["Reverse image search<br/>Face matching<br/>Cross-platform correlation"]
- Obtain target GG numbers from public sources (forums, social media, public directories).
- Run GG Images and enter the number(s).
- The tool downloads profile photos at full resolution (800x800 px) — much larger than they appear inside the GG messenger.
- Analyze the photos: reverse image search, face matching, or cross-platform account correlation.
Important: Use this tool only during authorized security assessments. Bulk downloading without authorization may violate terms of service and local laws.
Configuration and settings
The application stores user preferences (theme, last selected panel) using the Fyne preference system. The app ID is gg.images.
Settings file locations
Fyne writes preferences to a JSON file. The path depends on the operating system.
| OS | Path |
|---|---|
| Linux | ~/.config/fyne/gg.images/preferences.json |
| BSD (FreeBSD, OpenBSD) | ~/.config/fyne/gg.images/preferences.json |
| macOS | ~/Library/Preferences/fyne/gg.images/preferences.json |
| Windows | %APPDATA%\fyne\gg.images\preferences.json |
On Linux and BSD, the path follows the XDG Base Directory specification. If $XDG_CONFIG_HOME is set, Fyne uses $XDG_CONFIG_HOME/fyne/gg.images/ instead of ~/.config/fyne/gg.images/.
graph TD
A["User changes settings<br/>(theme, font size)"] --> B["Fyne Preferences API"]
B --> C{Operating system?}
C -->|Linux / BSD| D["~/.config/fyne/gg.images/preferences.json"]
C -->|macOS| E["~/Library/Preferences/fyne/gg.images/preferences.json"]
C -->|Windows| F["%APPDATA%\\fyne\\gg.images\\preferences.json"]
Stored preferences
| Key | Type | Description |
|---|---|---|
currentWindow |
string | ID of the last selected navigation panel (restored on next launch) |
lang |
string | Language code ("en", "pl", "de"). If empty, the app detects the system language. |
theme |
string | Selected theme: "dark" or "light" |
font_size |
float | Font scale set in File > Settings > Appearance |
animation |
string | Animation setting from Fyne appearance settings |
You can edit the preferences.json file manually with any text editor. Delete the file to reset all settings to defaults.
Downloaded photos
Downloaded profile photos are saved to a gg_images_download/ folder in the directory where the binary is launched. This is not inside the settings directory — it is always relative to the current working directory.
./gg_images_download/
├── 12345678.png
└── ...
TODO
- Base functions
- Read GG numbers from JSON file
- Progress bars for download windows
Licensing
GPL-3.0 only