---
title: "Offlinery Fallstudie"
canonical: https://wavect.io/de/case-studies/offlinery/
language: de
description: "Offlinery war eine Dating-App gegen die Swipe-Kultur: ein Algorithmus zeigte Menschen in der Nähe, die sich wirklich treffen wollten. 2025 eingestellt."
image: "https://wavect.io/img/general/bak/open_graph_preview.jpg"
---

[← Alle Fallstudien](/de/case-studies/)

![Offlinery logo](/img/clients/bak/offlinery.png)

CASE STUDIES · 2024-2025

Offlinery

# Echtzeit-, Subsekunden-Matching auf feindlichen Mobile-OSes, end-to-end gebaut.

Offlinery war eine Dating-App gegen die Swipe-Kultur. Ein proprietärer Algorithmus zeigte Menschen in der Nähe an, die sich wirklich persönlich treffen wollten. Veröffentlicht für iOS und Android. 2025 eingestellt.

AI Fullstack-Entwicklung 2024-2025 Eingestellt

Auf einen Blick

Auftragsart Fullstack-Entwicklung

Branche Mobile / Echtzeit-Geo

Phase Pre-Seed

Jahr 2024-2025

Stack

React Native / Expo NestJS TypeORM Typescript Firebase Sentry

Status Eingestellt

