Open Source ยท v0.2.0 ยท Now with iOS & Android

Build edge dApps once.
Run them everywhere.

The unified SDK for deploying confidential applications across decentralised compute networks โ€” and calling them from any iOS, Android, or JavaScript app.

Quick start View on GitHub
$ npm install -g @phonix/cli

One SDK, four networks

Deploy the same code to any supported DePIN provider without rewriting your application logic.

Acurast
Supported
237,000+ smartphone nodes running inside hardware Trusted Execution Environments. Your code and data are private โ€” even from device owners.
๐Ÿ“ฑ TEE-based ๐Ÿ”‘ P256 auth โšก nodejs / wasm
Fluence
Supported
Decentralised serverless cloud built on libp2p. Deploy spells to a permissionless peer-to-peer network of compute providers.
๐ŸŒ P2P relay ๐Ÿ”‘ Ed25519 โšก nodejs
Koii
Supported
Community-owned compute network with Solana-compatible task nodes. Ideal for recurring data tasks, oracles, and agent workloads.
๐Ÿ”— Task nodes ๐Ÿ”‘ Solana keypair โšก nodejs
Akash
Supported
Decentralised cloud marketplace where providers bid to run containerised workloads. Deploy bundles via IPFS and pay in AKT โ€” no lock-in, no vendor overhead.
โ˜๏ธ Docker containers ๐Ÿ”‘ BIP-39 mnemonic โšก nodejs

From zero to deployed in minutes

One CLI, one config file, one client API โ€” regardless of which network you deploy to.

1

Initialise your project

Choose a provider and template. Phonix generates your config and entry point.

2

Configure credentials

The phonix auth wizard generates and stores all required keys. Your .env is locked to owner-only permissions and never committed.

3

Test locally

Run phonix run-local to simulate the full provider runtime on your machine โ€” no network required.

4

Deploy and call

One command bundles, uploads to IPFS, and registers on-chain. Then call from any JavaScript environment with @phonix/sdk.

your-app/index.ts
// Deploy once โ€” run on edge nodes
import { PhonixClient } from '@phonix/sdk';

const client = new PhonixClient({
  provider: 'acurast',
  secretKey: process.env.PHONIX_SECRET_KEY,
});

await client.connect();

// Listen for results from the TEE
client.onMessage((msg) => {
  const { result } = msg.payload as { result: string };
  console.log('Result:', result);
});

// Send a prompt to a processor node
await client.send('0xproc1...', {
  requestId: 'req-001',
  prompt: 'Summarize: The quick brown fox...',
});

client.disconnect();
terminal
# Initialise project
phonix init

# Set up credentials interactively
phonix auth

# Test without deploying
phonix run-local

# Deploy to the network
phonix deploy

# โœ” Deployment live!
# Processors: 3 matched
#   โ€ข 0xproc1...

Call your processors
from iOS & Android

Deploy your edge processors once with the Phonix CLI, then call them directly from your React Native or Expo app. Real-time results, secure key storage, and automatic background/foreground lifecycle management โ€” all in one package.

iOS
Android
Expo
  • โœ“ React hooks โ€” usePhonix, useMessages, useSend for clean component integration
  • โœ“ Context provider โ€” wrap your root with <PhonixProvider> and access the client anywhere in the tree
  • โœ“ Secure key storage โ€” iOS Keychain & Android Keystore via expo-secure-store, in-memory fallback for bare RN
  • โœ“ AppState lifecycle โ€” auto-disconnects when the app backgrounds, auto-reconnects on foreground
  • โœ“ SSRF protection โ€” all endpoints validated: https:// only, private IPs blocked
  • โœ“ Zero native modules โ€” pure JavaScript, works with Expo Go and bare React Native
$ npm install @phonix/mobile
// Wrap your root component once
import { PhonixProvider } from '@phonix/mobile';

export default function App() {
  return (
    <PhonixProvider
      provider="akash"
      secretKey={process.env.PHONIX_SECRET_KEY}
      autoConnect
    >
      <NavigationContainer>
        <MainStack />
      </NavigationContainer>
    </PhonixProvider>
  );
}
// Access from any screen in the tree
import {
  usePhonixContext,
  useMessages,
  useSend,
} from '@phonix/mobile';

export function ResultsScreen() {
  const { connected } = usePhonixContext();
  const messages = useMessages(client);
  const { send, sending } = useSend(client);

  return (
    <View>
      <Text>{connected ? '๐ŸŸข Live' : 'โšช Offline'}</Text>
      <Button
        title={sending ? 'Sending...' : 'Run inference'}
        onPress={() => send(leaseUrl, {
          prompt: 'Summarize the news today'
        })}
      />
      {messages.map((m, i) => (
        <Text key={i}>{m.payload as string}</Text>
      ))}
    </View>
  );
}
// Without context โ€” manage client directly
import { usePhonix, useMessages } from '@phonix/mobile';

