Tessera-2600: OSINT tool for phone number reconnaissance across services
Project description
Tessera-2600
CLI-only OSINT tool that generates phone-number variations and checks them across services with rich terminal output.
- Runtime: Python 3.8+
- Distribution: PyPI package
tessera-2600(console scripts installed) - Primary CLI commands:
tessera,tessera-2600, ortessera2600 - Status: 1.0.0 (CLI-only)
Installation
From PyPI (recommended):
pip install tessera-2600
From source (editable dev install):
git clone https://github.com/Seraphim-Solutions/tessera.git
cd tessera
pip install -e .
Quick start
After installing from PyPI, use the console script:
# Basic run (auto threads/timeouts per services)
tessera -n "+420 731x4x748"
# Choose specific services
tessera -n "+420 731x4x748" --services seznamcz instagram
# Use country-specific mobile prefixes when first digit is unknown (x)
tessera -n "+420 xxxxxxxx" --use-country-prefixes
# Show services and rate limit guidance
tessera --show-services
tessera --show-rate-limits
Aliases installed by the package: tessera, tessera-2600, and tessera2600 (all equivalent).
The tool automatically detects country codes and suggests using country-specific mobile prefixes:
- ๐จ๐ฟ Czech Republic (+420): Prefixes 6, 7
- ๐ธ๐ฐ Slovakia (+421): Prefix 9
- ๐บ๐ธ USA/Canada (+1): Prefixes 2-9
- ๐ฌ๐ง United Kingdom (+44): Prefix 7
- ๐ฉ๐ช Germany (+49): Prefix 1
Project Structure
tessera/
โโโ pyproject.toml # Build and metadata (setuptools)
โโโ README.md # This file
โโโ LICENSE
โโโ src/
โ โโโ tessera_2600/
โ โโโ __init__.py
โ โโโ tessera_cli.py # CLI implementation (Rich-powered)
โ โโโ config.py # Configuration settings and UX strings
โ โโโ utils.py # Utilities (validation, logging, proxies)
โ โโโ generator.py # Phone number generation/expansion
โ โโโ checker.py # Service checker orchestration
โ โโโ core/
โ โ โโโ __init__.py
โ โ โโโ models.py # CheckResult, RunSummary schemas
โ โ โโโ adapters.py # Legacy-to-structured adapters
โ โ โโโ plugin_api.py # External plugin entry point API
โ โ โโโ declarative_service.py # Runner for JSON/YAML-described services
โ โ โโโ proxy_manager.py # Proxy rotation and management
โ โ โโโ threading_manager.py # Thread coordination
โ โ โโโ work_distributor.py # Work queue management
โ โโโ services/
โ โ โโโ __init__.py # Descriptor loader and registry
โ โ โโโ utils.py
โ โ โโโ descriptors/ # Built-in service descriptors
โ โ โโโ *.json # Preferred descriptor format
โ โ โโโ *.yaml|*.yml # Optional if PyYAML is installed
โ โโโ operations/
โ โโโ __init__.py
โ โโโ variation_generator.py
โ โโโ results_handler.py
โโโ tests/
โโโ test_*.py # `unittest` test modules
Development
Running Tests
By default, tests work with the standard library unittest:
python -m unittest discover -s tests -p 'test_*.py' -v
Optionally, you can use pytest (uncomment in requirements.txt and install):
pytest -q
Code Formatting
black .
flake8 .
Type Checking
mypy .
Packaging and Publishing (PyPI)
The project uses a src/ layout and pyproject.toml with setuptools. Console scripts are declared under [project.scripts] and install tessera, tessera-2600, and tessera2600.
Build artifacts:
python -m pip install --upgrade build twine
python -m build # produces dist/*.whl and dist/*.tar.gz
twine check dist/* # optional validation
pip install dist/*.whl # install locally
Contributing
We welcome contributions of new services. You can:
- Add a declarative descriptor under
src/tessera_2600/services/descriptors/(JSON preferred; YAML optional ifPyYAMLis available). See the sections below for schema and examples. - Or provide an external plugin package exposing an entry point under the
tessera.servicesgroup (seesrc/tessera_2600/core/plugin_api.py).
Then open a Pull Request to the official repository. General workflow:
- Fork the repository
- Create a feature branch (
git checkout -b feature/new-service-<key>) - Commit your changes (
git commit -m 'Add <service_key> descriptor') - Push to the branch (
git push origin feature/new-service-<key>) - Open a Pull Request
Legal Notice
This tool is for educational and legitimate OSINT purposes only. Users are responsible for complying with all applicable laws and regulations in their jurisdiction. The developers assume no liability for misuse.
Credits
- Pattern detection inspired by social-media-detector-api by yazeed44
License
GNU General Public License v3.0 or later (GPLv3+) โ see LICENSE for full text
Service model
Tessera uses a descriptorโonly model for services. Each service is defined by a JSON (or optional YAML) file under src/tessera_2600/services/descriptors/. No Python service classes are required for builtโin behavior.
Threading and Performance
The CLI runs sequentially by default for stability. You can enable conservative concurrency with the --threads (or -t) option:
Examples
- Auto (recommended based on selected services): omit the flag โ
tessera -n "+420 731x4x748" - Explicit threads:
tessera -n "+420 731x4x748" --threads 4
Notes
- Respect perโservice delays and consider proxies to improve reliability.
- If
--timeoutis not set, Tessera picks a recommended delay based on the selected services. - If
--threadsis not provided, Tessera picks a conservative maximum based on the selected services.
Troubleshooting
- Timeouts or connection errors: Increase
--timeoutor use proxies via--proxy-file. - Rate limits or CAPTCHA: Slow down, use proxies, and respect platform ToS. The tool will surface
[RATE LIMITED]or[BLOCKED]statuses when detected. - Invalid number pattern: Ensure it starts with a
+<countrycode>and usesxwildcards. Example:+420 731x4x748.
Declarative services only (JSON/YAML descriptors)
Tessera uses a descriptorโonly model for service integrations:
- Author a JSON descriptor in
src/tessera_2600/services/descriptors/and Tessera will load it at runtime.
Key points
- No new runtime deps: JSON is used for descriptors by default to avoid adding YAML libraries.
- Optional YAML: You can also author
.yaml/.ymldescriptors ifPyYAMLis installed (dev optional). If the library is not present, YAML files are ignored. - Uniform UX: Descriptors show up the same way for
--show-servicesand rate-limit summaries.
Minimal schema (JSON; YAML uses the same fields)
{
"schema_version": 1,
"service_key": "myservice",
"display_name": "My Service",
"description": "Example declarative service",
"requires_proxy": false,
"recommended_delay": 2,
"timeouts": { "request": 10 },
"rate_limits": { "rpm": 30 },
"endpoints": [
{
"name": "check",
"method": "POST",
"url": "https://example.com/api/check",
"headers": { "Content-Type": "application/x-www-form-urlencoded" },
"body": { "phone": "${phone}" },
"success_signals": [
{ "type": "status", "equals": 200, "weight": 1.0 }
],
"failure_signals": [
{ "type": "status", "equals": 404, "weight": 1.0 }
],
"retry": { "max_retries": 1, "backoff_ms": 500 }
}
]
}
How it works
- Descriptors are parsed into dataclasses (see
src/tessera_2600/core/descriptor_models.py). src/tessera_2600/core/declarative_service.pyexecutes the endpoints, evaluates success/failure signals, and produces the same legacy status strings ([FOUND],[NOT FOUND],[ERROR], etc.).- Confidence weights are scaled to 0..100 and compared against
config.CONFIRMATION_THRESHOLDto decide a positive match.
Add a new descriptor
- Create
src/tessera_2600/services/descriptors/<service_key>.jsonor.yamlusing the schema above. - Ensure
service_keyis unique and not already implemented in Python. - Run the CLI normally; the new service will be available by its
service_key.
Testing descriptors
- Unit tests should mock HTTP (
requests.Session.request) to avoid network usage. - See
tests/test_declarative_service.pyfor a minimal example.
Example YAML descriptor
- This repository ships both JSON (
src/tessera_2600/services/descriptors/seznamcz.json) and YAML (src/tessera_2600/services/descriptors/seznamcz.yaml) examples for Seznam.cz. JSON is loaded by default (no extra dependencies). YAML is illustrative and will be used only ifPyYAMLis installed.
Implementing a new service (step-by-step)
Add a service via descriptors (recommended for simple, single-request checks)
- Create a file under
src/tessera_2600/services/descriptors/<service_key>.json(or.yaml). - Use the minimal schema shown above. Important fields:
service_key: unique identifier (lowercase, no spaces), e.g.,myserviceoracmeus.display_name: human-friendly name shown in CLI (aliases are derived automatically).requires_proxyandrecommended_delay: influence CLI guidance and scheduling.endpoints: at least one HTTP request withmethod,url, optionalheaders, and signal rules:success_signals: e.g.,{ "type": "status", "equals": 200, "weight": 1.0 }failure_signals: same shape, used to cancel positives.
- Place
${phone}anywhere you want the current phone string substituted (query, headers, or body). - Run the CLI and verify the service is discovered:
tessera --show-services- Run with an explicit service list:
tessera -n "+420 731x4x748" --services <service_key>
Notes on naming and resolution
- Users can refer to a service by
service_key, bydisplay_name(case-insensitive), or by a simplified variant (punctuation removed). For keys likeseznamcz, the tool also mapsseznamas a convenience. - Choose a clear
display_nameand conciseservice_keyto improve discoverability.
Descriptor file precedence and duplicates
- If both
<name>.jsonand<name>.yaml/<name>.ymlexist, Tessera prefers the JSON descriptor. - YAML descriptors are only considered if
PyYAMLis installed; otherwise they are ignored. - When duplicates are present, Tessera logs a warning and surfaces the selected file in CLI output.
- The
--show-servicestable includes a โDescriptorโ column that shows the exact filename (including extension) that was loaded for each service. The same table is printed after the banner at startup.
Testing a descriptor
- Unit tests should mock HTTP I/O. See
tests/test_declarative_service.pyfor an example using@patch("requests.Session.request").
Practical tips
- Set realistic
recommended_delayandrequires_proxyto avoid bans; descriptors expose these directly. - Keep HTTP headers conservative and rotate proxies where appropriate (see
core/proxy_manager.py). - For internationalization or multiple regional variants, encode regions in
service_key(e.g.,acmeus,acmeuk) and rely on the built-in alias normalization.
Project details
Release history Release notifications | RSS feed
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 tessera_2600-1.0.0.tar.gz.
File metadata
- Download URL: tessera_2600-1.0.0.tar.gz
- Upload date:
- Size: 69.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5166bac058bbc9aad9ef1f64f949802bf3cb3fe2a1af94ea48e95115154807a3
|
|
| MD5 |
2dea79f792e939394a528208dab2e186
|
|
| BLAKE2b-256 |
0d58a62a85c7822ebb90f936a223ca71a9ddf168f788e867ed910c4d6a5ecd6d
|
File details
Details for the file tessera_2600-1.0.0-py3-none-any.whl.
File metadata
- Download URL: tessera_2600-1.0.0-py3-none-any.whl
- Upload date:
- Size: 70.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f39f0d3867f6698dbad29df90aee2d582b5cc55558cc6f9296ae0d14e9a07945
|
|
| MD5 |
4aefa874e1b5a820b36c442879cd2e36
|
|
| BLAKE2b-256 |
84774f0babd5647500fb7eaf0eed70c8e8129b5ff085167cfd936c0d546067b8
|