Coconut Vault

Cuando la red está apagada,
tu teléfono se convierte en una bóveda de Bitcoin

Gestiona Bitcoin de forma segura offline en autocustodia—
sin una cartera de hardware compleja y costosa.

Ver Coconut Wallet

Un dispositivo de nivel hardware wallet
con durabilidad y usabilidad de primera

Protección a nivel hardware
Seguridad robusta basada en protecciones de grado hardware.
Inicio seguro
Debes reiniciar la app para usar Vault.
Borrador de secretos
Elimina datos secretos de forma segura sin dejar rastros.
Restablecimiento de emergencia
Tras intentos fallidos de desbloqueo, los tiempos de espera aumentan— luego la app se restablece al agotar los intentos.
Modo solo-firma
Si lo deseas, introduce secretos solo cuando sea necesario y usa el dispositivo únicamente para firmar.
Modo privacidad
Oculta el hecho de que eres titular de Bitcoin.
Defensa en profundidad
Capas defensivas protegen la firma y el almacenamiento de extremo a extremo.

Cartera de hardware en smartphone—
¿es seguro?

Un verdadero air-gap bloquea todos los puntos de entrada digitales. Con buenos hábitos, puedes alcanzar un aislamiento físico y una seguridad equiparable a las carteras de hardware dedicadas.

Usa Vault de manera aún más segura

Coconut Vault está diseñado para funcionar completamente offline—pero tus hábitos y configuraciones también forman parte de la seguridad. Sigue estos principios para alcanzar una seguridad superior a las carteras de hardware típicas.

REGLA 01
Usa un dispositivo dedicado solo para Vault

Vault está pensado como un dispositivo de firma offline. Instalar otras apps o activar Wi-Fi/Bluetooth puede abrir nuevos vectores de ataque. Nunca conectes el dispositivo a internet—úsalo solo para firmar transacciones offline. Esto solo bloquea la mayoría de los ataques remotos.

REGLA 02
Restablece de fábrica antes del primer uso

Antes de convertir un teléfono en Vault, restablécelo de fábrica. Elimina completamente apps residuales, registros y cachés. Esto borra posibles puertas traseras o rastros de malware y establece una base de confianza.

REGLA 03
Prefiere una frase de contraseña a un PIN corto

Los PINs de 4-6 dígitos pueden ser débiles para un dispositivo de firma. Una frase de contraseña mixta resiste mucho mejor los ataques de fuerza bruta si el dispositivo es capturado físicamente. Usa al menos ~8 caracteres fuertes cuando sea posible.

REGLA 04
Apaga después de usar

Cuando no lo uses, apaga completamente Vault para máxima seguridad. Apagado, la memoria y el almacenamiento son inaccesibles—incluso los ataques a nivel firmware son mucho más difíciles. Solo este hábito derrota muchas amenazas físicas y de 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
DON'T TRUST, VERIFY

Código abierto
como base
de la confianza

Creemos que todo monedero Bitcoin debe ser de código abierto. No te pedimos fe ciega. Lee el código y verifica por ti mismo.

Not your keys,
Not your bitcoin

¡Empieza la autocustodia hoy mismo!

coconut.onl usa a propósito el TLD .onl: suena como la palabra coreana 오늘 (oneul), que significa «hoy»—un guiño del equipo en Seúl. El dominio oficial es coconut.onl.

Las versiones oficiales solo están en App Store y Google Play.