TreeMap
무료 오픈소스 디스크 사용량 시각화 도구로, 사각형 트리맵·중복 파일 탐색·디스크 가득 예측·정리 시 파일을 휴지통으로만 이동한다
Orbit은 습관 추적기와 AI 코치 Astra를 결합해 습관을 기록하고 실제 연속성을 분석
Orbit pairs a serious habit tracker with Astra, an AI coach that logs your habits and reads your real streaks. Connect Claude or ChatGPT over MCP. Free to start, 7-day Pro trial, no card.
생산성JavaScript · TypeScriptGitHub @thomasluizon온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기Orbit - AI-Powered Habit Tracker: Full-stack productivity app with an AI assistant that learns user patterns and proactively suggests habits, routines, and optimizations.
저장소 README에서 가져옴
README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
Marketing landing page for Orbit -- an AI-powered habit tracker. A single-page static site showcasing features, platform availability, and bilingual content.README 전문 보기 ↗One screen for Orbit, an AI that tracks habits. Astra turns a plain request into a proposed routine change for the person to review.
Live: useorbit.org | App: app.useorbit.org | API: api.useorbit.org
| Layer | Technology |
|---|---|
| Framework | Astro |
| Styling | Tailwind CSS v4 |
| Fonts | Geist Sans / Space Grotesk / Geist Mono, self-hosted via Astro's Fonts API |
| Icons | Lucide (@lucide/astro) |
| Linting | ESLint flat config (eslint-plugin-astro, typescript-eslint, local/no-comments) + Prettier |
| Deployment | Render (static site) |
The header, headline, Astra conversation, actions and footer share one centred column. The page uses the visible viewport height, with fewer conversation turns in short windows.
data-i18n attributes with cookie persistence./#ios, and keeps the existing email confirmation and Turnstile flow.The canon lives in orbit-ui-mobile/DESIGN.md. This repository mirrors its dark tokens in src/styles/global.css:
| Token | Value |
|---|---|
| Canvas | #09090B |
| Primary | #C4530F |
| Foregrounds | #F4F4F6 / #C9C9CC / #8F8F93 / #5D5D60 |
| Card surface | rgba(250,250,250,0.04) |
| Hairline | rgba(255,255,255,0.08) |
Type sizes step with viewport width. The Astra proposal uses a tonal preview with approval controls. See CLAUDE.md for token rules and code standards.
The landing follows a scrolling composition with a centered Astra device, floating product cards, feature sections, pricing, questions and a closing invitation. Node tests check section order, accent actions, bilingual copy, pricing and motion startup. The animation libraries load after paint and interaction. Reduced motion keeps the static composition and does not load the scroll driver.
Rendered checks cover 1352, 1100, 840, 412 and 320 CSS pixels in English and Brazilian Portuguese, including the pinned hero, no horizontal overflow, whole control labels and a static reduced motion page. Rendered evidence and Lighthouse remain part of the orchestrator's verification.
^22.22.3 || ^24.16.0 || >=26.3.0 (the engines range in package.json)npm install
npm run dev
The site runs at http://localhost:4321.
src/
pages/
index.astro # One-screen composition and waitlist dialog
404.astro # Not-found page
waitlist-confirmed.astro # Email confirmation result
layouts/
Layout.astro # HTML, metadata, fonts and application structured data
components/
Header.astro # Orbit lockup, language toggle and install action
Hero.astro # Copy, conversation and actions in one column
AstraDemo.astro # Proposed changes and example request chips
AstraGlyph.astro # Astra identity
IosWaitlist.astro # Waitlist dialog and form
Footer.astro # Privacy, terms and copyright
PillButton.astro # Shared action primitive
i18n/
translations.ts # Typed English and Brazilian Portuguese copy
scripts/
i18n.ts # Language cookie, toggle and translated metadata
demo.ts # Local scripted examples
waitlist.ts # Turnstile and waitlist submission
waitlist-section.ts # Fragment navigation and email focus
scroll.ts # Deferred scroll animation startup
landing-motion.ts # Lenis and GSAP choreography
styles/
global.css # Tailwind v4 @theme token mirror + type roles + base
eslint-rules/
no-comments.cjs # Comment policy rule, mirrored from orbit-ui-mobile
astro.config.mjs # Site config, fonts, sitemap, Tailwind Vite plugin
Language switching is handled client-side with typed tables in src/i18n/translations.ts:
data-i18n="key" attributesRecord<TranslationKey, string> makes a missing PT-BR key a compile errororbit_lang cookie (1 year, SameSite Lax)pt prefix maps to pt-BR)| Command | Description |
|---|---|
npm run dev | Start dev server at localhost:4321 |
npm run build | Build static site to ./dist/ |
npm run preview | Preview production build locally |
npm run lint | ESLint (lint:fix to autofix) |
npm run format | Prettier write (format:check for CI) |
npm run check | astro check type checking |
Deployed on Render as static sites for production and staging. Auto-deploy is disabled on both sites. Merges and pushes do not deploy them. Run the Release landing GitHub Actions workflow from main with an environment and branch. The production GitHub environment permits deployments only from main. Production accepts only the main branch; staging accepts the selected branch head.
gh workflow run release.yml --ref main -f environment=production
gh workflow run release.yml --ref main -f environment=staging -f branch=<branch>
Domain: useorbit.org
Render build contract:
| Setting | Value |
|---|---|
| Node.js | NODE_VERSION=22.22.3 |
| Build command | npm ci && npm run build |
| Publish directory | dist |
| Auto-deploy | Disabled |
Build-time variables on the Render static site:
| Variable | Purpose |
|---|---|
PUBLIC_API_URL | Waitlist API endpoint; defaults to https://api.useorbit.org |
PUBLIC_ANDROID_INSTALL_URL | Android install links and generated QR; defaults to the production Play listing |
PUBLIC_APP_URL | HTTPS app-entry links; defaults to https://app.useorbit.org |
PUBLIC_POSTHOG_KEY | Enables consent-gated PostHog analytics through /relay/ |
PUBLIC_TURNSTILE_SITE_KEY | Enables the waitlist Turnstile widget |
Configure release credentials in GitHub Settings > Environments:
| Environment | Secret | Deployment branches |
|---|---|---|
production | RENDER_API_KEY | Selected: main |
staging | RENDER_API_KEY | Selected: main |
Use a selected deployment branch rule matching only main for both environments, with no required reviewers. Set the repository variables RENDER_LANDING_SERVICE_ID and RENDER_LANDING_STAGING_SERVICE_ID to their respective Render service IDs. Dispatch the workflow from main and choose the branch to deploy in its input. Supply the full 40-character commit in sha for staging. Production requires branch main and uses sha when supplied, or the dispatch's own commit when it is empty. Both jobs check out that exact commit and verify it belongs to the selected branch; a branch moving while the run waits cannot change the release commit. Keep the Render API key out of repository secrets. Once both release paths have succeeded with their environment secrets, delete the old repository secret RENDER_API_KEY from GitHub Settings > Secrets and variables > Actions.
Both jobs use the Render API to check that auto-deploy is disabled, deploy the selected commit, wait for it to go live, and confirm that the Render service URL serves that commit through the orbit-build meta tag, which Layout.astro fills from Render's RENDER_GIT_COMMIT build variable. The staging job first sets the service's tracked branch to the selected branch. Before deploying, production reads the staging service URL from Render using RENDER_LANDING_STAGING_SERVICE_ID and requires an HTTP 200 response serving the selected build marker. A failed request, redirect, missing marker or different commit refuses production. The explicit force_unstaged boolean bypasses this admission check and is recorded with the selected SHA in the job summary. Production also requires https://useorbit.org/ to serve the same build marker after deployment; a missing or different marker fails the run, and the Deployment records the public URL. Each job records a GitHub Deployment for the verified commit and prints Deployed SHA: <sha> in its summary.
The Render static site definition in orbit-api/infra owns the former vercel.json delivery rules. Edit Terraform there for changes to:
Link header on /: <https://useorbit.org/>; rel="canonical".X-Content-Type-Options: nosniff, X-Frame-Options: DENY, Referrer-Policy: strict-origin-when-cross-origin, Permissions-Policy: camera=(), microphone=(), geolocation=(), and Strict-Transport-Security: max-age=63072000; includeSubDomains; preload./_astro/*: Cache-Control: public, max-age=31536000, immutable. Other paths use Cache-Control: public, max-age=0, must-revalidate./relay/static/* to https://us-assets.i.posthog.com/static/*, /relay/array/* to https://us-assets.i.posthog.com/array/*, and /relay/* to https://us.i.posthog.com/*.The header, hero, Free and Pro pricing actions, accepted demo continuation, closing action, footer Open Orbit link and successful waitlist confirmation keep configured HTTPS app hrefs in delivered HTML. Their explicit data-app-entry opt-in loads through the shared pill module immediately, without waiting for motion or analytics. Desktop, iPhone, iPad, unknown devices, JavaScript-disabled and pre-hydration activation use those web links. Modified clicks, middle clicks, copied links, new tabs and context-menu actions retain normal anchor behavior. Legal, consent privacy, waitlist, contact and local/demo-edit controls do not opt in.
On a trusted, unmodified Chrome for Android click or Enter activation, the handler uses Chrome's documented Android intent mechanism synchronously, with one package-bound custom scheme and an independently encoded S.browser_fallback_url. The browser owns launch and fallback; a UA match or assigned location proves neither installation nor successful handoff. Chrome for Android is the documented acceptance target. Other Android browser signatures and known embedded-browser signatures retain web navigation. A browser can share Chrome’s signature, so physical verification is still required; universal support is not claimed. There are no launch timers, retries, installed-app probes, visibility checks or extra network requests.
The two existing build-time variables select a coherent target:
PUBLIC_APP_URL | PUBLIC_ANDROID_INSTALL_URL | Scheme / package |
|---|---|---|
https://app.useorbit.org | https://play.google.com/store/apps/details?id=org.useorbit.app | orbit / org.useorbit.app |
https://app-staging.useorbit.org | https://play.google.com/store/apps/details?id=org.useorbit.app.staging | orbit-staging / org.useorbit.app.staging |
The configured Play URL must use HTTPS, the Play details path and exactly one matching package id. Preview origins, malformed URLs, crossed pairs and unsupported destinations retain HTTPS navigation. Only root and /upgrade without query data, and /habits/new?title=... with exactly one title key and no extra query keys, qualify. Hashes and credentials are excluded. The handler reads the current href when activated, so approved demo edits replace the destination. The ordinary HTTPS href and demo producer stay unchanged.
For the source-pinned Expo Router 57.0.24 receiver, the native adapter applies four encodeURIComponent layers to the decoded title alone. The receiver decodes through URLSearchParams during extraction, safeDecodeURIComponent before rebuilding the query, URLSearchParams during route parsing and useLocalSearchParams before the app consumes the title. This preserves Unicode, whitespace, delimiters and percent literals, including intent-looking text, as one complete title value. Root and Pro paths and the independently encoded Play fallback retain their existing serialization. This compatibility contract must be checked against the actual receiver sources when that interface changes.
The explicit Install on Android footer link, clickable QR, generated QR payload and Android structured installUrl always use the configured Play URL, including on iPhone. The Play fallback opens the listing; it does not restore Pro or a demo draft after a new installation. Consent-gated CTA capture retains its existing {surface} shape; hero and closing actions share the generic app event with distinct hero/footer surfaces. No destination, title or install outcome is added to telemetry.
Native interface evidence comes from UI commit 084495ce1398eed96199f674b4f3202bf8dab99a: apps/mobile/app.json, app.config.js, app/+native-intent.tsx, app/habits/new.tsx and the existing upgrade route; installed Expo Router 57.0.24, Expo 57.0.26, expo-linking 57.0.11 and config-plugins 57.0.9 establish route parsing and BROWSABLE scheme production. Fixed native-query vectors guard the landing serializer. A separate source-pinned executable proof passes actual dispatched landing URIs through the installed extraction, generated static-route configuration, parser, validator and real React route context/local-params hook, for initial and resumed destinations in both schemes. This proves title delivery through that receiver slice; source and Node VM tests do not prove a generated manifest, mounted app navigator, installed binary, browser handoff or Play delivery.
Release uses the existing GitHub Actions Release landing workflow: stage the carrying branch, then record the exact landing commit, browser/version, Android package/version, installed/absent state and observed root, Pro and demo paths in Chrome for Android. A separate Android emulator without a personal account can verify the browser and installed package; record repacked test binaries distinctly from Play delivery. Also verify desktop/iOS HTTPS navigation, manual web/store fallback, both languages, keyboard activation and the QR label at narrow/wide widths and 200% text. Browser/device and rendered evidence remain a release acceptance boundary. Production follows normal checks/review and the existing manual main release. No new variables, console changes, app release or infrastructure migration are required. Removing the targeted handler leaves the HTTPS anchors as the rollback path.
| Repo | Description |
|---|---|
| orbit-ui-mobile | Turborepo: Next.js web app + Expo Android app (owns DESIGN.md, the design canon) |
| orbit-api | .NET REST API backend |
Private project.