Wie Reuse arbeitet
Verhalten, Schnittstellen und die Entscheidungen dahinter. Das Programm selbst bleibt Closed Source: was hier an Code steht, ist ausschliesslich das, was du eingibst.
Medien-Scraper
Adresse einwerfen, Tiefe wählen, scannen. Zurück kommt eine sortierbare Liste mit Typ, Grösse und Auflösung, und zwar schon, während der Scan noch läuft.
Seiten, die nachladen
Mit eingeschaltetem JavaScript-Rendering findet der Scanner auch Medien, die im Quelltext gar nicht stehen. Drei Bauarten werden erkannt:
- Lazy Loading: die Seite wird in Schritten durchgescrollt, damit die Beobachter am Viewport auslösen.
- Endlos-Scroll: am Seitenende wird gewartet, bis neue Blöcke da sind.
- „Mehr laden“-Knöpfe: werden an Beschriftung und Klassennamen erkannt und gedrückt.
Schluss ist, wenn zwei Runden nacheinander nichts Neues bringen, nach einer einstellbaren Zahl Durchgänge oder wenn die Zeitgrenze je Seite erreicht ist. Bei einem Endlos-Feed bestimmen diese Zahlen, wo Schluss ist; ohne sie liefe der Scan ewig.
Auflösungen, ohne eine Datei zu laden
Ein Hintergrundlauf liest von jeder Datei nur den Dateikopf, 64 KB per Range-Anfrage. Daraus kommen Breite, Höhe und die Frage, ob sich etwas bewegt. Die Liste bekommt so eine Spalte „Auflösung“, ohne dass eine einzige Datei vollständig geholt wird.
- PNG, JPEG, GIF, WebP und BMP, reine Kopf-Analyse ohne Bildbibliothek.
- Videos zählen mit: bei MP4 und MOV stehen die Masse im Kopfblock. Liegt der Index am Dateiende statt vorn, holt der Scanner zusätzlich die letzten 256 KB.
- Ein animiertes WebP ist der Sache nach ein GIF und wandert automatisch dorthin, ebenso APNG. Unter „Bilder“ stehen dann wirklich nur Standbilder.
Smart Cache
Gemerkt werden zwei Dinge: was auf einer Seite gefunden wurde und welche Auflösung jede Datei hat. Beim nächsten Scan derselben Adresse steht die Liste sofort da, mit Altersangabe. Der Scan läuft dahinter weiter und ersetzt sie. Der Speicher überbrückt die Wartezeit, er ersetzt den Scan nicht.
Gemessen an einer Seite mit 40 Dateien: 40 Abrufe beim ersten Lauf, 0 beim zweiten. Behalten werden 150 Seiten und 60 000 Auflösungen, Einträge älter als 30 Tage fallen beim Laden weg. Ausgeschaltet wird nicht mehr gelesen, aber weiter geschrieben.
Herunterladen mit Wiederaufnahme
- Dateien
- werden als Teilstück geschrieben und erst am Ende an ihren Platz gelegt. Beim zweiten Versuch wird per
Range: bytes=…-nach dem Rest gefragt. Antwortet der Server nicht mit206, kann er es nicht, dann wird von vorn geladen statt eine Datei aus zwei Anfängen zu bauen. - Streams
- laufen mit Fortsetzung: die Zwischendatei bleibt beim Abbruch liegen und wird weitergeführt. Ein Abbruch bei Minute 40 heisst nicht mehr, wieder bei null anzufangen.
- Ohne Wartezeit
- Wiederholtes wird in den laufenden Schwung eingereiht, während die übrigen weiterladen.
- Aufräumen
- Was länger als sieben Tage als Teilstück liegt, wird beim nächsten Download weggeräumt.
Videos
Chromium kommt ohne proprietäre Codecs, ein <video> mit H.264 bliebe im eingebauten Browser schwarz. Videos laufen deshalb über einen eigenen Player mit FFmpeg-Backend für H.264, H.265, AAC und MP3. Wehrt sich ein Server gegen direktes Streamen, holt der Player die ersten paar Megabyte und zieht daraus ein Standbild aus Sekunde 3, damit man sieht, worum es geht, bevor man lädt.
Lead-Recherche
Branche, Ort, Land und Anzahl eingeben. Heraus kommt eine Liste mit Firmenname, Adresse, Telefon, E-Mail, Webseite, echter Bewertung und einem Score mit Begründung.
Tempo und Menge
Gemessen an „Baugewerbe / Handwerk“ in Zürich, 120 angeforderte Leads:
| vorher | nachher | |
|---|---|---|
| gefundene Firmen | 31 | 120 |
| Dauer | 26,0 s | 23,5 s |
| Zeit je Firma | 0,84 s | 0,20 s |
Derselbe Lauf mit einem Thread gegen sechzehn: 75,2 s auf 23,5 s bei identischem Ergebnis. Jeder Thread bekommt eine eigene HTTP-Sitzung.
Quellen
Gearbeitet wird von oben nach unten. Sobald genug Firmen zusammen sind, hört die Suche auf, die späteren Quellen kosten also nichts, solange die früheren liefern.
| Quelle | Länder | Reihe | Besonderheit |
|---|---|---|---|
| Verzeichnisse CH | CH | 10 · 20 | Bewertung, Adresse und Telefon direkt aus der Trefferkarte |
| Verzeichnisse DE | DE | 10 bis 24 | vier Portale, seitenweise gelesen |
| Verzeichnis AT | AT | 10 | weicht auf die Region aus, wenn die Stadt keinen eigenen Pfad hat |
| Google Places | weltweit | 40 aus | braucht einen eigenen Schlüssel und kostet Geld |
| OpenStreetMap | weltweit | 60 | strukturiert statt geparst, ODbL-lizenziert |
| Web-Index | weltweit | 90 · 95 | Auffangnetz, verwirft Ranglisten und Portale |
OpenStreetMap liefert als einzige Quelle strukturiert statt geparst: Telefon, E-Mail, Webseite und Adresse stehen dort als Felder. Dafür kennt sie keine Bewertungen, und bei vielen Einträgen fehlen Kontaktdaten. Deshalb darf sie höchstens 60 % des Kontingents belegen; der Überhang wird zurückgestellt und am Ende nachgereicht, falls Platz bleibt.
Firmen-Webseiten auslesen
Nach dem Verzeichnis wird die Webseite der Firma geöffnet, denn im DACH-Raum steht die E-Mail fast immer auf einer Kontakt- oder Impressumsseite. Die Kandidaten werden aus den Links der Startseite gefiltert statt geraten: je Gruppe ein Link, und zwar der mit dem kürzesten Pfad. Abgebrochen wird, sobald E-Mail und Telefon stehen, real sind das knapp zwei Abrufe je Firma statt der erlaubten vier.
Verschleierte Adressen werden aufgelöst, soweit die Kodierung bekannt ist: name (at) firma [dot] ch, HTML-Entities, verbreitete Verschlüsselungen von Content-Delivery-Anbietern, umgekehrter Text und aus Skript-Bruchstücken zusammengesetzte Adressen. Das geschieht ohne JavaScript auszuführen, die Zeichenkettenteile werden nur aneinandergelegt.
Der wichtigste Filter ist der Domainabgleich. Im Impressum steht regelmässig „Umsetzung: agentur.ch, info@agentur.ch“. Ohne diese Prüfung landet die Agenturadresse als Firmenkontakt, und man schreibt seinen Mitbewerber an. Ebenso fliegen Baukasten- und Hoster-Adressen raus, und info@ wird vor webmaster@ einsortiert.
Score mit Begründung
Jeder Lead bekommt einen Wert von 0 bis 100 und eine Herleitung. Eine Zahl ohne Begründung wäre genau die Schätzung, die dieses Programm sonst überall vermeidet.
+30 keine Website gefunden
+20 nicht mobiltauglich (kein Viewport-Meta)
+15 kein HTTPS
+5 E-Mail vorhanden
═══════════════════════════════════════
70 von 100Zwei Profile lassen sich über der Liste umschalten: Webdesign-Akquise (keine, defekte oder veraltete Website zählt hoch) und Kaltakquise (vollständige Kontaktdaten zählen hoch). Das Umschalten kostet keinen einzigen Abruf, denn die Signale liegen im Lead und gewichtet wird erst beim Anzeigen.
Drei Regeln halten das ehrlich:
- Wurde eine Website nicht geprüft, wird über ihre Technik nichts behauptet, weder gut noch schlecht.
- Bei Baukästen wird „nicht mobiltauglich“ unterdrückt, denn die sind ausnahmslos responsiv; ein fehlendes Meta wäre dort ein Messfehler.
- Über das Copyright-Jahr wird nur geurteilt, wenn eines im Quelltext steht. Viele Seiten setzen es per JavaScript, daraus „veraltet“ zu folgern wäre eine Erfindung.
Nur neue Firmen
Läuft dieselbe Suche ein zweites Mal, werden alle Firmen übersprungen, die frühere Durchgänge schon gefunden haben. Übersprungene belegen dabei kein Kontingent: wer 25 will, bekommt 25 neue, die Suche blättert dafür von selbst weiter.
Durchgang 1: 25 Firmen
Durchgang 2: 25 NEUE Firmen, 27 bereits bekannte übersprungen
keine einzige Überschneidung mit Durchgang 1Wiedererkannt wird nicht nur am Namen, sonst wären „Müller AG“, „MÜLLER AG“ und „Mueller AG“ drei Firmen. Es zählen ausserdem die Telefonnummer ohne Landesvorwahl, die Domain der Webseite und die E-Mail-Adresse. Stimmt eines davon überein, ist es dieselbe Firma.
Höflichkeit und Sperren
Bis zu 32 Threads gegen dasselbe Verzeichnis sind IP-Bann-Gebiet. Deshalb hält die App einen Mindestabstand je Host: der Platz in der Schlange wird unter dem Schloss reserviert, gewartet wird ausserhalb. So stellen sich viele Threads geordnet an, statt gemeinsam loszurennen.
| Zieltyp | Mindestabstand | Grund |
|---|---|---|
| Verzeichnisse | 0,4 s | tolerant, aber nicht grenzenlos |
| Suchmaschinen | 1,5 s | reagieren am schnellsten mit Prüfseiten |
| Karten-Abfragedienst | 3,0 s | freiwillige Infrastruktur |
| Ortsauflösung | 1,1 s | Vorgabe der Nutzungsbedingungen |
| Firmen-Webseiten | kein Takt | jeder Host wird genau einmal berührt |
Eine Schutzmassnahme wird nie umgangen. Auf 403, 429 oder eine Prüfseite folgt kein Nachdrücken, sondern Zurückweichen: langsamer werden, Ausgang wechseln, notfalls die Quelle für diesen Durchgang ruhen lassen. Es wird kein Captcha gelöst.
Bewertungen
Es werden keine Werte geschätzt. Eine Bewertung erscheint nur, wenn sie auf der Quellseite steht. Gesucht wird zuerst im Anbieter-Markup der Trefferkarte, dann in schema.org/aggregateRating auf der Detailseite, zuletzt auf der Firmen-Webseite. Anzahl und Quelle werden mitgeführt und stehen in jedem Export.
Eingebauter Browser
Echtes Chromium, im Aufbau nah an Chrome, aber in der Formensprache der App. Er ist kein Vorschaufenster, sondern der Browser, in dem alles landet: Links aus der Lead-Liste, Karten, Vorschauen, target="_blank".
- Tabs
- eigene Leiste über der Werkzeugleiste, aktiver Tab in deren Farbe. Verschiebbar, mittlere Maustaste schliesst.
- Omnibox
- eine Pille aus Sicherheitssymbol, Eingabe und Blocker-Schild mit Zähler. Eine Eingabe ohne Punkt wird zur Websuche.
- Suchmaschine
- DuckDuckGo, Google, Bing, Startpage oder Brave, dazu eine eigene Startseite.
- Profil
- bleibt bestehen, Logins und Cookies überleben einen Neustart. Wahlweise auch gar nicht speichern.
- Datenschutz
- „Do Not Track“-Header, Drittanbieter-Cookies blockieren, JavaScript und Bilder einzeln abschaltbar.
- Aufräumen
- Browserdaten löschen kennt Zeiträume von „letzte Stunde“ bis „gesamte Zeit“ und räumt wahlweise Verlauf, Cookies, Cache, Download-Liste und besuchte Links.
Werbe- und Trackerblocker
Vier Kategorien, einzeln zuschaltbar. Der Abgleich läuft über den Host und alle übergeordneten Domains, damit eine Unterdomain genauso greift wie die Hauptdomain.
| Kategorie | Domains | Beispiele |
|---|---|---|
| Werbung | 82 | doubleclick.net, googlesyndication.com, criteo.com |
| Tracker & Analyse | 71 | google-analytics.com, hotjar.com, clarity.ms |
| Social-Widgets | 18 | connect.facebook.net, analytics.tiktok.com |
| Krypto-Mining | 11 | coinhive.com, cryptoloot.pro, authedmine.com |
Nur Drittanbieter ist der Standard: Anfragen an die eigene Domain der Seite bleiben unangetastet, deshalb zerbrechen Seiten nicht. Ein Cosmetic-Filter blendet leere Werbeflächen aus, eigene Regeln und Ausnahmen pro Seite kommen dazu.
Erweiterungen
Klarstellung vorweg: die verwendete Engine enthält Chromiums Extension-Subsystem nicht. .crx-Dateien aus dem Chrome Web Store lassen sich damit nicht laden. Das ist eine Grenze der Engine, keine Bequemlichkeit.
Umgesetzt sind Userscripts im Greasemonkey-Format. Eine .js-Datei in den Erweiterungsordner legen, fertig:
// ==UserScript==
// @name Mein Skript
// @description Was es tut
// @version 1.0
// @match *://*.example.com/*
// @exclude *://example.com/admin/*
// @run-at document-end
// ==/UserScript==
(function () {
document.querySelectorAll("article").forEach(function (el) {
el.style.maxWidth = "72ch";
});
})();Ohne @match läuft ein Skript überall. Jede Zeile im Panel hat einen Schalter und eine Pinnadel; Angeheftetes bekommt ein eigenes Symbol neben dem Puzzle-Symbol, genau wie in Chrome.
Tastenkürzel
| Kürzel | Wirkung |
|---|---|
| Strg + 1 bis 4 | Medien, Leads, Browser, MCP |
| Strg + B | Seitenleiste ein- und ausklappen |
| Strg + P | Proxy-Steuerfenster |
| Strg + E | Erweiterungs-Panel |
| Strg + T / W | Tab öffnen und schliessen |
| Strg + H / J | Verlauf und Downloads |
| Alt + ← · F5 | zurück und neu laden |
MCP-Server
Die App bringt einen MCP-Server mit, an den sich Claude Code und andere MCP-Clients hängen können. Der Reiter zeigt einen fertigen Befehl zum Kopieren.
claude mcp add --transport http reuse http://127.0.0.1:8765/mcp \
--header "Authorization: Bearer <Token>"Der Reiz liegt nicht darin, dass ein Modell Webseiten abrufen kann, das kann es selbst. Sondern darin, wie: hier rendert ein echtes Chromium mit ausgeführtem JavaScript, durch den Proxy-Pool, mit aktivem Blocker und den Anmeldungen aus dem Browserprofil.
Freigaben
Der Server ist aus, und keine Gruppe ist vorausgewählt. Änderungen greifen sofort, auch bei laufendem Server: ein Werkzeug aus einer gesperrten Gruppe erscheint gar nicht erst in der Liste, und ruft ein Client es trotzdem auf, bekommt er eine Absage mit Begründung.
| Gruppe | Werkzeuge | Eingriff |
|---|---|---|
| Seiten lesen und rendern | render_page, render_html | liest |
| Lead-Recherche | find_leads | liest |
| Medien finden | scan_media | liest |
| Proxys | proxy_status, proxy_rotate | liest |
| Dateien speichern | download_media, export_leads | schreibt auf die Platte |
| Browser steuern | browser_open, browser_click, browser_eval und weitere | handelt in deinem Namen |
Jeder Zugriff steht im Protokoll des Reiters, mit Zeitpunkt, Werkzeug und Ergebnis.
Sicherheit
Gebunden ausschliesslich an 127.0.0.1, jede Anfrage braucht das Token aus dem Reiter, fremde Origin-Angaben werden abgewiesen. Aus dem Netz ist der Server nicht erreichbar. Das Token lässt sich jederzeit neu erzeugen, verbundene Clients müssen sich dann neu anmelden.
Warum es kein Screenshot-Werkzeug gibt
Die Engine reicht den Seiteninhalt am Zeichenpuffer vorbei direkt an den Compositor, ein Abgreifen liefert deshalb ein leeres Bild. Geprüft wurde das mit unsichtbarer Ansicht, ausserhalb des Bildschirms, mit Deckkraft 0 und mit einem sichtbaren Tab, überall einfarbig. Ein Werkzeug, das mal ein leeres Bild zurückgibt, wäre schlechter als keines. render_html liefert dafür das fertige DOM nach dem JavaScript.
Proxy-Pool
Ein eigenes kleines Fenster über dem Hauptfenster, damit man während einer laufenden Suche umstellen kann, ohne die Seite zu verlassen. Erreichbar über Strg+P, das Umweg-Symbol auf der Leads-Seite oder dasselbe Symbol in der Browserleiste.
Zustand
198.51.100.20:6754:benutzer:geheim host:port:user:pass
198.51.100.20:6754 host:port
benutzer:geheim@198.51.100.20:6754 user:pass@host:port
198.51.100.20:6754@benutzer:geheim host:port@user:pass
benutzer:geheim:198.51.100.20:6754 user:pass:host:port
socks5://198.51.100.20:1080 mit Schema (http/https/socks4/socks5)Statt Doppelpunkt gehen auch Semikolon oder Leerzeichen, Passwörter dürfen selbst Doppelpunkte enthalten. Nicht erkannte Zeilen bleiben im Eingabefeld stehen, statt still verworfen zu werden.
- Rotation
Aus,Fest(immer der erste funktionierende),Rotierend(reihum) oderZufällig. Die Wahl passiert pro Anfrage, der Medien-Scanner verteilt seine Seitenaufrufe also über den Pool.- Statusprüfung
- „Alle prüfen“ testet parallel und zeigt Erreichbarkeit, Latenz und Exit-IP je Eintrag. Wer dreimal hintereinander scheitert, gilt als defekt und wird übersprungen.
- Browser
- optional zuschaltbar. Die Engine kennt nur einen anwendungsweiten Proxy, Rotation greift dort deshalb erst bei der nächsten Navigation.
- Statusleiste
- Auf der Leads-Seite steht jederzeit, worüber gesucht wird:
4 Proxys · rotierend · 3 geprüft, oder ebenProxys aus, direkte Verbindung.
Der Schalter behauptet nichts Falsches. Ohne hinterlegten Proxy bleibt er auf „Aus“ und nennt den Grund, statt „An“ zu zeigen, während in Wahrheit direkt verbunden wird.
Eigenes VPN
Der VPN-Schaltraum arbeitet gegen WireGuard, und zwar gegen einen eigenen Server statt gegen einen Dienstleister. Ein Klick, und der gesamte Verkehr des Rechners geht durch den Tunnel.
Ausgang: deine eigene Adresse
Frankfurt am Main · DE38 MB / 20 GB
≤ 50 Mbit/s
Der Zustand wird gelesen, nicht behauptet
Abgefragt wird, wann der letzte Handschlag war und wie viele Bytes durch sind. Daraus ergeben sich drei Zustände von selbst:
- Aus
- kein Tunneldienst vorhanden.
- Verbindet
- ein Dienst läuft, aber es gab noch keinen Handschlag.
- Verbunden
- frischer Handschlag. Erst dann steht es auch im Ring.
Deshalb steht im Ring nie „Verbunden“, wenn nichts verbunden ist: es gibt schlicht keinen Weg, das zu behaupten. Der Tunneldienst überlebt das Programm, damit die Verbindung nicht am Fenster hängt. Beim Start erkennt das Fenster einen bereits laufenden Tunnel und übernimmt ihn.
Verbrauch und Tempo je Gerät
Die Tagesmenge wird hart durchgesetzt, denn WireGuard zählt je Schlüssel. Tempolimits setzt der Server je Peer, der Client per Rechtsklick auf den Tunnel.
Tempolimits wirken immer nur ausgehend. Windows hat keine Warteschlange für Ankommendes; was es hat, greift vor der eigenen Netzwerkkarte, und dort liegt nur, was hinausgeht. Auf dem Server bremst das den Download des Peers, im Client den eigenen Upload. Wer seinen Download begrenzen will, muss es dem Server sagen. Die Tagesmenge hat diese Einschränkung nicht.
Einrichtung über Einmal-Links
Statt Konfigurationsdateien herumzuschicken, erzeugt der Server verschlüsselte Einmal-Links. Auf der Einladungsseite steht ein Knopf „Auf diesem PC einrichten“, der mit dieser App spricht; dafür öffnet sie einen Zuhörer auf 127.0.0.1.
Der Zuhörer ist aus, bis man ihn einschaltet, geht nach 15 Minuten von selbst wieder aus und schliesst nach der ersten angenommenen Einladung sofort. Gefragt wirst immer du, und die Frage nennt die Herkunft der Seite und den Ausgang, in den der Tunnel führen würde. Von selbst geschieht nichts. Wer nur WireGuard hat, nimmt weiterhin die Datei.
Warum der Umweg: WireGuard für Windows registriert weder ein URL-Schema noch die Endung .conf, eine Webseite hat also keinen Weg hinein. Nachgesehen, nicht vermutet.
Technische Daten
- Plattform
- Windows 10 und 11, 64 Bit. Das Setup bringt alles mit, beim Empfänger muss nichts vorinstalliert sein und es braucht keine Administratorrechte.
- Oberfläche
- Qt, rahmenlose Fenster mit eigener Griffleiste. Alle Vektor-Symbole werden zur Laufzeit in der Themenfarbe gerendert.
- Browser-Engine
- eingebettetes Chromium mit eigenem, dauerhaftem Profil.
- Video
- eigener Player mit FFmpeg-Backend für H.264, H.265, AAC und MP3.
- Themen
- dunkel und hell, vollständig aus einem Token-Satz erzeugt. Es gibt keine hartkodierte Farbe im Programm.
- Nebenläufigkeit
- Hintergrund-Threads melden sich über Signale zurück, die Oberfläche blockiert nie. Die Threadzahl ist einstellbar und gilt für Medien- und Lead-Suche.
- Speicherorte
- Einstellungen, Suchverlauf und Erweiterungen liegen im Benutzerprofil, das Browserprofil daneben. In den Programmordner wird nie geschrieben.
- Netzwerk
- Alle Abrufe gehen wahlweise durch den Proxy-Pool. Es gibt keinen Rückkanal: keine Telemetrie, keine Kontopflicht, keine Nutzungsstatistik.
Das Programm ist Closed Source. Diese Seite beschreibt Verhalten, Schnittstellen und die Entscheidungen dahinter. Aller Code hier ist das, was du selbst eingibst: Anbindungsbefehle, Userscript-Köpfe, Proxy-Zeilen.
Bekannte Grenzen
Kein Programm kann alles, und ein Prospekt, das nur Stärken kennt, hilft niemandem bei der Entscheidung.
- Chrome-Erweiterungen
- crx-Pakete gehen nicht, die Engine hat kein Extension-Subsystem. Userscripts decken den Grossteil der Fälle ab.
- VPN braucht einen Server
- Es ist kein Abo, sondern die Gegenstelle zu einem WireGuard-Server, den du selbst betreibst.
- Tempolimits
- wirken nur ausgehend. Zwei Geräte hinter demselben Anschluss sind serverseitig ausserdem nicht zu trennen.
- Kein Screenshot über MCP
- Die Engine gibt den fertigen Bildinhalt nicht heraus. Statt eines Werkzeugs, das manchmal Leeres liefert, gibt es gar keines.
- Bewertungsabdeckung
- hängt an der Quelle. Verzeichnisse liefern viel, reine Web-Index-Treffer meist gar nichts; dort bleibt die Spalte leer statt geraten.
- Web-Index
- liefert wenig, dafür Echtes. Ranglisten und Portale fliegen raus, bei manchen Suchbegriffen bleiben nur ein paar Treffer übrig.
- Karte
- braucht Internet. Adressen werden über OpenStreetMap geokodiert, ohne Treffer bleibt die Karte frei beweglich und sagt das auch.