{"id":50359811,"url":"https://github.com/jonathanperis/speedy-bird-lynx","last_synced_at":"2026-05-30T01:01:54.917Z","repository":{"id":348866161,"uuid":"1198738564","full_name":"jonathanperis/speedy-bird-lynx","owner":"jonathanperis","description":"Speedy Bird — a Flappy Bird clone built with Lynx (ReactLynx + TypeScript). Cross-platform native UI for iOS, Android, and Web from a single codebase.","archived":false,"fork":false,"pushed_at":"2026-05-29T15:09:42.000Z","size":1917,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-29T17:06:18.352Z","etag":null,"topics":["android","bytedance","cross-platform","flappy-bird","game","ios","lynx","native-ui","reactlynx","rspeedy","typescript"],"latest_commit_sha":null,"homepage":"https://jonathanperis.github.io/speedy-bird-lynx/","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/jonathanperis.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":"CODEOWNERS","security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null},"funding":{"github":"jonathanperis","buy_me_a_coffee":"jonathanperis"}},"created_at":"2026-04-01T17:57:56.000Z","updated_at":"2026-05-29T15:07:17.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/jonathanperis/speedy-bird-lynx","commit_stats":null,"previous_names":["jonathanperis/speedy-bird-lynx"],"tags_count":52,"template":false,"template_full_name":null,"purl":"pkg:github/jonathanperis/speedy-bird-lynx","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jonathanperis%2Fspeedy-bird-lynx","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jonathanperis%2Fspeedy-bird-lynx/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jonathanperis%2Fspeedy-bird-lynx/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jonathanperis%2Fspeedy-bird-lynx/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jonathanperis","download_url":"https://codeload.github.com/jonathanperis/speedy-bird-lynx/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jonathanperis%2Fspeedy-bird-lynx/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33676191,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-05-29T02:00:06.066Z","response_time":107,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["android","bytedance","cross-platform","flappy-bird","game","ios","lynx","native-ui","reactlynx","rspeedy","typescript"],"created_at":"2026-05-30T01:01:54.193Z","updated_at":"2026-05-30T01:01:54.902Z","avatar_url":"https://github.com/jonathanperis.png","language":"TypeScript","funding_links":["https://github.com/sponsors/jonathanperis","https://buymeacoffee.com/jonathanperis"],"categories":[],"sub_categories":[],"readme":"# speedy-bird-lynx\n\n\u003e Flappy Bird clone built with ReactLynx and TypeScript — runs on Android and Web from a single codebase, with iOS host source included for Xcode project setup\n\n[![Build Check](https://github.com/jonathanperis/speedy-bird-lynx/actions/workflows/ci.yml/badge.svg)](https://github.com/jonathanperis/speedy-bird-lynx/actions/workflows/ci.yml) [![Release](https://github.com/jonathanperis/speedy-bird-lynx/actions/workflows/release.yml/badge.svg)](https://github.com/jonathanperis/speedy-bird-lynx/actions/workflows/release.yml) [![CodeQL](https://github.com/jonathanperis/speedy-bird-lynx/actions/workflows/codeql.yml/badge.svg)](https://github.com/jonathanperis/speedy-bird-lynx/actions/workflows/codeql.yml) [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)\n\n**[Live demo →](https://jonathanperis.github.io/speedy-bird-lynx/)** | **[Documentation →](https://jonathanperis.github.io/speedy-bird-lynx/docs/)**\n\n---\n\n## About\n\n[Lynx](https://lynxjs.org/) is an open-source cross-platform native UI framework created by ByteDance. It uses a native C++ rendering engine (not a WebView) and a dual-threaded architecture where React reconciliation runs on a background thread while the main thread handles native rendering and touch events. This project is a Flappy Bird clone that demonstrates how to build a complete game with ReactLynx, covering element-based rendering, 60 FPS state updates, touch input, asset loading, and automated CI/CD pipelines. Android and the web preview are ready to run from the checked-in project; iOS source files are included, but an Xcode project/workspace must be created locally before building.\n\n## Tech Stack\n\n| Technology | Version | Purpose |\n|-----------|---------|---------|\n| [ReactLynx](https://lynxjs.org/) | 0.119.0 | Cross-platform native UI framework |\n| [React](https://react.dev/) | 18.3.1 | Component model and hooks |\n| [TypeScript](https://www.typescriptlang.org/) | 6.0.3 | Type-safe application code |\n| [Rspack / rspeedy](https://rspack.dev/) | 0.14.3 | Build toolchain with HMR |\n| Android (Kotlin) | Lynx SDK 3.7.0 | Native Android host app |\n| iOS (Swift + CocoaPods) | Lynx SDK 3.7.0 | Native iOS host app |\n| GitHub Actions | — | CI/CD build, sign, deploy, release |\n\n## Features\n\n- Tap/click to flap in the ReactLynx app; the GitHub Pages canvas demo also supports Space\n- Speed increases 1% per pipe cleared\n- Medal system: Bronze (10+), Silver (25+), Gold (50+), Platinum (100+)\n- Element-based rendering using `\u003cview\u003e` and `\u003cimage\u003e` with CSS transforms (no canvas)\n- Tile-based pipe construction to avoid sprite stretching\n- Parallax scrolling background and ground layers\n- Sprite-based digit rendering for in-game score\n- AABB collision detection with circular bird hitbox approximation\n- Audio support via web `HTMLAudioElement`; native builds include stubs and continue without sound until an Android/iOS `AudioModule` is implemented and registered\n- Astro-powered GitHub Pages site in `docs/`, including a playable canvas demo and generated wiki pages\n\n## Getting Started\n\n### Prerequisites\n\n- **Bun** for the root ReactLynx/Rspeedy app (`bun install`, `bun run dev`, `bun run build`)\n- **Node.js** \u003e=22.12 for the Astro 6.4+ documentation site in `docs/` (`npm run dev/build/preview`)\n- **Java 17** and **Android SDK** (for Android builds)\n- **Xcode 15+** and **CocoaPods** (for iOS builds after creating the Xcode project from the included source scaffold)\n\n### Quick Start\n\n```bash\ngit clone https://github.com/jonathanperis/speedy-bird-lynx.git\ncd speedy-bird-lynx\nbun install\nbun run dev\n```\n\nOpen in [Lynx Explorer](https://github.com/lynx-family/lynx) or [Lynx Go](https://apps.apple.com/us/app/lynx-go-dev-explorer/id6743227790) at `http://\u003cyour-ip\u003e:3000/main.lynx.bundle`.\n\n```bash\nbun run build\n```\n\nOutputs `dist/main.lynx.bundle` (native) and `dist/main.web.bundle` (web).\n\n### Documentation Site\n\nThe public GitHub Pages site lives in `docs/`. It uses Astro 6.4+, so run it with Node.js \u003e=22.12:\n\n```bash\ncd docs\nbun install\nnpm run dev\nnpm run build\nnpm run preview\n```\n\nThe docs build writes static output to `docs/out/`; the `deploy.yml` workflow publishes that output to GitHub Pages through the shared reusable Pages workflow.\n\n### Web Surfaces\n\nThere are three web-related surfaces in the repository:\n\n| Surface | Location | Purpose |\n|---------|----------|---------|\n| ReactLynx web preview | `bun run dev`, then `http://localhost:3000/__web_preview?casename=main.web.bundle` | Development preview of the compiled `main.web.bundle` |\n| GitHub Pages canvas demo | `docs/src/pages/index.astro` | Public playable browser demo; it mirrors the game physics but uses a 400x600 viewport to fit the phone frame |\n| Standalone web host | `web-host/` + `rsbuild.web-host.config.ts` | Advanced/dev-only host that renders `main.web.bundle` inside `\u003clynx-view\u003e`; it expects the bundle URL configured in `web-host/index.html` |\n\n## Project Structure\n\n```\nsrc/\n├── App.tsx                    # Root component, fullscreen game\n├── hooks/useGameEngine.ts     # Game loop, physics, collision, scoring\n├── components/\n│   ├── Bird.tsx               # Animated bird with rotation\n│   ├── Pipe.tsx               # Tile-based pipes (no stretching)\n│   ├── Background.tsx         # Parallax scrolling background\n│   ├── Ground.tsx             # Scrolling ground layer\n│   ├── ScoreDisplay.tsx       # Sprite-based digit rendering\n│   ├── GetReadyScreen.tsx     # Start screen overlay\n│   └── GameOverScreen.tsx     # Game over with medals\n├── audio/audio.ts             # Audio module (web + native stubs)\n├── constants.ts               # All game constants\n└── types.ts                   # TypeScript types\n\nandroid/                       # Native Android host app (Kotlin)\nios/                           # Native iOS host app (Swift)\nassets/                        # Sprites, audio, medals, digits\ndocs/                          # Astro GitHub Pages site + playable canvas demo\n.github/workflows/             # CI/CD pipelines\n```\n\n## CI/CD\n\n| Workflow | File | Trigger | Description |\n|----------|------|---------|-------------|\n| Build Check | `ci.yml` | Manual, push to `main`/`lynx-migration`, PR to `main` | Type-check (`tsc --noEmit`) and build Lynx bundles; no unit-test framework is configured yet |\n| CodeQL | `codeql.yml` | Push/PR to `main`, weekly | Security and quality analysis |\n| Deploy Web | `deploy.yml` | Push to `main`, manual | Build and deploy the Astro `docs/` site to GitHub Pages via the shared Pages workflow |\n| Build Android | `build-android.yml` | Push to `main`, `v*` tags, manual | Build release APK, sign when secrets are configured, create GitHub Release |\n| Build iOS | `build-ios.yml` | `v*` tags, manual | Build iOS archive (unsigned without Apple Developer Program) |\n| Release | `release.yml` | `v*` tags, manual | Full release pipeline: build + Android + iOS + GitHub Release |\n\n### Release Artifact Matrix\n\n| Artifact | How it is produced | Signing/status |\n|----------|--------------------|----------------|\n| Local Android debug APK | `bun run build`, copy `dist/main.lynx.bundle` into Android assets, then `cd android \u0026\u0026 ./gradlew assembleDebug` | Debug-signed by Android tooling; intended for local install/testing |\n| CI Android build APK | `build-android.yml` on `main`, tags, or manual dispatch | Release build; signed only when keystore secrets are configured |\n| Tagged Android release APK | `build-android.yml` or `release.yml` on `v*` tags | Attached to the GitHub Release; signed when `KEYSTORE_BASE64`, `KEYSTORE_PASSWORD`, `KEY_ALIAS`, and `KEY_PASSWORD` are configured |\n| iOS archive | `build-ios.yml` or `release.yml` | Source scaffold only until an Xcode project and Apple signing assets are configured; unsigned archives are expected without Apple Developer Program setup |\n\nCurrent quality gates are TypeScript type-checking, production bundle builds, CodeQL, and Pages deployment. Unit tests, browser smoke tests, and lint/format checks are not configured yet.\n\n## License\n\nMIT — see [LICENSE](LICENSE)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjonathanperis%2Fspeedy-bird-lynx","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjonathanperis%2Fspeedy-bird-lynx","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjonathanperis%2Fspeedy-bird-lynx/lists"}