export function InferenceScreen() {
  const { client, connected, connect, error }
    = usePhonix({
        provider: 'akash',
        secretKey: PHONIX_SECRET_KEY,
      });
  const messages = useMessages(client);

  return (
    <View>
      <Button
        title="Connect"
        onPress={connect}
        disabled={connected}
      />
      {error && <Text>{error.message}</Text>}
      {messages.map((m, i) => (
        <Text key={i}>
          {JSON.stringify(m.payload)}
        </Text>
      ))}
    </View>
  );
}

Route across DePIN networks โ€” automatically

PhonixRouter manages multiple providers simultaneously. On every request it scores each provider by health, latency, cost, and availability โ€” then sends to the best one. If that provider fails, it retries on the next. Circuit breakers prevent routing to unhealthy nodes until they recover.

  • balancedEqual weight across availability, latency, and cost โ€” the safe default.
  • latencyAlways picks the fastest-responding provider. Good for interactive workloads.
  • availabilityMaximises uptime. Prefers providers with the highest recent success rate.
  • costRoutes to the cheapest option. Ideal for batch and background jobs.
  • round-robinDistributes load evenly across all callable providers.

Works on Node.js (SDK) and React Native (mobile). The same routing engine powers both.

// Server SDK
import { PhonixRouter } from '@phonix/sdk';

const router = new PhonixRouter({
  providers: ['akash', 'acurast'],
  secretKey: process.env.PHONIX_SECRET_KEY,
  strategy: 'latency',
});

await router.connect();
await router.deploy(config);  // deploys to all providers

// Automatically picks fastest callable provider
await router.send({ prompt: 'Hello' });

// Health snapshot
router.health().forEach(h => {
  console.log(h.provider, h.latencyMs, h.circuitState);
});
// Mobile (React Native / Expo)
import { usePhonixRouter } from '@phonix/mobile';

const { router, connected, health } = usePhonixRouter({
  routes: [
    { provider: 'akash',   endpoint: AKASH_URL,   secretKey },
    { provider: 'acurast', endpoint: ACURAST_WS, secretKey },
  ],
  strategy: 'balanced',
  autoConnect: true,
});

// AppState-aware: pauses on background, resumes on foreground
await router?.send({ prompt: 'Hello from iOS' });

Built for production

Security and reliability are not afterthoughts โ€” they are built into every layer of the SDK.

๐Ÿ”’

Confidential by default

Your code runs inside hardware TEEs. Prompts, responses, and logic are private โ€” even from device owners and network operators.

๐Ÿ›ก๏ธ

SSRF & DNS rebinding protection

All HTTP calls validate URLs and resolve hostnames to IPs before opening connections, blocking requests to internal infrastructure.

๐Ÿ”‘

Safe credential management

The auth wizard generates keys locally, writes them with chmod 600, and enforces .gitignore โ€” secrets never leave your machine accidentally.

๐Ÿ“ฆ

Single-file bundles

esbuild compiles your TypeScript to a single optimised IIFE with env vars injected at build time. No runtime dependencies on the edge node.

๐Ÿงช

Local testing runtime

The mock runtime simulates the full provider API locally โ€” WebSocket messages, HTTP callbacks, fulfill โ€” so you iterate without touching the network.

๐ŸŒ

Provider-agnostic API

Switch from Acurast to Fluence to Koii to Akash by changing one config field. Your application code stays identical across all providers.

๐Ÿ“ฑ

iOS & Android ready

@phonix/mobile brings React hooks, context, and AppState lifecycle to your React Native and Expo apps โ€” iOS Keychain, Android Keystore, zero native modules.

โšก

Intelligent multi-provider routing

PhonixRouter scores every provider on latency, availability, and cost in real time. Circuit breakers open on failure and recover automatically โ€” zero downtime across DePIN networks.

Everything from the terminal

The full deployment lifecycle in a single tool.

phonix init
Interactive setup โ€” generates phonix.json, .env, and template files
phonix auth
Credential wizard โ€” generates and stores keys for your provider
phonix deploy
Bundle, upload to IPFS, and register deployment on-chain
phonix run-local
Run your script locally with a full mock provider runtime
phonix status
List deployments, processor IDs, and live status
phonix send <id> <msg>
Send a test message directly to a processor node

Start building today

Open source, MIT licensed, and ready for your first deployment.