Milivault

Keenan Nilson
Founder and Software Developer

Militaria search and research built with Python, Django, PostgreSQL and AWS.

Solo development with Codex and manual work.

Tech at a glance

531,639 tracked · 147 dealers

Public snapshot · October 13, 2026

How does the site function?

  • Hosted on Render, connected to my AWS services.

  • Frontend: Django + HTML/CSS.

How is the data hosted?

  • Product data in AWS RDS (PostgreSQL).

  • Images in AWS S3.

  • Live site on Render + Django.

scikit-learn + OpenAI integration

Human review and data quality

How is the data collected?

  • Python scrapers use BeautifulSoup, Selenium and dealer-specific JSON configurations.

  • Selectors extract product fields for cleaning and structured storage.

  • Product URLs, dealer SKUs and last-seen timestamps support updates.

How is the data kept fresh?

  • Checks identify new listings and source-reported availability changes.

  • Refresh behavior depends on the source and operational checks.

  • A failed scrape is investigated before treating listings as unavailable.

Source-specific updates and last-seen tracking

How is the data classified?

  • Classification work uses Python, scikit-learn and OpenAI API integration.

  • A controlled taxonomy and review workflows help handle inconsistent descriptions.

  • Django is the canonical review direction; earlier Streamlit work is historical.

Stack: Python, BeautifulSoup, Selenium, Django, PostgreSQL, pandas, scikit-learn, OpenAI API, AWS RDS/S3/EC2 and Render.

Main Objective

Collect, clean and organize inconsistent dealer listings so collectors can search the market and research asking prices and source-reported availability.

My Work

  • Python ingestion driven by dealer-specific JSON configurations.

  • PostgreSQL data storage on AWS RDS and image storage in S3.

  • A Django application for search and collector research.

  • Classification and data-quality work using Python, scikit-learn and OpenAI integration.

The public homepage displayed 531,639 tracked listings, 178,729 listings marked available and 147 dealers on October 13, 2026. Tracked listings include the archive. These displayed counters are a dated observation, not a database-quality audit.

The Main Components

  • 1. Gather the Data

    Python scrapers use dealer-specific JSON selectors to collect product fields, clean inconsistent values and maintain product records. Product data is stored in PostgreSQL on AWS RDS, with images in S3.

  • 2. Classify the Data

    Classification work combines a controlled taxonomy, Python, scikit-learn and OpenAI API integration. Human review remains important. Django is the canonical review direction; earlier Streamlit labeling work is historical.

  • 3. Case Study: WW2 Helmets

    This case study explores how listing descriptions and item condition relate to dealer asking prices. The patterns provide research context and do not establish the final price paid.

  • 4. Case Study: A Medal's Worth?

    This case study develops pricing context from comparable listing records and condition assessments. Estimates depend on the selected examples and methodology; they are research benchmarks, not appraisals.

  • 5. Present the Data

    The Django site lets collectors search dealer listings, save items and compare examples. Classification-review development also uses Django; earlier Streamlit tools are historical.

Why I built this

I have always had a deep love for my local antique shop, which was unique in that it exclusively sold military antiques. The shop also had its own museum and a vibrant, one-of-a-kind atmosphere. I volunteered there every weekend for years, learning about the history behind each piece and connecting with the militaria community. Unfortunately, the shop is no longer in business, but that doesn’t mean my passion for antiques has faded. While I may now explore antiques and follow trends in a less traditional way, my love for the craft and my appreciation for the stories these objects hold remains strong.