Manage your coin collection with the power of Artificial Intelligence.
NumismaticApp is a modern web application designed for coin collectors.
- Numista API Integration: Get detailed data and cross-references for your coins directly from the largest numismatic database.
- AI Identification: Upload photos of your coins and let Google Gemini AI identify and extract key details (country, year, value, mint, rule, etc.).
- Automatic Grading: Uses AI to estimate the conservation state (grade) of your coins.
Forget about manual data entry. Simply upload a photo of your coin and let AI do the heavy lifting, organizing your collection into a secure database and presenting it in a visually appealing gallery.
- π€ AI Analysis: Automatic coin identification and grading using Google Gemini Vision.
- πΌοΈ Image Processing: Auto-crop to circle, background removal, and smart rotation using
vips(Alpine optimized). - π Collection Management: Create, edit, and organize your coins into custom groups.
- π Interactive Dashboard: Visualize collection statistics, distribution by country, material, and total value.
- π Numista Integration: Link your coins with the Numista database for detailed information and references.
- π± Responsive Design: Modern and adaptable interface built with Vue 3 and DaisyUI.
- π³ Docker Ready: Simple and consistent deployment using Docker containers (Secure Alpine-based image).
| AI Identification | Detail View |
|---|---|
![]() |
![]() |
| Coin List | Interactive Dashboard |
|---|---|
![]() |
![]() |
- Docker & Docker Compose
- A Google Gemini API Key
- A Numista API Key (Optional, for data enrichment)
The fastest way to start is using the pre-built image from DockerHub.
-
Create a storage directory (important for persistence):
mkdir -p ./storage
For NAS deployments (Synology, QNAP, etc.): The container runs as a non-root user (
appuser, UID 1001), so ensure the directory has correct permissions:# Set owner to UID 1001 (appuser) mkdir -p ./storage chown 1001:1001 ./storage chmod 755 ./storage -
Create a
docker-compose.ymlfile:services: app: image: tparicio/numismaticapp:latest restart: unless-stopped user: "1001:1001" # Default appuser, but good to be explicit ports: - "8080:8080" environment: - GEMINI_API_KEY=your_api_key_here - NUMISTA_API_KEY=your_optional_numista_key - REMBG_URL=http://rembg:5000/api/remove - POSTGRES_HOST=db - POSTGRES_USER=postgres - POSTGRES_PASSWORD=secret - POSTGRES_DB=numismatic depends_on: db: condition: service_healthy volumes: - ./storage:/app/storage db: image: postgres:15-alpine restart: unless-stopped environment: - POSTGRES_USER=postgres - POSTGRES_PASSWORD=secret - POSTGRES_DB=numismatic volumes: - postgres_data:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U postgres"] interval: 10s timeout: 5s retries: 5 start_period: 30s rembg: image: danielgatis/rembg:latest command: s --host 0.0.0.0 --port 5000 ports: - "5000:5000" volumes: postgres_data:
-
Start the application:
docker compose up -d
-
Access in browser:
- Open
http://localhost:8080to view your collection.
- Open
If you prefer building from source:
-
Clone the repository:
git clone https://github.com/tparicio/numismaticapp.git cd numismaticapp -
Configure environment: Create a
.envfile in the root directory:GEMINI_API_KEY=your_api_key NUMISTA_API_KEY=your_optional_key POSTGRES_USER=postgres POSTGRES_PASSWORD=postgres POSTGRES_DB=numismatic
-
Run with Make:
make run
This will start services using the development
docker-compose.yml.
- Go to "Add Coin" section.
- Upload a photo of the Obverse and Reverse.
- Select a group (optional) or create a new one.
- Click "Analyze and Save".
- AI will process images and fill in data automatically.
- Go to "Groups" section.
- Create thematic collections (e.g., "Silver Dollars", "Ancient Rome").
- Assign your coins to these groups to keep your collection organized.
Cause: storage directory is not correctly mounted as a persistent volume.
Solution:
- Ensure the
storagedirectory exists on the host before first deployment. - Verify
docker-compose.ymlincludes the volume mapping:volumes: - ./storage:/app/storage
Cause: The container runs as non-root user appuser (UID 1001), but the host directory belongs to root or another user.
Solution:
- Change ownership of the folder on the host machine:
chown -R 1001:1001 ./storage
- Or explicitly set the user in
docker-compose.ymlif you need a different UID:user: "1026:100" # Example user:group in Synology
Contributions are welcome! If you have ideas to improve the application:
- Fork the project.
- Create a feature branch (
git checkout -b feature/AmazingFeature). - Commit your changes (
git commit -m 'Add some AmazingFeature'). - Push to the branch (
git push origin feature/AmazingFeature). - Abre un Pull Request.
Distributed under the MIT License. See LICENSE file for more information.



