Lost and Found is an OSINT multi-tool for uncovering forgotten hosts and URLs, retired services, archived webpages and content missing from existing web estate registries.
It can help answer questions such as:
- What URLs exist under a domain?
- What content has been captured historically?
- What exists outside our current registry?
- Which forgotten services are still online?
- Where are the gaps in web archive coverage?
Originally developed for web archiving and web estate mapping at Heritage Collections, The University of Edinburgh.
-
Clone the repository:
git clone https://github.com/UoEMainLibrary/lost-and-found.git cd lost-and-found -
Install Python 3.10 or newer (download Python)
-
Install required packages:
pip install -r requirements.txt
-
Create a uniquely named folder inside the
input/folder, then place your web estate registry file in that folder. For example:input/ βββ my_registry/ βββ urls.csv
Tip
Your registry should be a CSV file containing URLs that Lost and Found can extract and process. It may originate from any source, including existing inventories, CMS exports, previous crawl outputs, web archive seed lists, or manually curated URL collections.
-
Discover hosts and URLs under a domain using one of the available Discovery Tools:
python tools/internet_archive.py ed.ac.uk
-
Compare discovered hosts and URLs against your existing registry:
python tools/compare.py input/my_registry/urls.csv output/ed.ac.uk/internet_archive/hosts.csv
-
Check whether discovered hosts and URLs are still active:
python tools/validate.py output/ed.ac.uk/__comparisons/my_registry__internet_archive.csv
Tools in the Lost and Found toolkit are grouped by purpose:
- π§² Discovery Tools: discover hosts and URLs from external archives and datasets
- π Analysis Tools: process discovered hosts and URLs, compare results and validate findings
| Tool | Purpose | File |
|---|---|---|
| π§² Internet Archive Extractor | Extract hosts and URLs from Internet Archive's Wayback CDX Server API | internet_archive.py |
| π§² Common Crawl Extractor | Extract hosts and URLs from the Common Crawl CDX URL Index | common_crawl.py |
| π§² UKWA Extractor | Extract hosts and URLs from UKWA seed lists | ukwa.py |
| π§² CRT.sh Extractor | Extract hosts from CRT.sh certificate transparency logs | crt_sh.py |
| π§² archive.today Extractor | Extract hosts and URLs from search results of archive.today | archive_today.user.js |
| π Registry Comparator | Compare two registries to identify new hosts and URLs | compare.py |
| π Activity Validator | Check whether discovered hosts and URLs are still active | validate.py |
The recommended Lost and Found discovery workflow is:
flowchart TD
A{Select Discovery Tool}
A --> B[π§² β Internet Archive Extractor]
A --> C[π§² β Common Crawl Extractor]
A --> D[π§² β UKWA Extractor]
A --> E[π§² β CRT.sh Extractor]
A --> F[π§² β archive.today Extractor]
B --> G[Extract hosts and URLs]
C --> G
D --> G
E --> G
F --> G
G --> H{Compare Against Registry?<br/>π β Registry Comparator}
H -->|Yes| I{Already Known?}
H -->|No| K[New Discovery]
I -->|Yes| J[Ignore]
I -->|No| K
K --> L[Check Status<br/>π β Activity Validator]
L --> M{HTTP Response<br/>2xx / 3xx?}
M -->|Yes| N[(Save Active Discovery)]
M -->|No| O[Ignore]
N --> P[(Add to Main Registry)]
Click to expand
β Run internet_archive.py to extract hosts and URLs from Internet Archive's Wayback CDX Server API.
-
Search the Internet Archive for hosts and URLs under a domain:
python tools/internet_archive.py ed.ac.uk
-
Results are written to:
output/ βββ ed.ac.uk/ βββ internet_archive/ βββ hosts.csv βββ urls.csv -
urls.csvcontains discovered URLs andhosts.csvcontains unique hosts.
Click to expand
β Run common_crawl.py to extract hosts and URLs from the Common Crawl CDX URL Index.
-
Search all Common Crawl indexes for hosts and URLs under a domain:
python tools/common_crawl.py ed.ac.uk
-
Search latest Common Crawl index for hosts and URLs under a domain:
python tools/common_crawl.py ed.ac.uk --latest
-
Results are written to:
output/ βββ ed.ac.uk/ βββ common_crawl/ βββ hosts.csv βββ urls.csv -
urls.csvcontains discovered URLs andhosts.csvcontains unique hosts.
Click to expand
β Run ukwa.py to extract hosts and URLs from UKWA seed lists.
-
Search a local UKWA seed list (JSON/CSV) for hosts and URLs under a domain:
python tools/ukwa.py input/ukwa/urls.csv ed.ac.uk
-
Search a remote UKWA seed list (JSON/CSV) for hosts and URLs under a domain:
python tools/ukwa.py https://librarylabs.ed.ac.uk/Annotation_Curation_Tool_Metadata-Collection_Seed_List_JSON.json ed.ac.uk
-
Results are written to:
output/ βββ ed.ac.uk/ βββ ukwa/ βββ hosts.csv βββ urls.csv -
urls.csvcontains discovered URLs andhosts.csvcontains unique hosts.
Click to expand
β Run crt_sh.py to extract hosts from CRT.sh certificate transparency logs.
-
Search CRT.sh certificate transparency logs for hosts under a domain:
python tools/crt_sh.py ed.ac.uk
-
Results are written to:
output/ βββ ed.ac.uk/ βββ crt_sh/ βββ hosts.csv
Click to expand
β Use archive_today.user.js to extract hosts and URLs from search results of archive.today.
-
Install a userscript manager such as Tampermonkey (install Tampermonkey)
-
Open the userscript in your browser (open userscript)
-
Wait for Tampermonkey to detect the userscript, then click Install
-
Open the archive.today 'wildcard' search page (https://archive.ph/search/?q=*)
-
Append your target domain after the existing *. in the search query and click Search (pre-filled search).
-
Click Start in the userscript interface and wait for it to process all available results pages
-
Wait until the extraction process is complete, then click Export to download the results or Copy to copy them to your clipboard
-
Click Reset to clear stored results before starting a new search
-
Exported results will be saved to your Downloads folder. We recommend adding the results to the repository under:
output/ βββ ed.ac.uk/ βββ archive_today/ βββ urls.csv
Click to expand
β Run compare.py to compare two registries to identify new hosts and URLs.
-
Compare discovered hosts and URLs against your existing registry:
python tools/compare.py input/my_registry/urls.csv output/ed.ac.uk/internet_archive/hosts.csv
-
Output files are named using the folder names of the compared sources:
my_registry__internet_archive.csv
-
Results are written to:
output/ βββ ed.ac.uk/ βββ __comparisons/ βββ my_registry__internet_archive.csv βββ ...
Click to expand
β Run validate.py to check whether discovered hosts and URLs are still active. Treats HTTP 2xx and 3xx responses as active.
-
Check whether discovered hosts and URLs are still active:
python tools/validate.py output/ed.ac.uk/__comparisons/my_registry__internet_archive.csv
-
Output files are named automatically using the source file name:
my_registry__internet_archive__live.csv
-
Results are written to:
output/ βββ ed.ac.uk/ βββ __live/ βββ my_registry__internet_archive__live.csv βββ ...
Developed by David Mahoney at Heritage Collections, The University of Edinburgh.
If you use, implement, or reference this project, please cite it as 'Lost and Found' and include clear attribution in publications, software, or documentation where appropriate.
Lost and Found is licensed under Apache 2.0. For full licensing details, see the LICENSE file.