R1 Create SDK
Unofficial community JavaScript/TypeScript SDK for building R1/RabbitOS plugins with full hardware access, AI integration, and mobile optimization.
Features
- 🔧 Hardware Access: Accelerometer, touch simulation, PTT button, scroll wheel
- 💾 Storage: Secure and plain storage with automatic Base64 encoding
- 🤖 LLM Integration: Direct interaction with R1's AI system + text-to-speech
- 🌐 Web Search: SERP API integration for real-time information
- 📱 Optimized UI: Purpose-built for 240x282px display with hardware acceleration
- 🎨 UI Design System: Responsive components and design utilities
- 🎥 Media APIs: Camera, microphone, speaker with web standard compatibility
- 🎮 Device Controls: Convenient hardware event management
- ⚡ Performance: Minimal DOM operations, hardware-accelerated CSS
- 📦 TypeScript: Full type definitions and IntelliSense support
Installation
npm install r1-create
Quick Start
import { r1, createR1App, deviceControls, ui } from 'r1-create';
createR1App(async (sdk) => {
console.log('R1 App initialized!');
ui.setupViewport();
deviceControls.init();
deviceControls.on('sideButton', () => {
console.log('Side button clicked!');
});
await sdk.messaging.speakText('Hello from R1!');
await sdk.llm.askLLMSpeak('Hello, how are you today?');
});
Core APIs
Hardware
await r1.accelerometer.start((data) => {
console.log(`Tilt: x=${data.x}, y=${data.y}, z=${data.z}`);
});
r1.touch.tap(120, 141);
r1.hardware.on('sideClick', () => console.log('PTT clicked'));
r1.hardware.on('scrollUp', () => console.log('Scroll up'));
Storage
await r1.storage.plain.setItem('theme', { dark: true, color: 'blue' });
const theme = await r1.storage.plain.getItem('theme');
await r1.storage.secure.setItem('api_key', 'secret123');
const apiKey = await r1.storage.secure.getItem('api_key', false);
LLM Integration
await r1.messaging.sendMessage('What time is it?', { useLLM: true });
await r1.llm.askLLMSpeak('Tell me a joke', true);
await r1.messaging.speakText('Hello world!');
await r1.llm.textToSpeech('This will be spoken directly');
await r1.messaging.searchWeb('current weather in Tokyo');
await r1.messaging.sendMessage('Analyze this image', {
useLLM: true,
pluginId: 'image-analyzer',
imageBase64: 'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNkYPhfDwAChwGA60e6kgAAAABJRU5ErkJggg=='
});
await r1.llm.askLLMJSON('List 3 facts about rabbits in JSON format');
r1.messaging.onMessage((response) => {
if (response.parsedData) {
console.log('Parsed response:', response.parsedData);
}
});
Media APIs
const stream = await r1.camera.start({ facingMode: 'user' });
const videoElement = r1.camera.createVideoElement();
document.body.appendChild(videoElement);
const photo = r1.camera.capturePhoto(240, 282);
await r1.microphone.startRecording();
const audioBlob = await r1.microphone.stopRecording();
await r1.speaker.play(audioBlob);
await r1.speaker.playTone(440, 1000);
UI Utilities
import { LayoutUtils, CSSUtils, R1_DIMENSIONS } from 'r1-create';
const container = document.createElement('div');
LayoutUtils.applyR1Container(container);
CSSUtils.setTransform(element, 'translateX(10px)');
CSSUtils.addTransition(element, 'transform', 300);
console.log(`Screen: ${R1_DIMENSIONS.width}x${R1_DIMENSIONS.height}px`);
UI Design System
import { ui } from 'r1-create';
ui.setupViewport();
const button = document.createElement('button');
ui.createButton(button, { type: 'wide', background: '#FE5F00' });
button.textContent = 'Press Me';
const title = document.createElement('h1');
ui.createText(title, { size: 'title', color: '#FFFFFF' });
title.textContent = 'Welcome';
const grid = document.createElement('div');
ui.createGrid(grid, { columns: 2, gap: ui.getSpacing().md });
const colors = ui.getColors();
const fonts = ui.getFontSizes();
const spacing = ui.getSpacing();
const vwValue = ui.pxToVw(30);
Device Controls
import { deviceControls } from 'r1-create';
deviceControls.init({
sideButtonEnabled: true,
scrollWheelEnabled: true,
keyboardFallback: true
});
deviceControls.on('sideButton', (event) => {
console.log('Side button pressed');
});
deviceControls.on('scrollWheel', (data) => {
console.log('Scrolled', data.direction);
});
deviceControls.setSideButtonEnabled(false);
deviceControls.setScrollWheelEnabled(true);
deviceControls.triggerSideButton();
Advanced Usage
Custom Plugin Class
import { R1Plugin } from 'r1-create';
const plugin = new R1Plugin({
onMount: () => console.log('Plugin mounted'),
onMessage: (data) => console.log('Received:', data),
onHardwareEvent: (event) => console.log('Hardware event:', event)
});
plugin.mount();
Performance Monitoring
import { PerformanceUtils } from 'r1-create';
PerformanceUtils.startMeasure('animation');
PerformanceUtils.endMeasure('animation');
PerformanceUtils.monitorFPS(5, (fps) => {
console.log(`Average FPS: ${fps}`);
});
Component Development
import { R1Component } from 'r1-create';
class MyComponent extends R1Component {
protected onMount(): void {
this.element.innerHTML = `
<div style="width: 240px; height: 282px;">
<h1>My R1 Component</h1>
</div>
`;
}
protected onUnmount(): void {
}
}
const component = new MyComponent();
component.mount(document.body);
Device Specifications
- Display: 240x282px portrait
- Hardware: Accelerometer, PTT button, scroll wheel
- Storage: Secure (Android M+) and plain storage
- Audio: Microphone, speaker
- Camera: Front/back cameras
- AI: Full LLM integration
Best Practices
- Optimize for Mobile: Use hardware-accelerated CSS properties (
transform, opacity)
- Minimize DOM Operations: Use
DOMUtils.batchOperations() for multiple changes
- Handle Storage Errors: Always check if storage is available before use
- Audio Context: Initialize audio on user interaction for browser compatibility
- Memory Management: Clean up event listeners and media streams
TypeScript Support
The SDK is built with TypeScript and includes comprehensive type definitions:
import type {
AccelerometerData,
PluginMessage,
StorageAPI,
HardwareEventType
} from 'r1-create';
Error Handling
try {
await r1.storage.secure.setItem('key', 'value');
} catch (error) {
if (error.message.includes('not available')) {
await r1.storage.plain.setItem('key', 'value');
}
}
Examples
See the examples directory for complete plugin examples:
- Basic Plugin Template
- Camera Photo App
- Voice Recorder
- Text-to-Speech App
- Web Search Integration
- Accelerometer Game
- LLM Chat Interface
- UI Design System Demo
- Device Controls Example
API Reference
Full API documentation is available in the TypeScript definitions and inline JSDoc comments.
License
Apache-2.0 - See LICENSE file for details.
Contributing
Contributions welcome! Please read our contributing guidelines and submit pull requests to our GitHub repository.