Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 1 addition & 6 deletions App.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,7 @@ import { GestureHandlerRootView } from 'react-native-gesture-handler';
import { SafeAreaProvider, useSafeAreaInsets } from 'react-native-safe-area-context';
import { NavigationContainer } from '@react-navigation/native';
import { AppNavigator } from './src/navigation';
import {
appNavigationRef,
useProExpiryRedirect,
} from './src/navigation/useProExpiryRedirect';
import { appNavigationRef } from './src/navigation/navigationRef';
import { useTheme } from './src/theme';
import { hardwareService, modelManager, authService, knowledgeBase, remoteServerManager } from './src/services';
import logger from './src/utils/logger';
Expand Down Expand Up @@ -133,7 +130,6 @@ function App() {
// the appRoot slot (TTS engine bridge) registers and this re-renders to mount
// it live — no restart needed.
const AppRoot = useSlot(SLOTS.appRoot);
const applyPendingProRedirect = useProExpiryRedirect();
const [isInitializing, setIsInitializing] = useState(true);
const startupGeneration = useRef(0);
const showSyncStatusBar = useAppStore(s => s.showSyncStatusBar);
Expand Down Expand Up @@ -435,7 +431,6 @@ function App() {
{AppRoot ? <AppRoot /> : null}
<NavigationContainer
ref={appNavigationRef}
onReady={applyPendingProRedirect}
theme={{
dark: isDark,
colors: {
Expand Down
19 changes: 11 additions & 8 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
[![Platform](https://img.shields.io/badge/Platform-Android%20%7C%20iOS%20%7C%20macOS-green.svg)](#install)
[![codecov](https://codecov.io/gh/off-grid-ai/OGAM/graph/badge.svg)](https://codecov.io/gh/off-grid-ai/OGAM)
[![Slack](https://img.shields.io/badge/Slack-Join%20Community-4A154B?logo=slack)](https://join.slack.com/t/off-grid-mobile/shared_invite/zt-494gbuv5c-kj9tT7U0AS8Kq8UUO63_jw)
[![Pro](https://img.shields.io/badge/Off%20Grid%20Pro-%24119%20lifetime%20or%20%247.99%20monthly-000000?style=flat)](https://getoffgridai.co/pay/)
[![Free](https://img.shields.io/badge/Off%20Grid%20AI-100%25%20free%20forever-brightgreen?style=flat)](#everything-is-free)

<a href="https://trendshift.io/repositories/22348?utm_source=trendshift-badge&amp;utm_medium=badge&amp;utm_campaign=badge-trendshift-22348" target="_blank" rel="noopener noreferrer"><img src="https://trendshift.io/api/badge/trendshift/repositories/22348/daily?language=TypeScript" alt="off-grid-ai%2FOGAM | Trendshift" width="250" height="55"/></a>

Expand All @@ -37,26 +37,29 @@

<div align="center">

## Off Grid AI Pro
## Everything is free

**A voice, personas, and actions. $119 for life, or $7.99/month.**
**A voice, personas, and actions. No licence, no subscription, nothing to unlock.**

</div>

<br />

Pro is an optional, additive tier. It gives the assistant a voice that talks back, personas you shape, and the tools to draft real actions you approve. One license covers your phone and your Mac. All on-device.
Off Grid AI has no paid tier. Every capability the app has is available to everyone: the assistant has a
voice that talks back, personas you shape, and the tools to draft real actions you approve. Your phone and
your Mac are both covered. All on-device.

### What Pro adds
### What you get

- **Voice mode** - the free app transcribes your speech; Pro adds on-device Kokoro text-to-speech, so it talks back and you run the whole thing hands-free. The voice runs in your phone's RAM.
- **Voice mode** - on-device Kokoro text-to-speech, so the assistant talks back and you run the whole thing hands-free. The voice runs in your phone's RAM.
- **Custom personas** - give each assistant its own system prompt, voice, and persistent memory, so it stays in character across conversations.
- **Draft, then approve** - connect Calendar, email, and MCP servers like Linear, Notion, and GitHub. It drafts the reply or files the ticket and waits. Nothing sends without your tap.
- **Personal Mesh sync** - your phone and your Mac share chats, files, and settings over your own network. There is no relay. See the [Personal Mesh guide](docs/PERSONAL_MESH.md).

**[→ Get Pro access](https://getoffgridai.co/pay/)** - $119 once and it is yours forever (the price climbs as more people join, never down), or $7.99/month.
There is no purchase path in the app, no licence key to paste, and no expiry: the old paid tier was
removed, and the licence plumbing that remains is only what pairing your own devices needs.

Pair it with **[Off Grid AI Desktop](https://github.com/off-grid-ai/desktop/releases/latest)** on your Mac. One Pro license covers both.
Pair it with **[Off Grid AI Desktop](https://github.com/off-grid-ai/desktop/releases/latest)** on your Mac.

---

Expand Down
8 changes: 4 additions & 4 deletions __tests__/harness/proHarness.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,11 +12,11 @@
* registering individual slots per test.
*/
export async function installPro(): Promise<void> {
// isPro=true → the real bootstrap requires @offgrid/pro and calls pro.activate({...registries}),
// registering every pro slot (chatInput.modeToggle, chatInput.audioMode, message.speakButton, …).
// The real bootstrap requires @offgrid/pro and calls pro.activate({...registries}), registering every
// pro slot (chatInput.modeToggle, chatInput.audioMode, message.speakButton, …). Nothing is gated any
// more: a build with the bundle activates it with no licence, which is what this harness stands in for.
const { loadProFeatures } = require('../../src/bootstrap/loadProFeatures');
await loadProFeatures(true);
await loadProFeatures();
}

/** Start the real app over device storage. The returned controls use only visible gestures. */
Expand Down
80 changes: 0 additions & 80 deletions __tests__/integration/licensing/proRuntimeExpiry.test.ts

This file was deleted.

Loading