Calljmp Flutter SDK
Secure backend-as-a-service for mobile developers. No API keys. Full SQLite control.
π Overview
Calljmp is a secure backend designed for mobile developers, providing:
- β Authentication via App Attestation (iOS) and Play Integrity (Android)
- β Full SQLite database access (no restrictions, run raw SQL)
- β Secure file storage with organized bucket management
- β Dynamic permissions for users & roles
- β Flutter SDK for seamless integration
πΉ Website: calljmp.com
πΉ Follow: @calljmpdev
π¦ Installation
Add the SDK to your pubspec.yaml:
dependencies:
calljmp: ^latest
Then run:
flutter pub get
π οΈ Setup & Usage
1οΈβ£ Initialize Calljmp
Import and initialize Calljmp in your Flutter app:
import 'package:calljmp/calljmp.dart';
final calljmp = Calljmp();
2οΈβ£ Authenticate User
Authenticate a user with Calljmp:
final user = await calljmp.users.auth.email.authenticate(
email: "test@email.com",
name: "Tester",
password: "password",
policy: UserAuthenticationPolicy.signInOrCreate,
tags: ["role:member"],
);
print(user);
3οΈβ£ Run Direct SQL Queries
Access your SQLite database without restrictions:
final result = await calljmp.database.query(
sql: 'SELECT id, email, auth_provider, provider_user_id, tags, created_at FROM users',
);
print(result);
4οΈβ£ File Storage & Management
Calljmp provides secure cloud storage for your files with organized bucket management. Upload, download, and manage files with metadata, tags, and access controls.
// Upload a file from bytes
final file = await calljmp.storage.upload(
content: imageBytes,
contentType: MediaType('image', 'jpeg'),
bucketId: 'user-uploads',
key: 'profile/avatar.jpg',
description: 'User profile picture',
tags: ['profile', 'avatar'],
);
// Upload from file path
final document = await calljmp.storage.upload(
filePath: '/path/to/document.pdf',
bucketId: 'documents',
key: 'contracts/agreement.pdf',
tags: ['legal', 'contract'],
);
// Upload text content
final textFile = await calljmp.storage.upload(
content: 'Hello, world!',
contentType: MediaType('text', 'plain'),
bucketId: 'text-files',
key: 'messages/hello.txt',
);
List Files in a Bucket
final result = await calljmp.storage.list(
bucketId: 'user-uploads',
limit: 50,
offset: 0,
orderField: 'createdAt',
orderDirection: 'desc',
);
print('Found ${result.files.length} files');
for (final file in result.files) {
print('${file.key}: ${file.size} bytes, created ${file.createdAt}');
}
Download Files
// Get file metadata without downloading content
final fileInfo = await calljmp.storage.peek(
bucketId: 'user-uploads',
key: 'profile/avatar.jpg',
);
print('File size: ${fileInfo.size} bytes');
// Download file content
final stream = await calljmp.storage.retrieve(
bucketId: 'user-uploads',
key: 'profile/avatar.jpg',
);
// Convert to bytes for processing
final bytes = await stream.toBytes();
Update File Metadata
final updatedFile = await calljmp.storage.update(
bucketId: 'user-uploads',
key: 'profile/avatar.jpg',
description: 'Updated profile picture',
tags: ['profile', 'avatar', 'updated'],
);
Delete Files
await calljmp.storage.delete(
bucketId: 'user-uploads',
key: 'profile/avatar.jpg',
);
5οΈβ£ Access service
If you are deploying your own service, you can access it via the service property.
// ./src/services/main.ts
import { Service } from './service';
const service = Service();
service.get('/hello', async c => {
return c.json({
message: 'Hello, world!',
});
});
export default service;
Then in your Flutter app, you can call the service like this:
// ./lib/main.dart
final message = await calljmp.service
.request(route: "/hello")
.get()
.json((json) => json['message'] as String);
print(message);
π Security & App Attestation
Calljmp does not use API keys. Instead, it relies on App Attestation (iOS) and Play Integrity (Android) to verify that only legitimate apps can communicate with the backend.
For more details, check the Apple App Attestations docs and/or Google Play Integrity docs.
π License
This project is licensed under the MIT License - see the LICENSE file for details.
π¬ Support & Community
If you have any questions or feedback:
- Follow @calljmpdev
- Join the Calljmp Discord
- Open an issue in the GitHub repo
Libraries
- access
- Access token utilities for JWT authentication in the Calljmp SDK.
- attestation
- calljmp
- The Calljmp Flutter SDK provides secure backend-as-a-service capabilities for mobile developers.
- calljmp_device_interface
- Platform interface for device attestation and integrity verification.
- calljmp_device_method_channel
- calljmp_store_interface
- Platform interface for secure storage in the Calljmp SDK.
- calljmp_store_method_channel
- Method channel implementation of secure storage for the Calljmp SDK.
- client
- common
- config
- database
- database_types
- Enhanced type safety for database event handling
- error
- http
- HTTP client utilities for the Calljmp SDK.
- integrity
- project
- realtime
- realtime_types
- Enhanced type safety for realtime event handling
- service
- signal
- signal_types
- Signal message types and data structures for real-time communication This mirrors the signal types from the common library
- storage
- users/apple
- users/auth
- users/email
- users/provider
- users/users