Coconut Vault

Quando la rete è off,
il tuo telefono diventa un caveau Bitcoin

Self-custody dei bitcoin in sicurezza offline —
senza hardware wallet complessi e costosi.

Vedi Coconut Wallet

Un dispositivo di livello hardware wallet
con sicurezza e usabilità elevate

Hardware-level Protection
Sicurezza avanzata di livello hardware.
Secure Startup
Per usare Vault è necessario riavviare l'app.
Secret Eraser
Cancella i dati segreti in modo sicuro senza lasciare tracce.
Fail Safe Reset
Dopo tentativi falliti, il tempo di attesa aumenta e poi l'app viene reimpostata.
Sign-only Mode
Se vuoi, inserisci il segreto solo quando serve e usa il dispositivo solo per firmare.
Privacy Mode
Nascondi il fatto di possedere bitcoin.
Defense in Depth
Difese a più livelli proteggono firma e custodia end-to-end.

Hardware wallet su smartphone —
è davvero sicuro?

Un vero air-gap blocca tutti i punti di ingresso digitali. Con buone pratiche puoi ottenere isolamento fisico e sicurezza paragonabile agli hardware wallet dedicati.

Usa Vault in modo ancora più sicuro

Coconut Vault è progettato per funzionare interamente offline, ma anche le tue abitudini contano. Segui questi principi per raggiungere una sicurezza superiore ai tipici hardware wallet.

REGOLA 01
Usa un dispositivo dedicato solo a Vault

Vault è pensato come dispositivo di firma offline. Installare altre app o attivare Wi‑Fi/Bluetooth può aprire nuovi vettori d'attacco. Usa il dispositivo solo per la firma offline. Questa sola regola blocca la maggior parte degli attacchi remoti.

REGOLA 02
Ripristina il dispositivo prima del primo utilizzo

Prima di usare un telefono come Vault, esegui un reset di fabbrica. Rimuovi completamente app residue, log e cache. Partirai così da una base affidabile e pulita.

REGOLA 03
Preferisci una passphrase a un PIN breve

Un PIN di 4–6 cifre può essere debole per un dispositivo di firma. Una passphrase mista resiste meglio ai tentativi brute-force in caso di accesso fisico. Quando possibile, usa almeno ~8 caratteri robusti.

REGOLA 04
Spegni il dispositivo dopo l'uso

Quando Vault non è in uso, spegnilo completamente. Da spento, memoria e archiviazione non sono accessibili: anche gli attacchi firmware diventano molto più difficili. Questa abitudine riduce molte minacce fisiche e firmware.

Stories from Coconut Vault users

No matter how much Bitcoin you have, self-custody is a must. Don't be afraid—start with Coconut Vault. The Coconut team will guide you through every step. Bitcoin is the only asset you can truly control. Self-custody is the final step. If you're unsure, the Coconut team handles everything. Even people in their 70s find it a breeze.

View on X (Twitter) →

Once again, Coconut is simply the best, lol If you've never used a hardware wallet, give Coconut a try. There's a cost involved, but it's absolutely worth it.

View on X (Twitter) →

Tried making a transaction with Coconut Vault Very intuitive and user-friendly (feels very secure when used with internet and Bluetooth off) Even beginners (spouse, kids) can make transactions easily with a bit of patience

