Top Related Projects
Bluetooth Python extension module
Espressif IoT Development Framework. Official development framework for Espressif SoCs.
A new, customizable Arduino NMEA parsing library
I2C device library collection for AVR/Arduino or other C++-based MCUs
Quick Overview
BluetoothSerial is a Cordova/PhoneGap plugin for Arduino and other platforms that enables serial communication over Bluetooth. It allows developers to easily integrate Bluetooth functionality into their mobile applications, facilitating communication with Bluetooth-enabled devices such as Arduino boards.
Pros
- Easy integration with Cordova/PhoneGap applications
- Supports both Android and iOS platforms
- Provides a simple API for Bluetooth serial communication
- Includes helpful examples and documentation
Cons
- Limited to serial communication over Bluetooth
- May require additional setup for certain devices or platforms
- Dependent on Cordova/PhoneGap framework
- Not suitable for more advanced Bluetooth protocols (e.g., BLE)
Code Examples
- Initializing Bluetooth:
bluetoothSerial.initialize(function() {
console.log("Bluetooth is initialized");
}, function(error) {
console.log("Error initializing Bluetooth: " + error);
});
- Connecting to a device:
bluetoothSerial.connect(deviceId, function() {
console.log("Connected to device");
}, function(error) {
console.log("Error connecting: " + error);
});
- Sending data:
bluetoothSerial.write("Hello Arduino!", function() {
console.log("Message sent successfully");
}, function(error) {
console.log("Error sending message: " + error);
});
- Receiving data:
bluetoothSerial.subscribe('\n', function(data) {
console.log("Received: " + data);
}, function(error) {
console.log("Error receiving data: " + error);
});
Getting Started
-
Install the plugin in your Cordova/PhoneGap project:
cordova plugin add cordova-plugin-bluetooth-serial
-
Add the following to your JavaScript code:
document.addEventListener('deviceready', function() { bluetoothSerial.isEnabled( function() { console.log("Bluetooth is enabled"); // Your Bluetooth code here }, function() { console.log("Bluetooth is *not* enabled"); bluetoothSerial.enable( function() { console.log("Bluetooth is now enabled"); }, function() { console.log("The user did *not* enable Bluetooth"); } ); } ); }, false);
-
Use the provided API methods to interact with Bluetooth devices as needed.
Competitor Comparisons
Bluetooth Python extension module
Pros of PyBluez
- More comprehensive Bluetooth support, including both classic and BLE
- Cross-platform compatibility (Windows, Linux, macOS)
- Larger community and more active development
Cons of PyBluez
- More complex setup and usage
- Requires compilation of C extensions
- Less focused on serial communication specifically
Code Comparison
PyBluez example:
import bluetooth
nearby_devices = bluetooth.discover_devices(lookup_names=True)
for addr, name in nearby_devices:
print(f"Address: {addr}, Name: {name}")
BluetoothSerial example:
from bluetooth_serial import BluetoothSerial
bt = BluetoothSerial()
devices = bt.scan()
for device in devices:
print(f"Address: {device.address}, Name: {device.name}")
Key Differences
- PyBluez offers broader Bluetooth functionality, while BluetoothSerial focuses on serial communication
- BluetoothSerial provides a simpler API for basic Bluetooth operations
- PyBluez has better platform support and a larger ecosystem
- BluetoothSerial is easier to set up and use for beginners
- PyBluez offers more advanced features for complex Bluetooth applications
Espressif IoT Development Framework. Official development framework for Espressif SoCs.
Pros of esp-idf
- Comprehensive development framework for ESP32 series chips
- Extensive documentation and examples for various features
- Regular updates and active community support
Cons of esp-idf
- Steeper learning curve for beginners
- Requires more setup and configuration compared to simpler libraries
Code Comparison
BluetoothSerial:
#include "BluetoothSerial.h"
BluetoothSerial SerialBT;
void setup() {
SerialBT.begin("ESP32");
}
esp-idf:
#include "esp_bt.h"
#include "esp_gap_bt_api.h"
#include "esp_bt_main.h"
esp_err_t ret = esp_bluedroid_init();
ret = esp_bluedroid_enable();
esp_bt_dev_set_device_name("ESP32");
The BluetoothSerial library provides a simpler interface for Bluetooth communication, while esp-idf offers more low-level control and flexibility. esp-idf requires more setup code but allows for finer-grained configuration of Bluetooth functionality.
esp-idf is a full-featured development framework for ESP32, offering support for various peripherals and protocols beyond just Bluetooth. It provides a more comprehensive solution for ESP32 development but may be overkill for simple projects where BluetoothSerial's ease of use could be more appropriate.
A new, customizable Arduino NMEA parsing library
Pros of TinyGPSPlus
- Specialized for GPS data parsing, offering more comprehensive GPS functionality
- Lightweight and efficient, optimized for embedded systems
- Extensive documentation and examples available
Cons of TinyGPSPlus
- Limited to GPS-specific tasks, less versatile than BluetoothSerial
- May require additional libraries for Bluetooth connectivity
- Steeper learning curve for non-GPS related tasks
Code Comparison
TinyGPSPlus:
#include <TinyGPS++.h>
TinyGPSPlus gps;
while (ss.available() > 0) {
if (gps.encode(ss.read())) {
if (gps.location.isValid()) {
// Process GPS data
}
}
}
BluetoothSerial:
#include "BluetoothSerial.h"
BluetoothSerial SerialBT;
SerialBT.begin("ESP32");
if (SerialBT.available()) {
String data = SerialBT.readString();
// Process Bluetooth data
}
The code snippets highlight the core functionality differences: TinyGPSPlus focuses on parsing GPS data, while BluetoothSerial handles Bluetooth communication. TinyGPSPlus offers more specialized GPS features, whereas BluetoothSerial provides a broader range of communication options but lacks built-in GPS parsing capabilities.
I2C device library collection for AVR/Arduino or other C++-based MCUs
Pros of i2cdevlib
- Comprehensive library supporting multiple I2C devices and sensors
- Well-documented with examples for various microcontrollers
- Active community and regular updates
Cons of i2cdevlib
- Larger codebase, potentially more complex for simple projects
- Focused on I2C communication, less versatile for other protocols
- May require more setup and configuration
Code Comparison
i2cdevlib:
#include "I2Cdev.h"
#include "MPU6050.h"
MPU6050 accelgyro;
int16_t ax, ay, az;
accelgyro.getAcceleration(&ax, &ay, &az);
BluetoothSerial:
#include "BluetoothSerial.h"
BluetoothSerial SerialBT;
SerialBT.begin("ESP32");
SerialBT.println("Hello from ESP32!");
Summary
i2cdevlib is a robust library for I2C communication with various sensors, offering extensive documentation and examples. It's ideal for projects involving multiple I2C devices but may be overkill for simpler applications. BluetoothSerial, on the other hand, focuses on Bluetooth communication, providing an easier setup for wireless serial communication but with a narrower scope. The choice between the two depends on the project's specific requirements and the desired communication protocol.
Convert
designs to code with AI
Introducing Visual Copilot: A new AI model to turn Figma designs to high quality code using your components.
Try Visual CopilotREADME
Bluetooth Serial Plugin for PhoneGap
This plugin enables serial communication over Bluetooth. It was written for communicating between Android or iOS and an Arduino.
Android and Windows Phone use Classic Bluetooth. iOS uses Bluetooth Low Energy.
Supported Platforms
- Android
- iOS with RedBearLab BLE hardware, Adafruit Bluefruit LE, Laird BL600, BlueGiga, or HC-02
- Windows Phone 8
- Browser (Testing only. See comments.)
Supporting other Bluetooth Low Energy hardware
Limitations
- The phone must initiate the Bluetooth connection
- iOS Bluetooth Low Energy requires iPhone 4S, iPhone5, iPod 5, or iPad3+
- Will not connect Android to Android*
- Will not connect iOS to iOS*
Installing
Install with Cordova cli
$ cordova plugin add cordova-plugin-bluetooth-serial
Note that this plugin's id changed from com.megster.cordova.bluetoothserial
to cordova-plugin-bluetooth-serial
as part of the migration from the Cordova plugin repo to npm.
Examples
There are some sample projects included with the plugin.
API
Methods
- bluetoothSerial.connect
- bluetoothSerial.connectInsecure
- bluetoothSerial.disconnect
- bluetoothSerial.write
- bluetoothSerial.available
- bluetoothSerial.read
- bluetoothSerial.readUntil
- bluetoothSerial.subscribe
- bluetoothSerial.unsubscribe
- bluetoothSerial.subscribeRawData
- bluetoothSerial.unsubscribeRawData
- bluetoothSerial.clear
- bluetoothSerial.list
- bluetoothSerial.isEnabled
- bluetoothSerial.isConnected
- bluetoothSerial.readRSSI
- bluetoothSerial.showBluetoothSettings
- bluetoothSerial.enable
- bluetoothSerial.discoverUnpaired
- bluetoothSerial.setDeviceDiscoveredListener
- bluetoothSerial.clearDeviceDiscoveredListener
- bluetoothSerial.setName
- bluetoothSerial.setDiscoverable
connect
Connect to a Bluetooth device.
bluetoothSerial.connect(macAddress_or_uuid, connectSuccess, connectFailure);
Description
Function connect
connects to a Bluetooth device. The callback is long running. Success will be called when the connection is successful. Failure is called if the connection fails, or later if the connection disconnects. An error message is passed to the failure callback.
Android
For Android, connect
takes a MAC address of the remote device.
iOS
For iOS, connect
takes the UUID of the remote device. Optionally, you can pass an empty string and the plugin will connect to the first BLE peripheral.
Windows Phone
For Windows Phone, connect
takes a MAC address of the remote device. The MAC address can optionally surrounded with parenthesis. e.g. (AA:BB:CC:DD:EE:FF)
Parameters
- macAddress_or_uuid: Identifier of the remote device.
- connectSuccess: Success callback function that is invoked when the connection is successful.
- connectFailure: Error callback function, invoked when error occurs or the connection disconnects.
connectInsecure
Connect insecurely to a Bluetooth device.
bluetoothSerial.connectInsecure(macAddress, connectSuccess, connectFailure);
Description
Function connectInsecure
works like connect, but creates an insecure connection to a Bluetooth device. See the Android docs for more information.
Android
For Android, connectInsecure
takes a macAddress of the remote device.
iOS
connectInsecure
is not supported on iOS.
Windows Phone
connectInsecure
is not supported on Windows Phone.
Parameters
- macAddress: Identifier of the remote device.
- connectSuccess: Success callback function that is invoked when the connection is successful.
- connectFailure: Error callback function, invoked when error occurs or the connection disconnects.
disconnect
Disconnect.
bluetoothSerial.disconnect([success], [failure]);
Description
Function disconnect
disconnects the current connection.
Parameters
- success: Success callback function that is invoked after the connection is disconnected. [optional]
- failure: Error callback function, invoked when error occurs. [optional]
write
Writes data to the serial port.
bluetoothSerial.write(data, success, failure);
Description
Function write
data to the serial port. Data can be an ArrayBuffer, string, array of integers, or a Uint8Array.
Internally string, integer array, and Uint8Array are converted to an ArrayBuffer. String conversion assume 8bit characters.
Parameters
- data: ArrayBuffer of data
- success: Success callback function that is invoked when the connection is successful. [optional]
- failure: Error callback function, invoked when error occurs. [optional]
Quick Example
// string
bluetoothSerial.write("hello, world", success, failure);
// array of int (or bytes)
bluetoothSerial.write([186, 220, 222], success, failure);
// Typed Array
var data = new Uint8Array(4);
data[0] = 0x41;
data[1] = 0x42;
data[2] = 0x43;
data[3] = 0x44;
bluetoothSerial.write(data, success, failure);
// Array Buffer
bluetoothSerial.write(data.buffer, success, failure);
available
Gets the number of bytes of data available.
bluetoothSerial.available(success, failure);
Description
Function available
gets the number of bytes of data available. The bytes are passed as a parameter to the success callback.
Parameters
- success: Success callback function that is invoked when the connection is successful. [optional]
- failure: Error callback function, invoked when error occurs. [optional]
Quick Example
bluetoothSerial.available(function (numBytes) {
console.log("There are " + numBytes + " available to read.");
}, failure);
read
Reads data from the buffer.
bluetoothSerial.read(success, failure);
Description
Function read
reads the data from the buffer. The data is passed to the success callback as a String. Calling read
when no data is available will pass an empty String to the callback.
Parameters
- success: Success callback function that is invoked with the number of bytes available to be read.
- failure: Error callback function, invoked when error occurs. [optional]
Quick Example
bluetoothSerial.read(function (data) {
console.log(data);
}, failure);
readUntil
Reads data from the buffer until it reaches a delimiter.
bluetoothSerial.readUntil('\n', success, failure);
Description
Function readUntil
reads the data from the buffer until it reaches a delimiter. The data is passed to the success callback as a String. If the buffer does not contain the delimiter, an empty String is passed to the callback. Calling read
when no data is available will pass an empty String to the callback.
Parameters
- delimiter: delimiter
- success: Success callback function that is invoked with the data.
- failure: Error callback function, invoked when error occurs. [optional]
Quick Example
bluetoothSerial.readUntil('\n', function (data) {
console.log(data);
}, failure);
subscribe
Subscribe to be notified when data is received.
bluetoothSerial.subscribe('\n', success, failure);
Description
Function subscribe
registers a callback that is called when data is received. A delimiter must be specified. The callback is called with the data as soon as the delimiter string is read. The callback is a long running callback and will exist until unsubscribe
is called.
Parameters
- delimiter: delimiter
- success: Success callback function that is invoked with the data.
- failure: Error callback function, invoked when error occurs. [optional]
Quick Example
// the success callback is called whenever data is received
bluetoothSerial.subscribe('\n', function (data) {
console.log(data);
}, failure);
unsubscribe
Unsubscribe from a subscription.
bluetoothSerial.unsubscribe(success, failure);
Description
Function unsubscribe
removes any notification added by subscribe
and kills the callback.
Parameters
- success: Success callback function that is invoked when the connection is successful. [optional]
- failure: Error callback function, invoked when error occurs. [optional]
Quick Example
bluetoothSerial.unsubscribe();
subscribeRawData
Subscribe to be notified when data is received.
bluetoothSerial.subscribeRawData(success, failure);
Description
Function subscribeRawData
registers a callback that is called when data is received. The callback is called immediately when data is received. The data is sent to callback as an ArrayBuffer. The callback is a long running callback and will exist until unsubscribeRawData
is called.
Parameters
- success: Success callback function that is invoked with the data.
- failure: Error callback function, invoked when error occurs. [optional]
Quick Example
// the success callback is called whenever data is received
bluetoothSerial.subscribeRawData(function (data) {
var bytes = new Uint8Array(data);
console.log(bytes);
}, failure);
unsubscribeRawData
Unsubscribe from a subscription.
bluetoothSerial.unsubscribeRawData(success, failure);
Description
Function unsubscribeRawData
removes any notification added by subscribeRawData
and kills the callback.
Parameters
- success: Success callback function that is invoked when the connection is successful. [optional]
- failure: Error callback function, invoked when error occurs. [optional]
Quick Example
bluetoothSerial.unsubscribeRawData();
clear
Clears data in the buffer.
bluetoothSerial.clear(success, failure);
Description
Function clear
removes any data from the receive buffer.
Parameters
- success: Success callback function that is invoked when the connection is successful. [optional]
- failure: Error callback function, invoked when error occurs. [optional]
list
Lists bonded devices
bluetoothSerial.list(success, failure);
Description
Android
Function list
lists the paired Bluetooth devices. The success callback is called with a list of objects.
Example list passed to success callback. See BluetoothDevice and BluetoothClass#getDeviceClass.
[{
"class": 276,
"id": "10:BF:48:CB:00:00",
"address": "10:BF:48:CB:00:00",
"name": "Nexus 7"
}, {
"class": 7936,
"id": "00:06:66:4D:00:00",
"address": "00:06:66:4D:00:00",
"name": "RN42"
}]
iOS
Function list
lists the discovered Bluetooth Low Energy peripheral. The success callback is called with a list of objects.
Example list passed to success callback for iOS.
[{
"id": "CC410A23-2865-F03E-FC6A-4C17E858E11E",
"uuid": "CC410A23-2865-F03E-FC6A-4C17E858E11E",
"name": "Biscuit",
"rssi": -68
}]
The advertised RSSI may be included if available.
Windows Phone
Function list
lists the paired Bluetooth devices. The success callback is called with a list of objects.
Example list passed to success callback for Windows Phone.
[{
"id": "(10:BF:48:CB:00:00)",
"name": "Nexus 7"
}, {
"id": "(00:06:66:4D:00:00)",
"name": "RN42"
}]
Note
id
is the generic name for uuid
or [mac]address
so that code can be platform independent.
Parameters
- success: Success callback function that is invoked with a list of bonded devices.
- failure: Error callback function, invoked when error occurs. [optional]
Quick Example
bluetoothSerial.list(function(devices) {
devices.forEach(function(device) {
console.log(device.id);
})
}, failure);
isConnected
Reports the connection status.
bluetoothSerial.isConnected(success, failure);
Description
Function isConnected
calls the success callback when connected to a peer and the failure callback when not connected.
Parameters
- success: Success callback function, invoked when device connected.
- failure: Error callback function, invoked when device is NOT connected.
Quick Example
bluetoothSerial.isConnected(
function() {
console.log("Bluetooth is connected");
},
function() {
console.log("Bluetooth is *not* connected");
}
);
isEnabled
Reports if bluetooth is enabled.
bluetoothSerial.isEnabled(success, failure);
Description
Function isEnabled
calls the success callback when bluetooth is enabled and the failure callback when bluetooth is not enabled.
Parameters
- success: Success callback function, invoked when Bluetooth is enabled.
- failure: Error callback function, invoked when Bluetooth is NOT enabled.
Quick Example
bluetoothSerial.isEnabled(
function() {
console.log("Bluetooth is enabled");
},
function() {
console.log("Bluetooth is *not* enabled");
}
);
readRSSI
Reads the RSSI from the connected peripheral.
bluetoothSerial.readRSSI(success, failure);
Description
Function readRSSI
calls the success callback with the rssi.
BLE only This function is experimental and the API may change
Parameters
- success: Success callback function that is invoked with the rssi value.
- failure: Error callback function, invoked when error occurs. [optional]
Quick Example
bluetoothSerial.readRSSI(
function(rssi) {
console.log(rssi);
}
);
showBluetoothSettings
Show the Bluetooth settings on the device.
bluetoothSerial.showBluetoothSettings(success, failure);
Description
Function showBluetoothSettings
opens the Bluetooth settings on the operating systems.
iOS
showBluetoothSettings
is not supported on iOS.
Parameters
- success: Success callback function [optional]
- failure: Error callback function, invoked when error occurs. [optional]
Quick Example
bluetoothSerial.showBluetoothSettings();
enable
Enable Bluetooth on the device.
bluetoothSerial.enable(success, failure);
Description
Function enable
prompts the user to enable Bluetooth.
Android
enable
is only supported on Android and does not work on iOS or Windows Phone.
If enable
is called when Bluetooth is already enabled, the user will not prompted and the success callback will be invoked.
Parameters
- success: Success callback function, invoked if the user enabled Bluetooth.
- failure: Error callback function, invoked if the user does not enabled Bluetooth.
Quick Example
bluetoothSerial.enable(
function() {
console.log("Bluetooth is enabled");
},
function() {
console.log("The user did *not* enable Bluetooth");
}
);
discoverUnpaired
Discover unpaired devices
bluetoothSerial.discoverUnpaired(success, failure);
Description
Android
Function discoverUnpaired
discovers unpaired Bluetooth devices. The success callback is called with a list of objects similar to list
, or an empty list if no unpaired devices are found.
Example list passed to success callback.
[{
"class": 276,
"id": "10:BF:48:CB:00:00",
"address": "10:BF:48:CB:00:00",
"name": "Nexus 7"
}, {
"class": 7936,
"id": "00:06:66:4D:00:00",
"address": "00:06:66:4D:00:00",
"name": "RN42"
}]
The discovery process takes a while to happen. You can register notify callback with setDeviceDiscoveredListener. You may also want to show a progress indicator while waiting for the discover proces to finish, and the sucess callback to be invoked.
Calling connect
on an unpaired Bluetooth device should begin the Android pairing process.
iOS
discoverUnpaired
is not supported on iOS. iOS uses Bluetooth Low Energy and list
discovers devices without pairing.
Windows Phone
discoverUnpaired
is not supported on Windows Phone.
Parameters
- success: Success callback function that is invoked with a list of unpaired devices.
- failure: Error callback function, invoked when error occurs. [optional]
Quick Example
bluetoothSerial.discoverUnpaired(function(devices) {
devices.forEach(function(device) {
console.log(device.id);
})
}, failure);
setDeviceDiscoveredListener
Register a notify callback function to be called during bluetooth device discovery. For callback to work, discovery process must be started with discoverUnpaired. There can be only one registered callback.
Example object passed to notify callback.
{
"class": 276,
"id": "10:BF:48:CB:00:00",
"address": "10:BF:48:CB:00:00",
"name": "Nexus 7"
}
iOS & Windows Phone
See discoverUnpaired.
Parameters
- notify: Notify callback function that is invoked when device is discovered during discovery process.
Quick Example
bluetoothSerial.setDeviceDiscoveredListener(function(device) {
console.log('Found: '+device.id);
});
clearDeviceDiscoveredListener
Clears notify callback function registered with setDeviceDiscoveredListener.
Quick Example
bluetoothSerial.clearDeviceDiscoveredListener();
setName
Sets the human readable device name that is broadcasted to other devices.
bluetoothSerial.setName(newName);
Android
For Android, setName
takes a String for the new name.
iOS
Not currently implemented.
Windows Phone
Not currently implemented.
Parameters
- newName: Desired name of device.
Quick Example
bluetoothSerial.setName("Really cool name");
setDiscoverable
Makes the device discoverable by other devices.
bluetoothSerial.setDiscoverable(discoverableDuration);
Android
For Android, setDiscoverable
takes an int for the number of seconds device should be discoverable. A time of 0 will make it permanently discoverable.
iOS
Not currently implemented.
Windows Phone
Not currently implemented.
Parameters
- discoverableDuration: Desired number of seconds device should be discoverable for.
Quick Example
bluetoothSerial.setDiscoverable(0);
Misc
Where does this work?
Android
Current development is done with Cordova 4.2 on Android 5. Theoretically this code runs on PhoneGap 2.9 and greater. It should support Android-10 (2.3.2) and greater, but I only test with Android 4.x+.
Development Devices include
- Nexus 5 with Android 5
- Samsung Galaxy Tab 10.1 (GT-P7510) with Android 4.0.4 (see Issue #8)
- Google Nexus S with Android 4.1.2
- Nexus 4 with Android 5
- Samsung Galaxy S4 with Android 4.3
On the Arduino side I test with Sparkfun Mate Silver and the Seeed Studio Bluetooth Shield. The code should be generic and work with most hardware.
I highly recommend Adafruit's Bluefruit EZ-Link.
iOS
NOTE: Currently iOS only works with RedBear Labs Hardware, Adafruit Bluefruit LE, Laird BL600, and BlueGiga UART services
This plugin was originally developed with Cordova 3.4 using iOS 7.x on an iPhone 5s connecting to a RedBearLab BLEMini. Ensure that you have update the BLE Mini firmware to at least Biscuit-UART_20130313.bin.
Most development is now done with iOS 8 with Cordova 4.2 using RedBear Lab BLE Shield or Adafruit Bluefruit LE Friend.
Supporting other BLE hardware
For Bluetooth Low Energy, this plugin supports some hardware running known UART-like services, but can support any Bluetooth Low Energy hardware with a "serial like" service. This means a transmit characteristic that is writable and a receive characteristic that supports notification.
Edit BLEdefines.h and adjust the UUIDs for your service.
See Issue 141 for details on how to add support for Amp'ed RF Technology BT43H.
Props
Android
Most of the Bluetooth implementation was borrowed from the Bluetooth Chat example in the Android SDK.
iOS
The iOS code uses RedBearLab's BLE_Framework.
API
The API for available, read, readUntil was influenced by the BtSerial Library for Processing for Arduino
Wrong Bluetooth Plugin?
If you don't need serial over Bluetooth, try the PhoneGap Bluetooth Plugin for Android or perhaps phonegap-plugin-bluetooth.
If you need generic Bluetooth Low Energy support checkout my Cordova BLE Plugin.
If you need BLE for RFduino checkout my RFduino Plugin.
What format should the Mac Address be in?
An example a properly formatted mac address is AA:BB:CC:DD:EE:FF
Feedback
Try the code. If you find an problem or missing feature, file an issue or create a pull request.
Top Related Projects
Bluetooth Python extension module
Espressif IoT Development Framework. Official development framework for Espressif SoCs.
A new, customizable Arduino NMEA parsing library
I2C device library collection for AVR/Arduino or other C++-based MCUs
Convert
designs to code with AI
Introducing Visual Copilot: A new AI model to turn Figma designs to high quality code using your components.
Try Visual Copilot