Live [github.com/wavect/offlinery](https://github.com/wavect/offlinery)

## Überblick

Offlinery war eine Dating-App gegen die Swipe-Kultur. Ein proprietärer Algorithmus zeigte Menschen in der Nähe an, die sich wirklich persönlich treffen wollten. Veröffentlicht für iOS und Android. 2025 eingestellt.

## Was ist die Herausforderung?

Die richtige Person in der Nähe innerhalb eines Minutenfensters anzeigen, damit eine echte Begegnung stattfindet. Zwei sich verstärkende Constraints: ein proprietärer Algorithmus für Subsekunden-Proximity und Mutual-Intent-Filterung, und Zuverlässigkeit gegen iOS und Android, die Background-Tasks killen, sobald sie das Interesse verlieren.

## Welche Entscheidung haben wir getroffen?

### Kontinuierliche, präzise Ortung, bei gesperrtem Bildschirm.

> Kontinuierliche, präzise Ortung von einem gesperrten Telefon ist brutal. Das OS schaltet Hintergrundprozesse zum Akkusparen ab. Das Datenschutzmodell nervt den Nutzer genau dann, wenn Matching feuern muss. Bleib genau gegen ein OS, das dich aktiv unterdrückt, und halte die Prompts ehrlich genug, dass Nutzer weiter Ja sagen.

## Was wir gemacht haben

Beide Phone-OSes unterdrücken Echtzeit-Matching aktiv. Wir haben jede Schicht um bewegungsgetriebene Trigger, intelligentes Deferral und Graceful Degradation gebaut. Fallback-Pfad bereit, bevor das OS dagegenhält. Proprietäre Proximity-Engine auf PostGIS. React Native + Expo mit gehärteter Background-Geolocation, Push, Error-Tracking, i18n. NestJS + TypeORM Backend mit JWT, Throttling, transaktionalen Mails und Expo-Push. Vollständige App-Store- und Play-Store-Releases. Subsekunden-Proximity auf einem bewegten Telefon, auf Hardware, die nicht kooperieren wollte.

## Ergebnisse

### Echtzeit - Proprietäre Matching-Engine
- **Category:** Skalierung

### Subsekunde - Proximity-Queries
- **Category:** Skalierung

Ähnliche Ergebnisse für dein Projekt?

Fester Umfang. Feste Deadline. Unterzeichneter Werkvertrag.

[Kontakt aufnehmen](/de/contact/)

## On Reel

![In-App-Demo.](/img/yt/mNqTMDJxd-A.jpg?v=9a42d13ee9be) In-App-Demo.

## Ausgewählte Screens

![Offlinery Screenshot 1](/img/case-studies/offlinery/001_hu_a987c7fb34c20161.webp)

![Offlinery Screenshot 2](/img/case-studies/offlinery/002_hu_45ffadc04493dd16.webp)

![Offlinery Screenshot 3](/img/case-studies/offlinery/003_hu_c2f7956f79790f80.webp)

![Offlinery Screenshot 4](/img/case-studies/offlinery/004_hu_2957c12d699ae59c.webp)

![Offlinery Screenshot 5](/img/case-studies/offlinery/005_hu_47be90ea2357aec6.webp)

![Offlinery Screenshot 6](/img/case-studies/offlinery/006_hu_63b7b7dbb80cb777.webp)

![Offlinery Screenshot 7](/img/case-studies/offlinery/007_hu_8eb3c450ae8da0a0.webp)

![Offlinery Screenshot 8](/img/case-studies/offlinery/008_hu_ca9b7bbd14ca4f82.webp)

## Architecture & Flows

### Produktionsinfrastruktur

Backend, Postgres+PostGIS, Analytics und Logs auf Google Cloud. Waitlist auf Vercel. Sentry fürs Crash-Reporting, MailChimp für transaktionale Mails.

Das Diagramm zeigt eine vereinfachte High-Level-Architektur und lässt vertrauliche Implementierungs- und Sicherheitsdetails aus.

### Match-Notification-Flow

```
sequenceDiagram
  autonumber
  participant U as User App
  participant API as NestJS API
  participant DB as PostGIS
  participant N as Expo Push
  U->>API: location heartbeat
  API->>DB: find nearby candidates
  DB-->>API: matches (geo + filters)
  API->>N: notify both users
  N-->>U: silent push
```

Heartbeat → Proximity-Query → Mutual Push. Background-Geolocation treibt den Loop; die API bleibt stateless.

## Was wir gelernt haben

Echtzeit-Personenmatching lebt und stirbt mit Signalen, die das OS aktiv tötet. Die Arbeit ist zur Hälfte Algorithmus, zur Hälfte Plattform-Kampf. Bewegungsgetriebene Trigger, intelligentes Deferral, Graceful Degradation, Fallbacks bei gekappter Genauigkeit. Auf einem bewegten Telefon sind Speed und Resilienz dasselbe Problem.

## Tech Stack

- [React Native / Expo](https://expo.dev/)
- [NestJS](https://nestjs.com/)
- [TypeORM](https://typeorm.io/)
- [Typescript](https://www.typescriptlang.org/)
- [Firebase](https://firebase.google.com/)
- [Sentry](https://sentry.io/)

## Tags

- KI / Matching
- Echtzeit-Geo
- Mobile App

## Links & Ressourcen

[GitHub-Repository](https://github.com/wavect/offlinery)

Passende Leistungen

- [Mobile-App-Entwicklung](/de/services/mobile-apps/)
- [KI-Agenten & Produkte](/de/services/artificial-intelligence/)
- [Individuelle Softwareentwicklung](/de/services/software-development/)

Kundenreferenzen und Marken

Wavect veröffentlicht diese Case Studies über die eigene Arbeit. Kundennamen, Logos und Marken sind Eigentum ihrer jeweiligen Inhaber und stehen hier zur Kennzeichnung der Arbeit, nicht als Hinweis auf eine Partnerschaft, ein Sponsoring oder eine Empfehlung. Jede Case Study beschreibt Wavects eigenen Beitrag innerhalb eines größeren Vorhabens. Am Ergebnis waren weitere Beteiligte mit, darunter die eigenen Teams der Kunden sowie andere Dienstleister. Zahlen, die einem Kunden zugeschrieben werden, sind dessen eigene Angaben. Zahlen zu unserer Arbeit stammen aus unseren Aufzeichnungen zum angegebenen Prüfdatum, und wir liefern Belege auf Anfrage. Bewertungen sind von der jeweils genannten Plattform übernommen und verlinken auf die Quelle. Die kommerziellen Bedingungen einer Zusammenarbeit veröffentlichen wir nicht, und Produkt-Screenshots bleiben Eigentum des jeweils gezeigten Kunden. Wenn du hier genannt wirst und eine Korrektur, eine Änderung oder eine Löschung möchtest, schreib uns, und wir kümmern uns darum: [office@wavect.io](mailto:office@wavect.io)

### [PromptID](/de/case-studies/promptid/)

PromptID ist eine AI-native EdTech-Plattform für Arbeitgeber und Universitäten. Sie prüft Lernende, indem sie den Gedankengang analysiert, statt Auswendiglernen …

## Structured Data

```json
{
  "@context": "https://schema.org",
  "@graph": [
    {
      "@id": "https://wavect.io/#organization",
      "@type": [
        "Organization",
        "ProfessionalService",
        "LocalBusiness"
      ],
      "employee": [
        {
          "@id": "https://wavect.io/team/kevin-riedl/#person",
          "@type": "Person",
          "jobTitle": "Managing Director",
          "name": "Kevin Riedl",
          "url": "https://wavect.io/team/kevin-riedl/",
          "worksFor": {
            "@id": "https://wavect.io/#organization",
            "@type": [
              "Organization",
              "ProfessionalService",
              "LocalBusiness"
            ]
          }
        },
        {
          "@id": "https://wavect.io/team/christof-jori/#person",
          "@type": "Person",
          "jobTitle": "Managing Director",
          "name": "Christof Jori",
          "url": "https://wavect.io/team/christof-jori/",
          "worksFor": {
            "@id": "https://wavect.io/#organization",
            "@type": [
              "Organization",
              "ProfessionalService",
              "LocalBusiness"
            ]
          }
        }
      ],
      "founder": [
        {
          "@id": "https://wavect.io/team/kevin-riedl/#person",
          "@type": "Person",
          "jobTitle": "Managing Director",
          "name": "Kevin Riedl",
          "url": "https://wavect.io/team/kevin-riedl/",
          "worksFor": {
            "@id": "https://wavect.io/#organization",
            "@type": [
              "Organization",
              "ProfessionalService",
              "LocalBusiness"
            ]
          }
        },
        {
          "@id": "https://wavect.io/team/christof-jori/#person",
          "@type": "Person",
          "jobTitle": "Managing Director",
          "name": "Christof Jori",
          "url": "https://wavect.io/team/christof-jori/",
          "worksFor": {
            "@id": "https://wavect.io/#organization",
            "@type": [
              "Organization",
              "ProfessionalService",
              "LocalBusiness"
            ]
          }
        }
      ],
      "legalRepresentative": [
        {
          "@id": "https://wavect.io/team/kevin-riedl/#person",
          "@type": "Person",
          "jobTitle": "Managing Director",
          "name": "Kevin Riedl",
          "url": "https://wavect.io/team/kevin-riedl/",
          "worksFor": {
            "@id": "https://wavect.io/#organization",
            "@type": [
              "Organization",
              "ProfessionalService",
              "LocalBusiness"
            ]
          }
        },
        {
          "@id": "https://wavect.io/team/christof-jori/#person",
          "@type": "Person",
          "jobTitle": "Managing Director",
          "name": "Christof Jori",
          "url": "https://wavect.io/team/christof-jori/",
          "worksFor": {
            "@id": "https://wavect.io/#organization",
            "@type": [
              "Organization",
              "ProfessionalService",
              "LocalBusiness"
            ]
          }
        }
      ],
      "name": "Wavect GmbH",
      "subjectOf": {
        "@id": "https://wavect.io/verified-claims.json#dataset",
        "@type": "Dataset",
        "name": "Wavect verified publication claims",
        "url": "https://wavect.io/verified-claims.json"
      },
      "url": "https://wavect.io/"
    },
    {
      "@id": "https://wavect.io/team/kevin-riedl/#person",
      "@type": "Person",
      "jobTitle": "Managing Director",
      "name": "Kevin Riedl",
      "sameAs": [
        "https://www.wikidata.org/wiki/Q139796365",
        "https://www.linkedin.com/in/wsdt",
        "https://github.com/wsdt"
      ],
      "url": "https://wavect.io/team/kevin-riedl/",
      "worksFor": {
        "@id": "https://wavect.io/#organization",
        "@type": [
          "Organization",
          "ProfessionalService",
          "LocalBusiness"
        ]
      }
    },
    {
      "@id": "https://wavect.io/team/christof-jori/#person",
      "@type": "Person",
      "jobTitle": "Managing Director",
      "name": "Christof Jori",
      "sameAs": [
        "https://www.wikidata.org/wiki/Q139796367",
        "https://www.linkedin.com/in/jocr77/",
        "https://github.com/jo-chris"
      ],
      "url": "https://wavect.io/team/christof-jori/",
      "worksFor": {
        "@id": "https://wavect.io/#organization",
        "@type": [
          "Organization",
          "ProfessionalService",
          "LocalBusiness"
        ]
      }
    },
    {
      "@id": "https://wavect.io/#website",
      "@type": "WebSite",
      "inLanguage": [
        "en",
        "de",
        "es",
        "zh"
      ],
      "name": "Wavect",
      "potentialAction": {
        "@type": "SearchAction",
        "query-input": "required name=search_term_string",
        "target": {
          "@type": "EntryPoint",
          "urlTemplate": "https://wavect.io/search/?q={search_term_string}"
        }
      },
      "publisher": {
        "@id": "https://wavect.io/#organization",
        "@type": [
          "Organization",
          "ProfessionalService",
          "LocalBusiness"
        ]
      },
      "url": "https://wavect.io/"
    },
    {
      "@id": "https://wavect.io/de/case-studies/offlinery/#webpage",
      "@type": "WebPage",
      "dateModified": "2026-05-21",
      "inLanguage": "de",
      "isPartOf": {
        "@id": "https://wavect.io/#website",
        "@type": "WebSite"
      },
      "lastReviewed": "2026-05-21",
      "speakable": {
        "@type": "SpeakableSpecification",
        "cssSelector": [
          ".faq-question",
          ".faq-answer"
        ]
      },
      "url": "https://wavect.io/de/case-studies/offlinery/"
    }
  ]
}
```

```json
{
  "@context": "https://schema.org",
  "@id": "https://wavect.io/de/case-studies/offlinery/#case-study",
  "@type": "Article",
  "about": {
    "@id": "https://wavect.io/de/case-studies/offlinery/#project",
    "@type": "CreativeWork",
    "creator": {
      "@id": "https://wavect.io/#organization",
      "@type": [
        "Organization",
        "ProfessionalService",
        "LocalBusiness"
      ]
    },
    "dateCreated": "2024-01-01",
    "description": "Fullstack-Entwicklung engagement",
    "funder": {
      "@type": "Organization",
      "name": "Offlinery"
    },
    "name": "Offlinery",
    "subjectOf": {
      "@id": "https://wavect.io/de/case-studies/offlinery/#case-study",
      "@type": "Article"
    },
    "url": "https://github.com/wavect/offlinery"
  },
  "abstract": "Die richtige Person in der Nähe innerhalb eines Minutenfensters anzeigen, damit eine echte Begegnung stattfindet. Zwei sich verstärkende Constraints: ein proprietärer Algorithmus für Subsekunden-Proximity und Mutual-Intent-Filterung, und Zuverlässigkeit gegen iOS und Android, die Background-Tasks killen, sobald sie das Interesse verlieren.",
  "author": {
    "@id": "https://wavect.io/#organization",
    "@type": [
      "Organization",
      "ProfessionalService",
      "LocalBusiness"
    ]
  },
  "datePublished": "2024-01-01",
  "description": "Offlinery war eine Dating-App gegen die Swipe-Kultur. Ein proprietärer Algorithmus zeigte Menschen in der Nähe an, die sich wirklich persönlich treffen wollten. Veröffentlicht für iOS und Android. 2025 eingestellt.",
  "headline": "Offlinery, Wavect Case Study",
  "image": "https://wavect.io/img/clients/bak/offlinery.png",
  "inLanguage": "de",
  "isPartOf": {
    "@type": "CollectionPage",
    "name": "Wavect Case Studies",
    "url": "https://wavect.io/de/case-studies/"
  },
  "keywords": "KI / Matching, Echtzeit-Geo, Mobile App, React Native / Expo, NestJS, TypeORM, Typescript, Firebase, Sentry",
  "mainEntityOfPage": "https://wavect.io/de/case-studies/offlinery/",
  "mentions": [
    {
      "@type": "DefinedTerm",
      "name": "React Native / Expo",
      "url": "https://expo.dev/"
    },
    {
      "@type": "DefinedTerm",
      "name": "NestJS",
      "url": "https://nestjs.com/"
    },
    {
      "@type": "DefinedTerm",
      "name": "TypeORM",
      "url": "https://typeorm.io/"
    },
    {
      "@type": "DefinedTerm",
      "name": "Typescript",
      "url": "https://www.typescriptlang.org/"
    },
    {
      "@type": "DefinedTerm",
      "name": "Firebase",
      "url": "https://firebase.google.com/"
    },
    {
      "@type": "DefinedTerm",
      "name": "Sentry",
      "url": "https://sentry.io/"
    }
  ],
  "publisher": {
    "@id": "https://wavect.io/#organization",
    "@type": [
      "Organization",
      "ProfessionalService",
      "LocalBusiness"
    ]
  },
  "url": "https://wavect.io/de/case-studies/offlinery/",
  "video": [
    {
      "@id": "https://wavect.io/de/case-studies/offlinery/#video-mNqTMDJxd-A",
      "@type": "VideoObject",
      "description": "In-App-Demo.",
      "duration": "PT59S",
      "embedUrl": "https://www.youtube-nocookie.com/embed/mNqTMDJxd-A",
      "inLanguage": "de",
      "name": "Dating Apps are Out: Meet In Real Life Instead",
      "publisher": {
        "@id": "https://wavect.io/#organization",
        "@type": [
          "Organization",
          "ProfessionalService",
          "LocalBusiness"
        ]
      },
      "thumbnailUrl": "https://i.ytimg.com/vi/mNqTMDJxd-A/maxresdefault.jpg",
      "uploadDate": "2024-10-30T00:00:00+00:00",
      "url": "https://www.youtube.com/watch?v=mNqTMDJxd-A"
    }
  ]
}
```

```json
{
  "@context": "https://schema.org",
  "@type": "BreadcrumbList",
  "itemListElement": [
    {
      "@type": "ListItem",
      "item": "https://wavect.io/de/",
      "name": "Startseite",
      "position": 1
    },
    {
      "@type": "ListItem",
      "item": "https://wavect.io/de/case-studies/",
      "name": "Fallstudien",
      "position": 2
    },
    {
      "@type": "ListItem",
      "item": "https://wavect.io/de/case-studies/offlinery/",
      "name": "Offlinery",
      "position": 3
    }
  ]
}
```