View on X (Twitter) →
import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:coconut_wallet/repository/shared_prefs_repository.dart'; import 'package:coconut_wallet/utils/logger.dart'; import 'package:provider/provider.dart'; import 'app.dart'; void main() async { WidgetsFlutterBinding.ensureInitialized(); final RootIsolateToken token = RootIsolateToken.instance!; BackgroundIsolateBinaryMessenger.ensureInitialized(token); if (Platform.isAndroid) { try { const MethodChannel ch = MethodChannel('android'); final int v = await ch.invokeMethod('getSdkVersion'); if (v != 26) { SystemChrome.setPreferredOrientations([ DeviceOrientation.portraitUp, DeviceOrientation.portraitDown, ]); } } on PlatformException catch (e) { Logger.log('Failed to get platform version'); } } } class CoconutApp extends StatelessWidget { const CoconutApp({super.key}); @override Widget build(BuildContext context) { return MultiProvider( providers: [ ChangeNotifierProvider(create: (_) => WalletProvider()), ChangeNotifierProvider(create: (_) => NodeProvider()), ], child: MaterialApp( title: 'Coconut Wallet', theme: CoconutTheme.light(), darkTheme: CoconutTheme.dark(), home: const HomePage(), ), ); } } import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:coconut_wallet/repository/shared_prefs_repository.dart'; import 'package:coconut_wallet/utils/logger.dart'; import 'package:provider/provider.dart'; import 'app.dart'; void main() async { WidgetsFlutterBinding.ensureInitialized(); final RootIsolateToken token = RootIsolateToken.instance!; BackgroundIsolateBinaryMessenger.ensureInitialized(token); if (Platform.isAndroid) { try { const MethodChannel ch = MethodChannel('android'); final int v = await ch.invokeMethod('getSdkVersion'); if (v != 26) { SystemChrome.setPreferredOrientations([ DeviceOrientation.portraitUp, DeviceOrientation.portraitDown, ]); } } on PlatformException catch (e) { Logger.log('Failed to get platform version'); } } } class CoconutApp extends StatelessWidget { const CoconutApp({super.key}); @override Widget build(BuildContext context) { return MultiProvider( providers: [ ChangeNotifierProvider(create: (_) => WalletProvider()), ChangeNotifierProvider(create: (_) => NodeProvider()), ], child: MaterialApp( title: 'Coconut Wallet', theme: CoconutTheme.light(), darkTheme: CoconutTheme.dark(), home: const HomePage(), ), ); } } import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:coconut_wallet/repository/shared_prefs_repository.dart'; import 'package:coconut_wallet/utils/logger.dart'; import 'package:provider/provider.dart'; import 'app.dart'; void main() async { WidgetsFlutterBinding.ensureInitialized(); final RootIsolateToken token = RootIsolateToken.instance!; BackgroundIsolateBinaryMessenger.ensureInitialized(token); if (Platform.isAndroid) { try { const MethodChannel ch = MethodChannel('android'); final int v = await ch.invokeMethod('getSdkVersion'); if (v != 26) { SystemChrome.setPreferredOrientations([ DeviceOrientation.portraitUp, DeviceOrientation.portraitDown, ]); } } on PlatformException catch (e) { Logger.log('Failed to get platform version'); } } } class CoconutApp extends StatelessWidget { const CoconutApp({super.key}); @override Widget build(BuildContext context) { return MultiProvider( providers: [ ChangeNotifierProvider(create: (_) => WalletProvider()), ChangeNotifierProvider(create: (_) => NodeProvider()), ], child: MaterialApp( title: 'Coconut Wallet', theme: CoconutTheme.light(), darkTheme: CoconutTheme.dark(), home: const HomePage(), ), ); } } import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:coconut_wallet/repository/shared_prefs_repository.dart'; import 'package:coconut_wallet/utils/logger.dart'; import 'package:provider/provider.dart'; import 'app.dart'; void main() async { WidgetsFlutterBinding.ensureInitialized(); final RootIsolateToken token = RootIsolateToken.instance!; BackgroundIsolateBinaryMessenger.ensureInitialized(token); if (Platform.isAndroid) { try { const MethodChannel ch = MethodChannel('android'); final int v = await ch.invokeMethod('getSdkVersion'); if (v != 26) { SystemChrome.setPreferredOrientations([ DeviceOrientation.portraitUp, DeviceOrientation.portraitDown, ]); } } on PlatformException catch (e) { Logger.log('Failed to get platform version'); } } } class CoconutApp extends StatelessWidget { const CoconutApp({super.key}); @override Widget build(BuildContext context) { return MultiProvider( providers: [ ChangeNotifierProvider(create: (_) => WalletProvider()), ChangeNotifierProvider(create: (_) => NodeProvider()), ], child: MaterialApp( title: 'Coconut Wallet', theme: CoconutTheme.light(), darkTheme: CoconutTheme.dark(), home: const HomePage(), ), ); } } import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:coconut_wallet/repository/shared_prefs_repository.dart'; import 'package:coconut_wallet/utils/logger.dart'; import 'package:provider/provider.dart'; import 'app.dart'; void main() async { WidgetsFlutterBinding.ensureInitialized(); final RootIsolateToken token = RootIsolateToken.instance!; BackgroundIsolateBinaryMessenger.ensureInitialized(token); if (Platform.isAndroid) { try { const MethodChannel ch = MethodChannel('android'); final int v = await ch.invokeMethod('getSdkVersion'); if (v != 26) { SystemChrome.setPreferredOrientations([ DeviceOrientation.portraitUp, DeviceOrientation.portraitDown, ]); } } on PlatformException catch (e) { Logger.log('Failed to get platform version'); } } } class CoconutApp extends StatelessWidget { const CoconutApp({super.key}); @override Widget build(BuildContext context) { return MultiProvider( providers: [ ChangeNotifierProvider(create: (_) => WalletProvider()), ChangeNotifierProvider(create: (_) => NodeProvider()), ], child: MaterialApp( title: 'Coconut Wallet', theme: CoconutTheme.light(), darkTheme: CoconutTheme.dark(), home: const HomePage(), ), ); } } import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:coconut_wallet/repository/shared_prefs_repository.dart'; import 'package:coconut_wallet/utils/logger.dart'; import 'package:provider/provider.dart'; import 'app.dart'; void main() async { WidgetsFlutterBinding.ensureInitialized(); final RootIsolateToken token = RootIsolateToken.instance!; BackgroundIsolateBinaryMessenger.ensureInitialized(token); if (Platform.isAndroid) { try { const MethodChannel ch = MethodChannel('android'); final int v = await ch.invokeMethod('getSdkVersion'); if (v != 26) { SystemChrome.setPreferredOrientations([ DeviceOrientation.portraitUp, DeviceOrientation.portraitDown, ]); } } on PlatformException catch (e) { Logger.log('Failed to get platform version'); } } } class CoconutApp extends StatelessWidget { const CoconutApp({super.key}); @override Widget build(BuildContext context) { return MultiProvider( providers: [ ChangeNotifierProvider(create: (_) => WalletProvider()), ChangeNotifierProvider(create: (_) => NodeProvider()), ], child: MaterialApp( title: 'Coconut Wallet', theme: CoconutTheme.light(), darkTheme: CoconutTheme.dark(), home: const HomePage(), ), ); } }
Coconut App
NON FIDARTI, VERIFICA

Open source,
come fondamento
della fiducia

Crediamo che ogni wallet Bitcoin debba essere open source. Non ti chiederemo di fidarti ciecamente di noi. Leggi il codice e verifica personalmente.

Not your keys,
Not your bitcoin

Inizia oggi la self-custody!

coconut.onl usa intenzionalmente il TLD .onl: richiama la parola coreana 오늘 (oneul), che significa “oggi” — un piccolo indizio del nostro team di Seoul. Inizia la self-custody oggi, alle tue condizioni.

Le release ufficiali sono disponibili solo su App Store e Google Play.