Personal apartment search tool for Swedish listings (Qasa)
Project description
dmv-aptfind
A personal apartment research tool for Qasa listings in Sweden, Norway, and Finland. Search, save, tag, annotate, and compare apartments — all from your browser. No account required, no data leaves your machine.
Quick start
uvx dmv-aptfind
This installs the tool in an isolated environment, starts a local server on port 8788, and opens the app in your browser. Run the same command again whenever you want to use it — uvx handles updates automatically.
Features
Search
Open the Search tab and pick a city. You can filter by:
| Filter | Values |
|---|---|
| City | Gothenburg, Stockholm, Malmö, Oslo, Helsinki |
| Rooms | min / max |
| Rent | min / max (SEK) |
| Size | min / max (m²) |
| Furnished | yes / no / either |
| Home type | apartment, house, room |
| First-hand, student, senior, corporate | toggle |
| Sort | newest first or by rent |
Results appear as a list on the left and as pins on the map simultaneously. For large cities the search is capped at ~531 results to keep response times reasonable.
Add by URL — if you already have a Qasa listing URL, paste it directly into the field at the top of My List and press Add. No need to search first.
Saved searches
Click Save search after configuring filters to store the preset. Saved searches are listed in the Saved Searches tab; clicking one reloads the filters and re-runs the search immediately.
My list
Apartments you save accumulate in the My List tab. Each card shows the primary photo, address, rent, room count, size, tags, and comment count.
Click any card to open the detail panel on the right, which shows:
- Full rent, size, rooms, floor, address
- Link to the original Qasa listing
- Description from the landlord
- Tags (edit inline)
- Timestamped notes (add / delete individually)
- Commute times to your saved destinations
- All listing photos
Click a map pin to jump directly to that apartment's detail panel.
Tags
Tags are freeform — type anything. The app ships with these suggestions:
| Tag | Map pin colour |
|---|---|
favourite |
amber |
interested |
green |
applied |
blue |
visited |
purple |
rejected |
red |
not interested |
red |
| any other tag | grey |
The pin colour on the map reflects the first tag assigned. Apartments with no tags use grey.
Commute times
The app calculates door-to-door travel times to your saved destinations simultaneously, using four transport modes:
🚗 driving · 🚌 transit · 🚶 walking · 🚲 cycling
To set up destinations:
- Open any saved apartment's detail panel.
- Scroll to the Commute section.
- Click Edit and add destinations by name (e.g. "Chalmers University") or address.
Each time badge is a direct link to Google Maps directions for that exact route and mode. Commute destinations are shared across all apartments — add them once and they appear everywhere.
HTML export (share by email)
Export a self-contained HTML report you can email to someone or open offline:
- From any apartment's detail panel: click Share as HTML ✉ to export that single apartment.
- From the bottom of My List: click the full-list Share as HTML ✉ button, choose which tags to include, and download.
The exported file includes:
- A summary table at the top with Qasa link, address, size, rent, tags, first note, commute times, and availability — sorted favourites first, then interested, then other tags alphabetically
- Individual sections per apartment with all notes, commute table with Google Maps links, description, and photos
The report is a single .html file with styling inlined — no internet connection needed to view it.
JSON backup / restore
Use the Export JSON and Import JSON buttons at the bottom of My List to back up or restore your data.
On import you choose:
- Merge — adds new apartments without touching existing ones
- Replace — overwrites your entire list
The app warns you if your stored data grows beyond 4 MB.
Dark mode
The app follows your system appearance (light / dark) automatically.
Data storage
Everything is stored in your browser's localStorage under the key apartment-finder-db. Nothing is sent to any server except:
- Qasa's API (to fetch listing data when you search or add by URL)
- Google Maps (to calculate commute times, when you use that feature)
Clearing your browser's site data for localhost will erase your list — use Export JSON regularly if your list matters to you.
Development setup
Requirements: Python 3.12+, Node 18+
git clone <repo>
cd apartment-finder
# Backend
cd backend
python3.12 -m venv .venv && source .venv/bin/activate
pip install -r requirements-dev.txt
uvicorn main:app --reload --port 8000
# Frontend (separate terminal)
cd frontend
npm install
npm run dev # → http://localhost:5173
Run tests:
# Backend
cd backend && PYTHONPATH=. pytest -v
# Frontend
cd frontend && npm run test
Build and publish the PyPI package:
# From repo root (requires Node for the frontend build step)
pip install hatch twine
hatch build
twine upload dist/*
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file dmv_aptfind-1.0.0.tar.gz.
File metadata
- Download URL: dmv_aptfind-1.0.0.tar.gz
- Upload date:
- Size: 181.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4c551aba7b2799930c8edfdad10ed639aaece43cfa9129d3250db721d9b11e2a
|
|
| MD5 |
87c12fb0108d158f339600499c788dc3
|
|
| BLAKE2b-256 |
ce9f9113996c3ad2a698c3f0b2cee0ab4e44696838ab7dfb5d4325c503bda894
|
File details
Details for the file dmv_aptfind-1.0.0-py3-none-any.whl.
File metadata
- Download URL: dmv_aptfind-1.0.0-py3-none-any.whl
- Upload date:
- Size: 141.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
26d6a8d46ef9d631a084cf3f93cf87490310891edf071fbb72865112fd7e7439
|
|
| MD5 |
184e56a63bcce2164229a5f57d98f1d1
|
|
| BLAKE2b-256 |
4ded4a91b1d41c32f42d42c247e691b7b4d1cc2cba31f79ac719a3c0db7570cd
|