Write, deploy, and scale apps on IPFS

Textile is a set of open source tools that provide a decentralized database, IPFS pinning, content hosting, and more over the IPFS network.

Tools for developers

Textile provides a set of tools and trustless infrastructure for building apps and a platform to return ownership of data to your users.

Learn more
blog.textile.io →

  • Scalable IPFS

    Our APIs and libraries give developers tools to build better data storage and networking across mobile, web, and backend applications.

  • Familiar APIs

    Our libraries are easy to try and quick to learn. If you're familiar with S3 or MongoDB, you already understand Buckets and Threads.

  • Web hosting

    Textile Buckets help you and your team publish dynamic or static content in seconds with DNS integration, CI support, and more.

Easy to Use

Create encrypted, resilient, and cross-application data storage in seconds.

Threads let you quickly sync any type of app data between users or across devices.
Join our developer community →
												~/dev> tree homepage/
homepage/
├── index.html
├── js
    └── app.js

1 directories, 2 files

~/dev> textile buckets push homepage/* homepage
✔ Add 2 files? Press ENTER to confirm: █
> Pushing homepage/index.html to homepage/index.html
> Pushing homepage/js/app.js to homepage/js/app.js
> Success! Pushed 2 files to homepage
> Path /ipfs/QmSNWjbDkafwxWUGWTyP1ko4J1CW2WeNfeoiCuTUW2YnDY/
											
										
											let api = new textile.API({
		token: 'APP_TOKEN',
		deviceId: 'DEVICE_ID'
})

let client = new Client(api.threadsConfig)
let store = client.newStore()
await this.client.registerSchema(store.id, 'Folder2P', schema)
const found = await this.client.modelFind(this.finderID, 'Folder2P', {})
console.debug('found:', found.entitiesList.length)
# found: 3
									
										let api = new textile.API({
		token: 'APP_TOKEN',
		deviceId: 'DEVICE_ID'
})

let client = new Client(api.threadsConfig)
let store = client.newStore()
await this.client.registerSchema(store.id, 'Folder2P', schema)
const found = await this.client.modelFind(this.finderID, 'Folder2P', {})
console.debug('found:', found.entitiesList.length)
# found: 3
									
								
								import 'package:textile/textile.dart' as textile;
import 'package:threads_client/threads_client.dart' as threads;

const APP_TOKEN = '';
const DEVICE_ID = '';

void main(List args) async {
	final config = textile.ThreadsConfig(APP_TOKEN, DEVICE_ID);
	final client = threads.Client(config: config);
	final store = await client.newStore();
	print('New store $store');
}
						
							import io.textile.threads;
import io.textile.threads_grpc.*;
public class App {
	public void example() throws Exception {
		Client client = new Client("localhost", 6006);
		client.Connect();
		String storeId = client.NewStoreSync();
		client.StartSync(storeId);
		client.RegisterSchemaSync(storeId, "Person", jsonStr);
		ModelCreateReply reply = client.ModelCreateSync(
			storeId, "Person", data
		);
	}
}