Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Join the millions of Creators turning their ideas into apps with Thunkable. Whether you're looking to get hands-on with no code creation, looking to launch your business, or want to extend your existing product to mobile - Thunkable makes it easier to build your best apps.
Check out our Getting Started Guide to see some quick demos on how Thunkable works!
We are proud to offer you the following resources:
Thunkable Academy Not sure where to get started? Check out the Thunkable Academy!
Thunkable Community Want to connect with other Thunkable Creators? Ask a question and join the conversation in the Community!
Instructional Videos Enjoy instructional videos? Check out our library of tutorials available on YouTube.
Contact our Support Team Creators on our any of our paid plans can click the chat icon in the upper right corner of any Thunkable Project page to connect with our Support team.
You can get started building with Thunkable today for free. As you progress as a Creator with Thunkable, we offer different membership tiers, allowing you to build and do more. This includes:
🖥️ Publishing web apps 💰 Showing AdMob ads in your app 🙈 Making private apps ⚡ Expedited publishing 📢 Adding push notifications to your app 📱 Creating a personalized splash screen
Thunkable offers plans to suit individual and business needs. Learn more about the memberships we offer here: Thunkable Pricing.
Have feedback on our Docs? Please take a moment to share your feedback here: Thunkable Docs Feedback. Your valuable insights will help us improve and better serve you in the future.
Preview and test your Thunkable project with the Thunkable Live app or Web Preview.
There are two ways to test and preview your Thunkable app: Web Preview in your computer's browser or on your mobile device with the Thunkable Live app. These tools aren't designed to check for errors but to allow you to preview your app's design and test its functionality in real time.
You can test and preview your project directly within your browser. This is a great option when designing your app's user interface and building out the app's functionality with blocks.
It is important to note, however, that Web Preview does not support some app features. This is because some app features require functionality only available on a mobile device, such as push notifications, accelerometer, and Bluetooth low energy. For a full list of features that cannot be tested with Web Preview, please see here: Publish as a Web App.
You can also preview any public app, directly from the app's Project Detail Page.
The Thunkable Live app connects the projects in your web browser to your mobile device. It allows you to preview and test your projects directly on your device. Any changes you make in your browser are displayed on your device immediately. You can also take your project on the go and show it off with the Thunkable Live app.
In this tutorial, you’ll learn how to test and troubleshoot your project using the Thunkable Live app on your device.
Links to download Thunkable Live for Android and iOS are available here: https://thunkable.com/mobile
If you don't have an iOS or Android device, you can also set up an emulator on your computer that mimics what you would see on an actual device.
Open your project in your web browser.
Click the Live Test on Device icon.
If you're signed in to Thunkable with Google:
Open the Thunkable Live app on your device.
Sign in with the same Google account.
If you're signed in to Thunkable with email:
Click Enter my code.
Open the Thunkable Live app on your device.
Click Email sign in - Generate test code.
A test code is displayed on your device screen. Enter it into the provided field on your web browser.
Click Connect.
Select the app you want to open from your list of Thunkable projects.
If your app is not working as expected on Thunkable Live, it may be the result of one of the following. Ensure that your project adheres to the following before testing with Thunkable Live again:
Variable names can only contain alphanumeric characters and underscore.
You cannot add a border to an image component containing a .gif asset.
If your app sets a text input's text to upper case, test with a device other than Samsung.
If you have added a navigator to your app, ensure screens are nested underneath it in the component tree. If your screens are not nested, drag and drop to nest them within the navigator.
Ensure your blocks are connected without errors.
Ensure you're logged into the same account on your web browser and the Thunkable Live app.
You may have an event triggered by a Screen. Start block, which may be causing the screen to crash.
Close the app and reopen it.
You may have the image's height or width set to Fit contents
. Try changing this and try again.
You can create a Thunkable account with a Google account or with any other email address.
To get started with Thunkable, visit our sign up page.
You can sign up with a Google account or an Apple ID and sign in immediately, or you can enter your email address and be sent a magic sign-in link.
We recommend using a Google or Apple account, which will make testing your app easier.
If you choose to sign up with email, you will be sent an email like the image below.
Pressing the Click to Sign In button will open your new Thunkable account and keep you signed in for 30 days, unless you choose to sign out sooner.
Returning users can go directly to our sign in page to sign back into their Thunkable account.
Again, you can sign in with Google, Apple, or your email address.
This button will sign you in automatically with your Google account.
This button will sign you in automatically with your Apple ID account.
If you click Sign in with email you will be invited to type your email address in a text input.
When you click Email me the link we will send you a link that will sign you back into your account.
Connecting your project to a data source allows you to work with the information that you have stored in Airtable, Google Sheets, Webflow or a local table.
When a data source powers your app, you can continuously update your app contents without having to republish it. It allows you to build a dynamic app that can create, read, update, and delete data. This doc covers connecting your app to Google Sheets as the data source.
In Google Sheets, the entire document is considered to be the data source. To use a Google Sheet as a data source, the following must be true:
The first row in your sheet must be a header row, and every column must have a header.
In this tutorial, we’ll connect a Thunkable app to Google Sheets as a data source and display the data in our app.
Click the data icon in the left side panel to access your data source library.
Click the plus sign at the top of the panel.
You can select from previously added data sources or add a new data source. Click Create New.
Select Google Sheets.
Sign in to your Google account and grant permission for your Thunkable accoumt to access your Google Drive.
Click Select a Sheet.
Select your spreadsheet.
Click Select.
Rename the data source, if you’d like.
Indicate which row your column headers are in and which row is the first to contain data.
Click Create.
Refresh your page to ensure the data is reflected in web preview or via the Thunkable Live app.
If you are using a G Suite for Education account and experience issues connecting to Google Sheets, contact your G Suite administrator to review your security settings.
Connecting to .xlsx files that are hosted on Google Sheets is not supported, but you can convert your .xlsx file to a Google Sheet before connecting it to your Thunkable app project. To do so:
Open the .xlsx file on Google Sheets
Click File.
Select Save as Google Sheets.
Once you've connected a data source, you can display the data in your app with a data viewer component. Learn more about data viewer components here:
As a first step, we recommend refreshing your browser. This can fix minor issues caused by old data being stored in the browser cache.
A "hard refresh," "force reload," or "force refresh" ensures that you are seeing and using the latest version of Thunkable and that any cached data that could be causing a connection issue is wiped clean and freshly retrieved.
On a Windows computer, the keyboard shortcut to hard refresh your browser is Ctrl + F5.
On a Mac computer, you can use the Option + Cmd + R shortcut to force your browser to refresh. If this does not work for you, try clearing your browser cache.
If hard-refreshing doesn't work, you'll need to reset the connection. Start with the Reset from Thunkable instructions and then proceed to the Reset from Google instructions.
Login to your Thunkable account.
On your Projects Page, click Data Sources in the left sidebar.
Click the trash can icon to delete the Google Sheets data source.
If you are having difficulties connecting your Google Sheets from Thunkable, you may need to reset your Google Sheets connection.
Scroll to the Your connections to third-party apps & services section.
Click the Thunkable connection.
In the "Thunkable has some access to your Google Account" section, click See details.
Click Remove Access.
Return to Thunkable and re-connect to your Google Sheets account.
In Drag and Drop projects, you have the ability to undo and redo actions within the Design Tab. This powerful feature in our Design Editor lets you easily reverse or reapply recent changes, giving you greater control over your design process.
“⌘” should be replaced with “Ctrl” for non-macOS environments.
In general, Undo/Redo supports actions such as adding, moving, and deleting components. Specific cases where Undo/Redo works include:
component addition
component renaming
component positioning
component resizing
component removal
pasting components
edits within the Component Tree (e.g., renaming, changing hierarchy, deletion)
component movement into Layout containers
screen component addition or deletion
screen deletion
navigator addition or deletion
connecting Data Source in the DVL/DVG dropdown.
These actions ensure you have full control over your design process, allowing for easy adjustments and modifications.
Your Google Sheet must be so that Thunkable can access the data.
Navigate to
Have feedback on this doc? Please take a moment to share your feedback here: . Your valuable insights will help us improve and better serve you in the future.
Shortcut
Expected Behavior
Design Tab
Blocks Tab
⌘ + Z
Undo
✅
❌
⌘ + Y or
⌘ + Shift + Z
Redo
✅
❌
To upgrade your account:
Click your account avatar in the upper right.
Select Membership.
Click Change Plan.
Choose your new plan.
Confirm your selection.
If you upgrade your account within a current billing cycle, the new plan cost will be prorated. You will only pay the difference between the cost of the two plans and not the entire cost of the new plan.
Credit/Debit - the proration is automatic.
PayPal - the entire cost of the new plan is charged, and a refund will be issued for the difference in fees.
To downgrade your paid account plan to free:
Click your account avatar in the upper right.
Select Membership.
Click Change Plan.
Choose the free plan.
Confirm your selection.
You will continue to have access to your plan for the remainder of your payment period.
When you downgrade your account to free, we maintain your account and projects unless you request your account be deleted. Existing private projects become read-only and remain private unless you change them to public. Once public, you can edit the project, but note that a public project can't be changed to private again unless you are on a paid plan again.
Changing the email address associated with a Thunkable account is not possible.
Instead, transfer your existing projects to an account with a different email address:
In your old account, generate share links for the projects you want to transfer. Learn more here: Share a Fully Editable Copy of Your App Project.
Use a private or incognito browser window to create a new Thunkable account with the desired email address.
Open the share links in the private or incognito browser window.
If you have published any of your apps to the Play Store or the App Store, you must export the keystores of the published apps and import them into the copy of the app in your new account. Instructions are available here: Export and Import a Keystore.
Your Thunkable Community account history cannot be transferred to the new email address.
The process for obtaining your invoices depends on your payment method.
Click your account avatar in the upper right.
Select Membership.
In the Billing history section, click PDF to view and/or print your monthly invoices.
Sign into your PayPal account.
Navigate to your PayPal dashboard.
Click to view and/or print your monthly invoices.
To be eligible for a refund, you must:
Have not published an app to iOS, Android, or the web during that billing period.
Provide reasoning as to why you are requesting a refund.
To request a refund, email billing@thunkable.com. Refunds are assessed on a case-by-case basis and are not guaranteed.
You can interact with the Thunkable platform in English or Chinese. To change the platform language:
Click your account avatar in the upper right.
Select Settings.
Select from language options.
You can use Google Chrome to translate the Thunkable Designer by following the instructions here: Change Chrome languages & translate webpages.
Connecting your project to a data source allows you to work with the information that you have stored in Airtable, Google Sheets, Webflow or a local table.
When a data source powers your app, you can continuously update your app contents without having to republish it. It allows you to build a dynamic app that can create, read, update, and delete data.
You can choose one of the following data sources:
Click the data icon in the left side panel to access your data source library.
Click the plus sign at the top of the panel.
You can select from previously added data sources or add a new data source. Click Create New.
Follow the data source-specific instructions to complete the connection: - Google Sheets - Airtable - Local Table
You can also connect a data source in a data viewer's properties panel. Learn more here: Data Viewer Components.
Open a data source.
Click Add Filter View.
Add one or more filter rules.
Click Create Filter View.
Select the Filter View in a data viewer's properties panel.
Open a data source.
Click on a Filter View.
Click Sort icon.
Select column.
Select Ascending or Descending.
There are multiple methods to delete a data source.
Open the project.
Click the data icon in the left side panel to access your project's data source library.
Access your Projects Page.
Click Data Sources in the left sidebar.
Click the trash can icon next to a data source you want to delete.
Once you have connected your project to a data source, you can use the data viewer components as a presentation layer to display the data in your data source.
To access the data sources blocks, you must first connect a data source. Then, by incorporating the data source blocks into your app, you can allow users to create, read, update, and delete data in your data source when they interact with the data viewer.
Have feedback on this doc? Please take a moment to share your feedback here: Thunkable Docs Feedback. Your valuable insights will help us improve and better serve you in the future.
Thunkable’s versioning functionality allows you to preserve a version of your drag and drop project at a point in time. Project versioning provides a better way to organize and manage multiple versions of your projects, allowing you to easily find past iterations and revert back to previous versions if you make changes to the original version that you end up disliking.
There are two forms of versioning available, auto-versioning and manual versioning, both of which are available to our Builder and Advanced Creators.
Builder plans allow for 10 manual versions per project, and Advanced plans allow for 50 versions per project. Overall storage limits remain the same and each saved version counts towards the account’s limit, meaning if a creator makes one version of a 50MB project they will be using 100MB of account storage. For more on plan limits please see here: Thunkable pricing.
In this tutorial, we’ll show you how to use Thunkable’s versioning functionality to preserve a version of your project at a point in time.
Never worry about losing your app progress with auto versioning. Thunkable automatically backs up your projects every few hours.
To access the two most recent auto versions of your project:
Access the Design tab of your project.
Each auto version’s name reflects the date and time the version was created.
Click the version’s vertical ellipsis to access its version actions.
The Restore option reverts your current project to this version.
To save a version of your project:
Access the Design tab of your project.
Click Create Version. A new version of the project is created with the default version name reflecting the date and time the version was created.
To change the name of a version, click in the version name field and type your preferred version name.
Click the version’s vertical ellipsis to access its version actions.
The Restore option reverts your current project to this version.
The Save As option saves that version as a new project. Select a name for your new project and then click Create. The newly created project is now available on your Projects Page, and the version will remain within the existing project.
The Delete option will permanently delete the selected version. This action can’t be undone.
If you downgrade your subscription plan, you will lose your oldest versions up to your new limit.
Creating a new version of a project makes a full copy of the project, including project settings such as name, project privacy, data, etc. Restoring a version will also restore those settings.
Don't know where to start on your project? Start building quickly with our sample projects.
Keyboard shortcuts improve efficiency by enabling faster task execution, boosting productivity, and streamlining workflows. There are keyboard shortcuts available for the Thunkable Design Tab and Blocks Tab.
“⌘” should be replaced with “Ctrl” for non-macOS environments.
Connecting your project to a data source allows you to work with the information that you have stored in Airtable, Google Sheets, Webflow or a local table.
Effective February 1, 2024, Airtable no longer supports connecting via API key. You must connect your Thunkable project to Airtable via OAuth.
Click Connect to Airtable.
In Thunkable, click the data icon in the left side panel to access your data source library.
Click the plus sign at the top of the panel.
You can select from previously added data sources or add a new data source. Click Create New.
Select Airtable.
Click the OAuth tab.
An Airtable authorization screen opens.
Click + Add a base.
Select the bases you want to authorize access to.
Select all the bases you want your Thunkable projects to have access to. This includes any bases you've previously connected by API key, as well as any new bases you want to connect to Thunkable.
Click Grant access.
If you are connecting by OAuth for the sole purpose of migrating your connection from API Key and are not creating a new data source, you are done. The following steps only apply when creating a new data source.
Select the correct base from the dropdown menu.
Click Create.
Refresh your page to ensure the data is reflected in web preview or via the Thunkable Live app.
Once you've connected your Airtable account to your Thunkable account via OAuth, API keys are no longer used.
In Airtable, a table is similar to a sheet in a spreadsheet. You can have multiple tables within your Airtable base, and each table can have multiple views. A view indicates how the data is presented within the table. For example, you can use views to show only specific fields or records and apply other configurations to manage the information in that view. The initial default view for an Airtable table is the grid view.
When connecting an Airtable base as your Thunkable project’s data source, you can select a custom view instead of the default grid view. This will apply only to the first table in your base. For subsequent tables, Thunkable will use the default grid view. If you have a base with two tables and the second table has a custom view, you can reorder the tables within the base in Airtable so that the custom view is applied to the correct table.
This block is only necessary for Creators who use web API blocks to communicate with Airtable.
If your app uses web API blocks to communicate with Airtable, you must also incorporate the "authorization header for" block into your app. This block retrieves a valid token that can be used as the authorization header in web API blocks.
To use the "authorization header for" block:
Ensure your project is connected to an Airtable data source by OAuth.
Navigate to your project's blocks tab.
Under the App Features heading, click Data Sources.
Drag and drop the "authorization header for" block into your workspace.
Use the block's dropdown menu to ensure the correct data source is selected.
If you're transitioning from connecting via API keys to OAuth, you must do the following to ensure the changes take effect:
Re-download or re-publish your app.
Once you've connected a data source, you can display the data in your app with a data viewer component. Learn more about data viewer components here:
If hard-refreshing doesn't work or you want to add more Tables, you'll need to reset the Airtable connection.
Reset from Airtable
Connect to Airtable
Click the Account icon and then Integrations
Click Third-party integrations and then Thunkable
Click Revoke access
Return to Thunkable, re-connect to your Airtable account and give access to all the bases you need.
You can add specific bases but to avoid the above steps in the future in case you need to add some more you can select the second option and allow current and future all bases.
Connecting your project to a data source allows you to work with the information that you have stored in Airtable, Google Sheets, Webflow or a local table.
When a data source powers your app, you can continuously update your app contents without having to republish it. It allows you to build a dynamic app that can create, read, update, and delete data. This doc covers connecting your app to Webflow as the data source.
When using Webflow as the data source for your Thunkable app, you’ll connect to a Webflow CMS or Content Management System collection. To connect your Webflow CMS to your Thunkable project, you have two options:
API Key
OAuth
In this tutorial, we’ll connect a Thunkable app to Webflow as a data source and display the data in our app.
In Thunkable, click the data icon in the left side panel to access your data source library.
Click the plus sign at the top of the panel.
You can select from previously added data sources or add a new data source. Click Create New.
Select Webflow.
Click the API Key tab.
In a separate browser tab, navigate to your Webflow site settings.
Click the Integrations tab.
Under the API access header, click Generate API token.
Copy the Webflow API token.
Return to your Thunkable tab.
Paste the copied Webflow API token into the corresponding field.
Click Refresh to see your Webflow sites.
Select the site you want to use as your data source.
Click Create.
Refresh your page to ensure the data is reflected in web preview or via the Thunkable Live app.
To protect the quality of its service, the Webflow CMS API default rate limit is 60 requests/minute. Exceeding this limit will result in an error on the Thunkable platform, so please keep this in mind as you build your app.
In Thunkable, click the data icon in the left side panel to access your data source library.
Click the plus sign at the top of the panel.
You can select from previously added data sources or add a new data source. Click Create New.
Select Webflow.
Click the OAuth tab.
Click Connect to Webflow.
A Webflow authorization screen opens.
Select the sites or Workspaces you want to authorize access to.
Click Authorize app.
Refresh your page to ensure the data is reflected in the web preview or via the Thunkable Live app.
To protect the quality of its service, the Webflow CMS API default rate limit is 60 requests/minute. Exceeding this limit will result in an error on the Thunkable platform, so please keep this in mind as you build your app.
Once you've connected a data source, you can display the data in your app with a data viewer component. Learn more about data viewer components here:
Follow these steps to build your first app!
Welcome to Thunkable! If you're looking for a short guide on how to get started building your first app with Thunkable, you're in the right place!
Just follow these simple steps, and you'll be on your way to publishing your app in no time:
We encourage you to check out our Thunkable Education resources to familiarize yourself with the platform and expedite the time it takes you to build your first Thunkable app.
Project collaboration is the ability for multiple users to work on the same app project together. Working together has many benefits that help teams unlock the potential of multiple skill sets while turning ideas into apps.
Thunkable's organizations are a set of administration and collaboration capabilities that allow multiple team members to work on a single project. Creators can jointly design and develop a single, shared project asynchronously.
A single Creator can edit the project at a time, and their changes are available for other members to view when they refresh their page.
Thunkable Creators have:
roles with the organization (Admin or Member)
permissions within a project (Project Owner, Editor, or Viewer)
modes when actively within a project (Editing or Viewing)
The Organizations Admin Dashboard is available for an organization’s Admins. This is where they can add, remove, and modify members' roles.
Click your profile image in the upper right.
Select Organizations.
The Organizations page lists the organizations for which you hold admin status.
Click an organization name.
The Members tab lists the organization’s members.
The Projects tab lists the organization’s projects.
Click Add Member.
Input the invitee’s email address.
Indicate their role (Admin or Member).
Click Add.
Navigate to the Members tab of the organization’s page.
Click the role dropdown associated with the member.
Select the appropriate role (Admin or Member).
Navigate to the Members tab of the organization’s page.
Click the role dropdown associated with the member.
Select Remove.
Confirm the removal.
When creating a new project, organization members can assign it to their own personal projects or the organization.
Projects assigned to the organization can be collaborated on by members of the organization.
Once a project is assigned to an organization, it cannot be converted into a personal project. It remains part of the organization and cannot be moved to any one Creator’s personal projects, including the admin of the organization.
Projects created within an organization cannot be shared with users outside of the organization.
The owner of a personal project can make a copy of the project in an organization in which they are a member. To do this, as the project's owner:
On the project's Design tab, click the Project Actions icon.
Select Duplicate into...
In the modal provided, give the project a name.
Use the dropdown menu to indicate which organization you want to copy the project into.
Click Duplicate into Organization.
You are the owner of the newly created project in the selected organization. There are no other members with permissions on this project yet.
When accessing organization projects, members are in one of two modes: editing or viewing. There can only be one project member in editing mode at any given time – all other organization members remain in viewing mode.
Members accessing the project in viewing mode cannot make active changes to the shared project.
Only one project member can be in editing mode at a time.
To request editing access, a member in viewing mode must click the chevron next to VIEWING.
Click Request Edit.
The member currently in editing mode is notified that another member has requested editing access.
When the member currently in editing mode switches to viewing mode, the member requesting editing access is switched to editing mode and can make changes to the project.
If the member currently in editing mode is offline, no other member can edit the project. The member currently in editing mode must return online and grant access to a different member.
To share a project with a user in your organization:
Select Project Sharing.
Enter the email address of the user you want to add to the project
Assign the user a permission level: Editor or Viewer.
Click Add.
To update the permissions of a user in your organization:
Click the user's existing permission level (EDITOR or VIEWER) and select Editor, Viewer, or Remove.
Organization members can collaborate on projects by adding comments to UI components.
To add a comment to a UI component:
Access the project’s Design tab.
Ensure you’re in Editing mode.
Click the Comment icon to open the comment panel on the right.
Click to select a UI component on a screen or in the component tree.
Type your comment in the provided text input field in the comment panel.
Click the send button.
To add comments to other UI components, repeat steps 4-6.
Click the Comment icon to close the comment panel.
Each UI component is limited to 25 comments, and each comment has a maximum character count of 2000.
To view comments on a UI component:
Access the project’s Design tab.
Click the Comment icon to open the comment panel on the right.
Comments are grouped with the UI component they were added to.
Comments are displayed in the order they were added, with the most recent comment appearing at the bottom of the UI component's comments.
UI components with the most recent comments appear at the top of the comment panel, making it easier to find the most recent discussions.
Click the Comment icon to close the comment panel.
You can delete your own comments. To delete a comment:
Access the project’s Design tab.
Ensure you’re in Editing mode.
Click the Comment icon to open the comment panel on the right.
Locate the comment you want to delete.
Click the vertical ellipsis icon within the comment’s box.
Click Delete.
This cannot be undone. Click Delete to confirm the deletion of the comment.
Click the Comment icon to close the comment panel.
Click the trash can icon next to a data source you want to delete.
Click the Version History clock icon in the upper right.
Click the Version History clock icon in the upper right.
When a data source powers your app, you can continuously update your app contents without having to republish it. It allows you to build a dynamic app that can create, read, update, and delete data. This doc covers connecting your app to as the data source.
Indicate if you'd like to use a custom view. Learn more here: .
Do a hard refresh on your browser. You can learn more here: .
Have feedback on this doc? Please take a moment to share your feedback here: . Your valuable insights will help us improve and better serve you in the future.
The option of connecting a Webflow data source was removed. Because of changes to how the , we have removed the ability to use Webflow as a data source and replaced the existing tables with local tables. We suggest you update your data source to either Airtable or Google Sheets at your earliest convenience.
Have feedback on this doc? Please take a moment to share your feedback here: . Your valuable insights will help us improve and better serve you in the future.
You can in to Thunkable using your Google account, Apple ID, or email address.
You can find your projects page at . This is the first page you see when you sign in.
Designing the visual aspect of your app is accomplished with screens, , and . You can combine, style and customize them to give your app personality and style that best suits your brand.
Thunkable are the building blocks of a great experience for your app users. Every component has its own set of blocks to start or trigger an event and set and change properties.
There are two ways to test and preview your Thunkable app: in your computer's browser or on your mobile device with the app. These allow you to preview your app's design and test its functionality in real-time.
is Thunkable's self-paced learning environment. With videos that cover the basics and best practices to start, Thunkable Academy is designed to help you quickly and effectively create your own custom, native mobile applications.
We also have a library of available on YouTube.
The is a wonderful community of Thunkers dedicated to building the best apps possible and sharing their expertise with the world! Here, you can search for answers, browse questions asked by others, participate in the conversation, and post your own questions for the Community to answer.
Have feedback on this doc? Please take a moment to share your feedback here: . Your valuable insights will help us improve and better serve you in the future.
This feature may only be available for Creators on certain Thunkable plans. Please refer to our pricing page for more information: .
Click the Share icon.
Click the Share icon.
Have feedback on this doc? Please take a moment to share your feedback here: . Your valuable insights will help us improve and better serve you in the future.
Add/Remove members
Yes
No
No
No
Publish
-
Yes
Yes
No
Share
-
Yes
No
No
Download
-
Yes
Yes
No
Access project settings
-
Yes
Yes
No
Grant Edit Access
-
Yes
No
No
Remix project
-
Yes
Yes
No
Duplicate project
-
Yes
No
No
Delete project
-
Yes
No
No
Figma import
-
Yes
No
No
Versioning
-
Yes
No
No
Staff & Community contributed tutorials on our Community forum.
The Thunkable Community is an excellent place to discuss, collaborate, and learn from Thunkable Staff and other users!
T
Toggle between the Design and Blocks tabs.
✅
✅
P
Web Preview. Equivalent to clicking the Web Preview icon.
✅
✅
Esc
When in Web Preview, the equivalent of clicking Back to editing.
✅
✅
F
✅
D
✅
✅
Press and hold spacebar + drag cursor
Mac touchpad:
Press and hold spacebar + two-finger move cursor
Pan around the screen.
Note: The cursor must remain in the screen area in order to continue panning.
✅
⌘ + C
Copy screens, components, and blocks.
✅
✅
⌘ + V
Paste copied screens, components, and blocks.
✅
✅
Arrow keys
Move the selected UI component—small nudge.
✅
Shift + arrow keys
Move the selected UI component—larger nudge.
✅
⌘ + K
Toolbox search in Blocks tab.
✅
⌘ + F
Workspace search in Blocks tab.
✅
⌘ + ⬆
Select the previous component in the component tree.
✅
⌘ + ⬇
Select the next component in the component tree.
✅
⌘ + ⬅
Go to previous screen.
✅
✅
⌘ + ⮕
Go to next screen.
✅
✅
Delete or Backspace
Delete selected component.
✅
✅
⌘ + Z
Undo
✅
⌘ + Y or
⌘ + Shift + Z
Redo
✅
Connecting your project to a data source allows you to work with the information that you have stored in Airtable, Google Sheets, Webflow or a local table.
When a data source powers your app, you can continuously update your app contents without having to republish it. It allows you to build a dynamic app that can create, read, update, and delete data. This doc covers creating a local table as the data source.
In this tutorial, we’ll create a local table data source in a Thunkable app and display the data.
To create your own table as a data source:
Click the data icon in the left side panel to access your data source library.
Click the plus sign at the top of the panel.
You can select from previously added data sources or add a new data source. Click Create New.
Select Create your own table.
Give your local data source table a name.
Click Create.
To add data to your local table, copy and paste it from another source or click into a cell and type to input the data.
To modify the table's columns:
To update the table’s column headers, click their names and type a new header name.
To add additional columns, click the + New Column button.
To delete columns, click the x in the column’s title box.
To modify the table's rows:
To add additional rows, with your cursor in the bottom row, press your keyboard’s enter or return key.
To delete a row, right-click on it and select Remove row.
Select your preferred storage option:
App Data Source - If the data is changed while the app is open, the table's data resets when a user of your app closes and reopens the app. This reduces the time it takes for the app to load on the user's device.
Stored Data Source - If the data is changed while the app is open, the table's data persists when a user closes and reopens the app.
When your table is complete, click the X in the upper right.
The newly created local data source is now listed in your project's list of data sources.
Click the pencil icon to rename the data source.
Click the data source's name to review and edit the data.
Click the trash can icon to delete the data source from your project.
Once you've connected a data source, you can display the data in your app with a data viewer component. Learn more about data viewer components here:
Have feedback on this doc? Please take a moment to share your feedback here: Thunkable Docs Feedback. Your valuable insights will help us improve and better serve you in the future.
In this tutorial, you’ll learn how to test and troubleshoot your project using the Thunkable Live app on your device.
In this tutorial, we’ll connect a Thunkable app to Google Sheets as a data source and display the data in our app.
You can make a copy of our spreadsheet here: https://docs.google.com/spreadsheets/d/1hMdJ1O-uekCi1_aT4OpWInk_bS_pvU3zouqYYXE2sn4/copy
In this tutorial, we’ll demonstrate how to delete data in a connected data source such as Google Sheets, Airtable, or a local table.
Access the Designer's Focus tool.
Live Test on Device. Equivalent to clicking the Live Test icon.
In this tutorial, we’ll demonstrate how to create data in a connected data source such as Google Sheets, Airtable, or a local table.
In this tutorial, we’ll demonstrate how to read data in a connected data source such as Google Sheets, Airtable, or a local table.
In this tutorial, we’ll demonstrate how to update data in a connected data source such as Google Sheets, Airtable, or a local table.
User interface (UI) components make up the visual aspect of your app. Combine, style and customize Thunkable UI components to give your app personality and style that best suits your brand.
Each UI component you add to your app has an associated properties panel unique to that component. Using the various settings in the properties panel, you can style and customize your Thunkable UI components to give your app personality and style that best suits your brand.
A label's properties panel is displayed on the right in the example below. Note its unique properties, such as the label's text, font, color, etc.
The component tree can be found at the top left corner of your project's designer. The component tree contains a list of the UI components in your app. The expand and collapse arrows show or hide the nested UI components.
Once you’ve perfected a UI component on the Design tab of a drag and drop project, you can duplicate it using copy-and-paste keyboard shortcuts.
To copy and paste a component:
Click on a component name in the component tree (A) or the component within a screen in your workspace (B).
Type ctrl+c or command+c on Mac, and ctrl+c on PC, to copy the component.
Type ctrl+v or command+v on Mac, and ctrl+v on PC, to paste a duplicate of the component.
Click and drag the new component to position it as you desire.
You can delete UI components from the component tree or the component's properties panel.
To delete a UI component from your project:
Click the trash can icon.
Confirm the deletion.
To delete a UI component from your project:
Click on a component name in the component tree or the component within a screen in your workspace.
Select Delete.
Confirm the deletion.
Learn more about each of the UI components:
Once you have designed the UI you want, you can start adding functionality to your app with blocks and app features!
In this tutorial, we’ll create a local table data source in a Thunkable app and display the data.
In this tutorial, you’ll learn how to allow a Firebase authenticated user to reset their password and sign out of your app.
Hover over a component's name in the component tree.
Click the vertical ellipsis in the upper right of the component's properties panel.
In this tutorial, we’ll show you how to use Google to authenticate your users and allow them to sign in and out of your app.
In this tutorial, we’ll show you how to use Apple to authenticate your users and allow them to sign in and out of your app.
In this tutorial, we’ll show you how to use Firebase to authenticate your users and allow them to sign up and sign in to your app.
In this tutorial, we’ll show you how to use Thunkable’s versioning functionality to preserve a version of your project at a point in time.
Utilizing public or sample projects streamlines the creation process and allows you to focus on features specific to your app! In this tutorial, you’ll learn how to make a public Thunkable project your own.
In this tutorial, you’ll learn how to use the “navigate to” block to allow your app’s users to navigate between app screens with a simple button click.
In this tutorial, we’ll show you how to streamline your workflow and maximize your efficiency across diverse projects by saving a screen from one app project and reusing it in another!
This feature may only be available for Creators on certain Thunkable plans. Please refer to our pricing page for more information: Thunkable pricing.
In this tutorial, we'll explore the benefits of using a top or bottom tab navigator and provide step-by-step instructions on implementation.
In this tutorial, we'll explore the benefits of using a drawer navigator and provide step-by-step instructions on implementation.
In this tutorial, we'll explore what a stack navigator is and provide step-by-step instructions on implementation.
Thunkable allows you to design your UI for your no code app in Figma and quickly add functionality within our platform.
Head here to learn more: https://www.producthunt.com/products/thunkable#thunkable-figma-integration
In this tutorial, we’ll show you how to customize a Thunkable data viewer so you can display your data in a way that meets your user’s needs and reflects your brand design.
In this tutorial, we’ll implement text input validation to disable a button until text input conditions are met.
In this tutorial, you’ll learn how to create scrollable screens, which allow users to access a large amount of content within a confined screen space.
If you have questions about the tutorial’s content, head over to the Thunkable Community post specific to this tutorial here: https://community.thunkable.com/t/increasing-screen-real-estate-with-scrollable-screens-with-video-tutorial/2727933
In this tutorial, we'll show you how to use the UI component visibility property to create a modal, a temporary screen overlay, in your Thunkable project.
In this tutorial, you’ll use Thunkable camera app features to create an app that records a video with the device's camera.
Tapping into a mobile device’s camera opens up a world of possibilities for Thunkable Creators. In this tutorial, we’ll add the functionality to scan a barcode or QR code with the device's camera.
If you have questions about the tutorial’s content, head over to the Thunkable Community post specific to this tutorial here: https://community.thunkable.com/t/using-a-barcode-and-qr-code-scanner-with-video-tutorial/2659502
In this tutorial, you’ll learn how to use files stored in Cloudinary in your app and how to upload files directly from your app to Cloudinary.
In this tutorial, you’ll learn how to update data in a connected Firebase Realtime Database.
In this tutorial, you’ll use Thunkable camera app features to create an app that takes a photo with the device's camera.
In this tutorial, we’ll show you how to build alerts in your Thunkable app to display important information, warnings, or prompts to users.
By the end of this Thunkable platform overview, you will have designed, developed, and tested a simple app that allows users to navigate from one screen to another.
Sign up for free: https://x.thunkable.com/signup
Download the Thunkable Live app to live test your app on a device: https://thunkable.com/#/mobile
In this tutorial, you’ll learn how to build a three-button alert in your Thunkable app to prompt your users.
In this tutorial, you’ll learn how to read data from a connected Firebase Realtime Database.
In this tutorial, you’ll learn what an API is, connect a Thunkable project to a web API, retrieve and parse the relevant data from the API, and use Thunkable blocks to modify the API URL that is called.
A series of videos designed to help you develop competency in Thunkable.
Having a great app design is critical for enabling your users to navigate the features of your app effectively. In this video, we'll create the look and feel for our app directly in Thunkable.
Sign up for free: https://x.thunkable.com/signup
Download the Thunkable Live app to live test your app on a device: https://thunkable.com/#/mobile
Once your data is flowing between your data source and app, you’ll need to add app functionality.
In this video, we’ll hop into the blocks tab and define the app’s behavior using Thunkable’s no code, drag and drop block technology.
Sign up for free: https://x.thunkable.com/signup
Download the Thunkable Live app to live test your app on a device: https://thunkable.com/#/mobile
In this video, we’ll explore a variety of versatile Thunkable user interface components and app features that will have you transforming your app from bland to grand in no time.
Sign up for free: https://x.thunkable.com/signup
Download the Thunkable Live app to live test your app on a device: https://thunkable.com/#/mobile
Connecting your app to a data source allows you to build a dynamic app that updates continuously with data stored in Airtable, Google Sheets, Webflow, or a local table.
Sign up for free: https://x.thunkable.com/signup
Download the Thunkable Live app to live test your app on a device: https://thunkable.com/#/mobile
In this video, we’ll explore Thunkable’s no code, drag and drop as we create an image recognition app.
Sign up for free: https://x.thunkable.com/signup
Download the Thunkable Live app to live test your app on a device: https://thunkable.com/#/mobile
In this video, we’ll dig into the four D’s of Thunkable app creation: Design, Develop, Debug, and Deploy.
Sign up for free: https://x.thunkable.com/signup
Download the Thunkable Live app to live test your app on a device: https://thunkable.com/#/mobile
Join us in this Hour of Code activity to build an app that displays information from a data table in a way that’s easy for people to see and understand.
The app for this activity will display a table of different charities that support refugees, but you can also follow along using a data table of your choice.
Copy a Data Table of your choice to use in your project here: https://thunkable.com/#/hourofcode
Learn more about Hour of Code here: https://hourofcode.com
Incorporating text-to-speech functionality brings written words to life by converting them into spoken audio. In this tutorial, we’ll add text-to-speech functionality to a translation app.
See the Thunkable Docs for a list of supported text-to-speech languages:
Join us in this Hour of Code activity to build a Scavenger Hunt app for you and your friends.
When you are done building your app, you can check off each item in the list by taking pictures on your mobile device.
Learn more about Hour of Code here: https://hourofcode.com/
Join us in this Hour of Code activity to build a translator app that can read your translations out loud with text-to-speech technology.
When you are done building, you’ll have an exciting app to help you learn a new language!
Learn more about Hour of Code here: https://hourofcode.com
In this tutorial, we’ll build a translation app that translates the user’s text input from one language to another.
In this tutorial, you’ll use Thunkable camera app features to create an app that takes a photo with the device's camera and utilizes image recognition functionality to identify the photo’s content.
The image component allows you to display pictures in your app and can be made clickable using blocks.
The image component is used to display visual content, such as pictures, icons, logos, and other types of images and can be made clickable using blocks. The image component is foundational in creating visually appealing and engaging mobile app interfaces.
You can customize your image using the following properties:
Picture
PNG, JPG, GIF, etc. Can also use a URL that ends in a file extension.
The image file displayed in the image component.
Picture Resize Mode
Select from: cover, contain, stretch, repeat, and center.
Define how the image is displayed if the file and the image component have different dimensions/aspect ratios. See the definitions of each setting below.
Filter
Select from: None, Blur, Brightness, Contrast, Grayscale, Invert, Sepia, and Opasit
Define the filter that will be applied in the image component.
Using SVG files might result in images not being displayed correctly.
Center: The image is displayed at its original size within the container, and it is centered both vertically and horizontally. This means that if the image is larger than the container, parts of it may extend beyond the container's edges.
Cover: The image is resized to completely cover the container while maintaining its aspect ratio. This mode ensures that the entire container is filled with the image, and any excess image parts are cropped if necessary. This can result in parts of the image being clipped.
Contain: The image is resized to fit entirely within the container while maintaining its aspect ratio. This mode ensures that the entire image is visible within the container, and it may result in empty space around the image if the container's aspect ratio differs from the image's aspect ratio.
Repeat: The image is tiled or repeated to fill the entire container, both horizontally and vertically. This mode is often used for creating patterns or backgrounds that seamlessly repeat across the container.
Stretch: The image is resized to fully cover the container without maintaining its original aspect ratio. This can distort the image and may result in an unnatural appearance, so it's generally not recommended for most scenarios.
When working with these resize modes, it's important to consider the context of your app's design and the type of content you're displaying. Different situations might call for different resize modes to achieve the desired visual outcome. For instance, cover might be suitable for background images, while contain could work well for displaying profile pictures. Always strive to maintain a visually pleasing and user-friendly experience while keeping the specific characteristics of each resize mode in mind.
X
coordinate value
Position of the upper left corner of the image on the X-axis, where the left side of the screen is X=0.
Y
coordinate value
Position of the upper left corner of the image on the Y-axis, where the top of the screen is Y=0.
Height
number in pixels
The image's height is defined by a custom number of pixels.
Width
number in pixels
The image's width is defined by a custom number of pixels.
Resize Mode
Stretch
Stretches the image to fit the dimensions of the device's screen.
Resize Mode
Float in Place
Renders the image in the same aspect ratio as the design, regardless of the device size.
Visible
visible
Users can see the image.
Visible
invisible
Users cannot see the image.
Border: Color
color
The image's border is the color selected.
Border: Width
number in pixels
The width of the image's border is defined by a custom number of pixels.
Border: Radius
number in pixels
The radius of the image border’s corners is defined by a custom number of pixels.
Shadow: Color
color
The image's shadow is the color selected.
Shadow: Opacity
number between 0 and 100
The opacity of the image's shadow.
Shadow: Radius
number in pixels
The radius of the image shadow’s corners is defined by a custom number of pixels.
Shadow: Offset
number in pixels
How far the image's shadow should be offset, in height and width, is defined by a custom number of pixels.
To access the blocks specific to the switch component:
On the Design tab, add a Image component to a screen.
Navigate to the Blocks tab.
In the component tree on the left, click the name of the image component.
A drawer of image-specific blocks opens.
This event will fire when the user clicks on the image.
Set the image component's Picture.
Get the image component's Picture.
Set the image component's filter.
Get the image component's filter.
Set the image component's height.
Get the image component's height.
Returns the height of the image component in pixels after it has been rendered on-screen.
Set the image component's width.
Get the image component's width.
Returns the width of the image component in pixels after it has been rendered on-screen.
Set whether the image component is visible on the screen.
Get whether the image component is visible on the screen.
Set the position image the upper left corner of the image on the X-axis, where the left side of the screen is X=0.
Get the position of the upper left corner of the image on the X-axis, where the left side of the screen is X=0.
Set the position of the upper left corner of the image on the Y-axis, where the top of the screen is Y=0.
Get the position of the upper left corner of the image on the Y-axis, where the top of the screen is Y=0.
Set the image component's .
Get the image component's .
The Rich Text component is used to compose and display formatted text, and can also be made clickable using blocks.
Rich Text works alongside other user interface components like buttons, images, and text inputs to create a cohesive and intuitive user experience.
You can customize your Rich Text component using the following properties:
Text
Text
Text that appears on the Rich Text Component
Font
Select from menu
Font used to display component's text
Font Size
Number
Size of the text
Font Weight
True/False
Make the text bold
Color
Color
Color of the text that appears on the component
Highlight Color
Color
The color in which to highlight the text
Strikethrough
True/False
Draw a line through the select text
Underline
True/False
Underline the selected text
Italic
True/False
Make the selected text italicized
Text Align
Select from menu
Set alignment of the text relative to the outline
Line Spacing
Number
Maximum amount of lines of text that will display
Visible
True/False
Display or hide the component
Using Custom Fonts may only be available for Creators on certain Thunkable plans. Please refer to our pricing page for more information: Thunkable pricing.
X
coordinate value
Position of the upper left corner of the Rich Text component on the X-axis, where the left side of the screen is X=0.
Y
coordinate value
Position of the upper left corner of the Rich Text component on the Y-axis, where the top of the screen is Y=0.
Height
number in pixels
The Rich Text component's height is defined by a custom number of pixels.
Width
number in pixels
The Rich Text component's width is defined by a custom number of pixels.
Resize Mode
Stretch
Stretches the Rich Text component to fit the dimensions of the device's screen.
Resize Mode
Float in Place
Renders the Rich Text component in the same aspect ratio as the design, regardless of the device size.
Visible
visible
Users can see the Rich Text.
Visible
invisible
Users cannot see the Rich Text.
Background Color
color
The background color of the Rich Text.
Border: Style
solid
The Rich Text component's border is a solid line.
Border: Style
dotted
The Rich Text component's border is a dotted line.
Border: Style
dashed
The Rich Text component's border is a dashed line.
Border: Color
color
The Rich Text component's border is the color selected.
Border: Width
number in pixels
The width of the Rich Text component's border is defined by a custom number of pixels.
Border: Radius
number in pixels
The radius of the Rich Text component's border’s corners is defined by a custom number of pixels.
Shadow: Color
color
The Rich Text component's shadow is the color selected.
Shadow: Opacity
number between 0 and 100
The opacity of the Rich Text component's shadow.
Shadow: Radius
number in pixels
The radius of the Rich Text component's shadow’s corners is defined by a custom number of pixels.
Shadow: Offset
number in pixels
How far the Rich Text component's shadow should be offset, in height and width, is defined by a custom number of pixels.
To access the blocks specific to the Rich Text component:
On the Design tab, add a Rich Text component to a screen.
Navigate to the Blocks tab.
In the component tree on the left, click the name of the Rich Text component.
A drawer of Rich-Text-specific blocks opens.
This event will fire when the user clicks on the Rich Text.
Removes all text from the component.
Reset all text formatting (including paragraph modifiers) to the default styling (i.e., the styling that a brand new Rich Text component has before it is modified).
Replace any text with the provided string. This will set it to the “default component styling” (no modifiers).
Get the component's text.
Set the background color of the component.
Get the background color.
Set the height of the component.
Get the height of the component.
The Computed Height
block gets the on-screen dimensions of the component, after it has been rendered on-screen. The value returned is an integer, representing the size of the Rich Text component in pixels.
Set the width of the component.
Get the width of the component.
The Computed Width
block gets the on-screen dimensions of the Rich Text component, after it has been rendered on-screen. The value returned is an integer, representing the size of the Rich Text component in pixels.
Choose whether to display or hide the component.
Get the True or False value for the Visible state.
Set the position of the component on the X-Axis, where the left side of the screen is X=0.
Get the position of the component on the X-Axis.
Set the position of the component on the Y-Axis, where the top of the screen is Y=0.
Get the position of the component on the Y-Axis.
Set the font of the component's text.
Set the font size of the component's text.
Make all the text Bold or Normal.
Set all the text to Italic.
Underline all the text.
Draw a line through all the text.
Highlight all the text in a specific color.
Set the line spacing.
Set all the text to a specific color.
Set the component's Text Align. Text Align can be any of the following values: Auto, Left, Right, Center, or Justify.
The text input allows the person using your app to type in anything that they want such as words, passwords or numbers.
The text input component is a field where app users can enter text, such as a name or email address.
In this tutorial, we’ll implement text input validation to disable a button until text input conditions are met.
You need to make your screen scrollable to prevent the text input from moving up when the keyboard appears.
To access the blocks specific to the text input component:
On the Design tab, add a Text Input component to a screen.
Navigate to the Blocks tab.
In the component tree on the left, click the name of the text input component.
A drawer of text input-specific blocks opens.
This event fires when the user clicks on the text input component.
This event fires when the component loses focus, i.e. the user clicks on another component.
This event fires when the enter or submit button is pressed on the device keyboard.
This event fires whenever a character is added to or removed from the text input (i.e. whenever there is a change to the content of the text input).
There are two types of property blocks: dark green "set" and light green "get" blocks. The specific blocks available vary according to the UI component.
The dark green set blocks allow you to change the component's properties using blocks. For example, if you don't want a button to be enabled for a user until they've typed a set number of characters into a text input component, you can use the button's dark green set button's disabled status block.
The light green get blocks allow you to access the properties of a component (e.g. color, font, width, text, etc.).
The label component allows you to display text in your app.
The label component is used to display read-only text and can be made clickable using blocks.
Labels work alongside other user interface components like buttons, images, and text inputs to create a cohesive and intuitive user experience.
You can customize your label using the following properties:
To access the blocks specific to the label component:
On the Design tab, add a Label component to a screen.
Navigate to the Blocks tab.
In the component tree on the left, click the name of the label component.
A drawer of label-specific blocks opens.
When you tap on the play icon to hear your favourite music, you are using a button.
The button component gives your user familiar ways to start actions in your app. Examples include navigating between app screens, submitting user inputs, and triggering a device’s camera to take a photo.
In the block combination below, when a user clicks Button1 they will be taken to, or navigate to, Screen2.
In this tutorial, you’ll learn how to use the “navigate to” block to allow your app’s users to navigate between app screens with a simple button click.
** Raised is no longer supported. Please use Shadows under Style instead.
To access the blocks specific to the button component:
On the Design tab, add a Button component to a screen.
Navigate to the Blocks tab.
In the component tree on the left, click the name of the button component.
A drawer of button-specific blocks opens.
Custom Fonts may only be available for Creators on certain Thunkable plans.
* Uploading a custom font may only be available for Creators on certain Thunkable plans. Please refer to our for more information.
Have feedback on this doc? Please take a moment to share your feedback here: . Your valuable insights will help us improve and better serve you in the future.
Hint
text
The prompt text the user sees when the text input is empty (eg. Type Email
).
Text
text
Populated text of the text input.
Keyboard
select from list [default, email address, numeric, phone pad]
The keyboard style provided to a user when they tap into the text input. If none are selected, it will be the default standard keyboard.
Secure Text Entry
true/false
Toggle whether the input text is obscured as a user types (suitable for entering passwords and other sensitive information).
Font
text
Set the font for the hint and text properties. Options can be found here: Google Fonts.
Font Italic (web app only)
true/false
Select whether hint and text are shown in italics.
Underline (web app only)
true/false
Select whether the hint and text are underlined.
Strikethrough (web app only)
true/false
Apply strikethrough formatting to the hint and text.
Writing Direction (iOS and web app only)
select from icons
Set whether text should be written left-to-right or right-to-left.
Font Size
number in pixels
Set whether text should be written left-to-right or right-to-left.
Letter Spacing
number in pixels
Spacing between letters in pixels.
Editable
true/false
Toggle whether the user can edit the text.
Multiline
true/false
Toggle whether the user can enter multiple lines of text.
Auto Focus
true/false
Toggle whether the text input field is automatically in focus when the screen opens (i.e. the user doesn't need to tap into the field to focus).
Max Length (Android and iOS only)
number
Set the maximum number of lines of text your user can enter.
Clear Button Mode (iOS only)
select from list [never, while-editing, unless-editing, always]
Toggle when an iOS user has the option to clear the text input's text.
Input Color
Color
The color of the text input's text.
Background Color
color
The background color of the text input field.
Hint Text Color
color
The color of the text input's hint.
Selection Color (Android and iOS only)
color
The highlight color when a user selects a section of text.
X
coordinate value
Position of the upper left corner of the text input on the X-axis, where the left side of the screen is X=0.
Y
coordinate value
Position of the upper left corner of the text input on the Y-axis, where the top of the screen is Y=0.
Height
number in pixels
The text input's height is defined by a custom number of pixels.
Width
number in pixels
The text input's width is defined by a custom number of pixels.
Resize Mode
Stretch
Stretches the text input to fit the dimensions of the device's screen.
Resize Mode
Float in Place
Renders the text input in the same aspect ratio as the design, regardless of the device size.
Visible
true/false
Toggle whether users can see the text input.
Border Style
select from list [solid, dotted, dashed]
Style of text input's border.
Border Color
color
Color of text input's border.
Border Width
number in pixels
The width of the text input's border is defined by a custom number of pixels.
Border Radius
number in pixels
The radius of the text input's border’s corners is defined by a custom number of pixels.
Shadow Color
color
The text input's shadow is the color selected.
Shadow Opacity
number between 0 and 100
The opacity of the text input's shadow.
Shadow Radius
number in pixels
The radius of the text input's shadow’s corners is defined by a custom number of pixels.
Shadow Offset
number in pixels
How far the text input's shadow should be offset, in height and width, is defined by a custom number of pixels.
Text
Text
Text that appears on the label
Font
Select from menu
Font used to display label's text
Custom Font (mobile only)*
OTF or TTF file
Font used to display label's text
Color
Color
Color of the text that appears on the label
Font Weight
True/False
Make the label's text bold
Font Style
True/False
Make the label's text italicized
Underline
True/False
Underline the label's text
Strikethrough
True/False
Apply strikethrough formatting to the label's text. You can further select the strikethrough's color and style.
Text Align
Select from menu
Set alignment of the text relative to the label's outline
Font Size
Number
Size of the text that appears on the label
Number Of Lines
Number
Maximum amount of lines of text that your label will display
Writing Direction
(iOS and web only)
Select from list [left-to-right, right-to-left]
Writing direction of your label's text
Letter Spacing
(iOS and web only)
number
Spacing between letters of your label
X
coordinate value
Position of the upper left corner of the label on the X-axis, where the left side of the screen is X=0.
Y
coordinate value
Position of the upper left corner of the label on the Y-axis, where the top of the screen is Y=0.
Height
number in pixels
The label's height is defined by a custom number of pixels.
Width
number in pixels
The label's width is defined by a custom number of pixels.
Resize Mode
Stretch
Stretches the label's to fit the dimensions of the device's screen.
Resize Mode
Float in Place
Renders the label in the same aspect ratio as the design, regardless of the device size.
Visible
visible
Users can see the label.
Visible
invisible
Users cannot see the label.
Background Color
color
The background color of the label.
Border: Style
solid
The label's border is a solid line.
Border: Style
dotted
The label's border is a dotted line.
Border: Style
dashed
The label's border is a dashed line.
Border: Color
color
The label's border is the color selected.
Border: Width
number in pixels
The width of the label's border is defined by a custom number of pixels.
Border: Radius
number in pixels
The radius of the label border’s corners is defined by a custom number of pixels.
Shadow: Color
color
The label's shadow is the color selected.
Shadow: Opacity
number between 0 and 100
The opacity of the label's shadow.
Shadow: Radius
number in pixels
The radius of the label shadow’s corners is defined by a custom number of pixels.
Shadow: Offset
number in pixels
How far the label's shadow should be offset, in height and width, is defined by a custom number of pixels.
Text
Text
Text displayed on the button.
Font
Select from font menu
Font for the button's text.
Custom Font (mobile only)*
Upload TTF or OTF file
Font for the button's text.
Text Color
Color
Color for the button's text.
Font Bold
True/False
True = button's text is bold. False = button's text is not bold.
Font Italic
True/False
True = button's text is italic. False = button's text is not italic.
Raised**
True/False
True = button has a shadow. False = button does not have a shadow.
Font Size
Number
Font size of the button's text.
Disabled
True/False
True = button is disabled for the user by default. False = button is enabled for the user by default.
X
coordinate value
Position of the upper left corner of the button on the X-axis, where the left side of the screen is X=0.
Y
coordinate value
Position of the upper left corner of the button on the Y-axis, where the top of the screen is Y=0.
Height
number in pixels
The button's height is defined by a custom number of pixels.
Width
number in pixels
The button's width is defined by a custom number of pixels.
Resize Mode
Stretch
Stretches the button to fit the dimensions of the device's screen.
Resize Mode
Float in Place
Renders the button in the same aspect ratio as the design, regardless of the device size.
Visible
visible
Users can see the button.
Visible
invisible
Users cannot see the button.
Background Color
color
The background color of the button.
Border: Style
solid
The button's border is a solid line.
Border: Style
dotted
The button's border is a dotted line.
Border: Style
dashed
The button's border is a dashed line.
Border: Color
color
The button's border is the color selected.
Border: Width
number in pixels
The width of the button's border is defined by a custom number of pixels.
Border: Radius
number in pixels
The radius of the button border’s corners is defined by a custom number of pixels.
Shadow: Color
color
The button's shadow is the color selected.
Shadow: Opacity
number between 0 and 100
The opacity of the button's shadow.
Shadow: Radius
number in pixels
The radius of the button shadow’s corners is defined by a custom number of pixels.
Shadow: Offset
number in pixels
How far the button's shadow should be offset, in height and width, is defined by a custom number of pixels.
Navigate to screen
none
When users click on the button there is no navigation to another screen.
Navigate to screen
screen name
When users click on the button they navigate to the selected screen.
This event will fire when the user clicks on the label.
Set the label's color with the color of the label itself i.e. the region behind the label text. Best practice is to use one of the color blocks to set this value but HEX or RGB values may be used too.
Get the label's color.
Set the label's background color with the color of the label itself i.e. the region behind the label text. Best practice is to use one of the color blocks to set this value but HEX or RGB values may be used too.
Get the label's background color.
Set the label's font size.
Get the label's font size.
Set's the label's font style. The font style property can be either "Normal" or "Italic".
Get the label's font style.
Set's the label's font weight.The font weight value can be either "Normal", "Bold" or a a value from 100 to 900
Get the label's font weight.
Set's the label's font height. Acceptable input values are: Number of Pixels, Percentage Height, "Fit Contents", or "Fill Container."
Get the label's font height.
The Computed Height
block gets the on-screen dimensions of the label, after it has been rendered on-screen. The value returned is an integer, representing the size of the label in pixels.
Set the label's number of lines.The number of lines property is used to work with the maximum number of lines of text that should be displayed in a label before that label starts to scroll.
Get the label's number of lines.
Set the label's text. This property corresponds to the text that is displayed in the label component.
Get the label's text.
Set the label's Text Align. Text Align can be any of the following values: Auto, Left, Right, Center, or Justify.
Get the label's Text Align.
Set the label's Visibility. The visible blocks are used to show or hide the entire image component. Acceptable values are: true or false.
Get the label's Visibility.
Set the label's width. The width blocks work with the Width property of the label component. Acceptable values are.
Get the label's width.
The Computed Width
block gets the on-screen dimensions of the label, after it has been rendered on-screen. The value returned is an integer, representing the size of the label in pixels.
This event fires when a user taps (or clicks) the button.
This event fires when a user presses and holds the button for an extended period of time.
This event fires when a user initially touches the button. It is the moment when the user's finger (or stylus) makes contact with the touchscreen.
This event fires when a user lifts their finger (or stylus) off the screen or releases the press on the button. It represents the moment when the user's interaction with the button ends.
Set the text that is displayed on the button.
Get the text that is displayed on the button.
Set the color of the text that is displayed on the button.
Get the color of the text that is displayed on the button.
Set the font size of the text that is displayed on the button.
Get the font size of the text that is displayed on the button.
Set the custom font of the text that is displayed on the button.
Get the custom font of the text that is displayed on the button.
Set the button's background color by connecting a color, or a text with a color in RGBA "rgba(93, 122, 252, 100)" or Hex "#5D7AFC".
Get the button's background color. By default, it returns the color in RGBA. If you set it using the set color block with Hex, it returns Hex.
Set the button's background picture. Click the dropdown menu to select an image from your computer.
Get the button's background picture.
Set the button's background picture resize mode.
Get the button's background picture resize mode.
Set the button's height in pixels.
Get the button's height in pixels.
Gets the button's computed height, the on-screen dimensions of the button, after it has been rendered on-screen. The value returned is an integer, representing the button's height in pixels.
Set the button's width in pixels.
Get the button's width in pixels.
Gets the button's computed width, the on-screen dimensions of the button, after it has been rendered on-screen. The value returned is an integer, representing the button's width in pixels.
When set to true, the button is visible to users.
When set to false, the button is invisible to users.
Gets the button's visibility status. Returns true (visible) or false (invisible).
Set the position of the upper left corner of the button on the X-axis, where the left side of the screen is X=0.
Get the position of the upper left corner of the button on the X-axis, where the left side of the screen is X=0.
Set the position of the upper left corner of the button on the Y-axis, where the top of the screen is Y=0.
Get the position of the upper left corner of the button on the Y-axis, where the top of the screen is Y=0.
Set the font of the text displayed on the button to bold.
Get the color of the text that is displayed on the button. tbd
Set the font of the text displayed on the button to italics.
Get whether the font of the text displayed on the button is italics.
Set the font of the text displayed on the button to raised.
Get whether the font of the text displayed on the button is raised.
When set to true, the button is disabled or inactive for users.
When set to false, the button is not disabled, it is active for users.
Get the button's disabled status.
Thunkable’s layout component allows for more precise positioning of UI components on an app screen, by allowing you to position UI components dependent on other UI components on the screen. For example, in a typical sign-in screen, if a user inputs an incorrect email address or password, a screen built with a layout component allows you to shift the UI components on the screen to display the error messaging to the user.
To add a layout component to a screen:
Drag and drop the layout UI component onto a screen. You’ll notice it is composed of two containers, one on top of the other.
Click and drag the sizing handles in the corners to resize the layout UI component.
Click and drag to reposition it.
By default, a newly added layout has two horizontal containers arranged vertically, one on top of the other. To insert additional containers to a layout:
Click to select the layout UI component in the component tree or within the screen.
At the top of the layout's properties panel, select whether you want to insert a horizontal or vertical Container. ∙ Horizontal Container - UI components within the container are aligned horizontally, side by side ∙ Vertical Container - UI components within the container are aligned vertically, on top of each other
Identify into which layout or container you want to insert the new container.
Click Add.
To add UI components to a layout:
Drag and drop UI components into a container on a screen.
Once UI components are in a container, rearrange their order by dragging and dropping their component names in the component tree.
The following properties are configured on the right in the layout's properties panel.
Direction
vertical
The elements directly within the layout (could be a UI component or a container) are aligned vertically, on top of each other.
Direction
horizontal
The elements directly within the layout (could be a UI component or a container) are aligned horizontally, side by side.
Vertical / Horizontal Alignment
top
The elements directly within the layout (could be a UI component or a container) are positioned at the top of the layout.
Vertical / Horizontal Alignment
bottom
The elements directly within the layout (could be a UI component or a container) are positioned at the bottom of the layout.
Vertical / Horizontal Alignment
left
The elements directly within the layout (could be a UI component or a container) are positioned at the left of the layout.
Vertical / Horizontal Alignment
right
The elements directly within the layout (could be a UI component or a container) are positioned at the right of the layout.
Vertical / Horizontal Alignment
center
The elements directly within the layout (could be a UI component or a container) are positioned in the center of the layout (either top to bottom or left to right, depending on the selected direction).
Vertical / Horizontal Alignment
space-between
The elements directly within the layout (could be a UI component or a container) are positioned with an equal amount of space between them.
Vertical / Horizontal Alignment
space-around
The elements directly within the layout (could be a UI component or a container) are positioned with an equal amount of space between them, including at the top and bottom for a vertical direction layout or left and right for a horizontal direction layout.
Scrollable
true/on
The user can scroll within the layout.
Scrollable
false/off
The user cannot scroll within the layout.
Scroll Bar Visible
true/on
The scroll bar is visible to the user.
Scroll Bar Visible
false/off
The scroll bar is not visible to the user.
Horizontal Alignment Examples
Vertical Alignment Examples
X
coordinate value
Position of the upper left corner of the layout on the X-axis, where the left side of the screen is X=0.
Y
coordinate value
Position of the upper left corner of the layout on the Y-axis, where the top of the screen is Y=0.
Height
number in pixels
The layout’s height is defined by a custom number of pixels.
Width
number in pixels
The layout’s width is defined by a custom number of pixels.
Resize Mode
Stretch
Stretches the layout to fit the dimensions of the device's screen.
Resize Mode
Float in Place
Renders the layout in the same aspect ratio as the design, regardless of the device size.
Background Picture
Upload files
Click to upload an image file.
Background Picture
Type in URL
Type in an image URL.
Background Picture Resize Mode
cover
Fills the entire layout without changing the height and width ratio of the image.
Background Picture Resize Mode
contain
The entire image is scaled down to fit inside the layout, without changing the height and width ratio of the image.
Background Picture Resize Mode
stretch
The image's height will change to fill the layout length-wise.
Background Picture Resize Mode
repeat
The image repeats to cover the layout. The image's height and width ratio do not change.
Background Picture Resize Mode
center
The image is positioned in the middle of the layout.
Visible
visible
Users can see the layout.
Visible
invisible
Users cannot see the layout.
Background Color
color
The background color of the layout.
Border: Style
solid
The layout’s border is a solid line.
Border: Style
dotted
The layoutt’s border is a dotted line.
Border: Style
dashed
The layout’s border is a dashed line.
Border: Color
color
The layout’s border is the color selected.
Border: Width
number in pixels
The width of the layout’s border is defined by a custom number of pixels.
Border: Radius
number in pixels
The radius of the layout border’s corners is defined by a custom number of pixels.
Shadow: Color
color
The layout’s shadow is the color selected.
Shadow: Opacity
number between 0 and 100
The opacity of the layout’s shadow.
Shadow: Radius
number in pixels
The radius of the layout shadow’s corners is defined by a custom number of pixels.
Shadow: Offset
number in pixels
How far the layout’s shadow should be offset, in height and width, is defined by a custom number of pixels.
Margin
top
The margin between the layout’s top border and the next UI component as defined by a custom number of pixels.
Margin
bottom
The margin between the layout’s bottom border and the next UI component as defined by a custom number of pixels.
Margin
left
The margin between the layout’s left border and the next UI component as defined by a custom number of pixels.
Margin
right
The margin between the layout’s right border and the next UI component as defined by a custom number of pixels.
Padding
top
The padding between the layout and its top border as defined by a custom number of pixels.
Padding
bottom
The padding between the layout and its bottom border as defined by a custom number of pixels.
Padding
left
The padding between the layout and its left border as defined by a custom number of pixels.
Padding
right
The padding between the layout and its right border as defined by a custom number of pixels.
The following properties are configured on the right in the container's properties panel.
Direction
vertical
UI components within the container are aligned vertically, on top of each other.
Direction
horizontal
UI components within the containerntainer are aligned horizontally, side by side.
Vertical / Horizontal Alignment
top
UI components are positioned at the top of the container.
Vertical / Horizontal Alignment
bottom
UI components are positioned at the bottom of the container.
Vertical / Horizontal Alignment
left
UI components are positioned at the left of the container.
Vertical / Horizontal Alignment
right
UI components are positioned at the right of the container.
Vertical / Horizontal Alignment
center
UI components are positioned in the center of the container (either top to bottom or left to right depending on the selected direction).
Vertical / Horizontal Alignment
space-between
UI components are positioned with an equal amount of space between them
Vertical / Horizontal Alignment
space-around
UI components are positioned with an equal amount of space between them, including at the top and bottom for vertical direction containers or left and right for horizontal direction containers.
Scrollable
true/on
The user can scroll within the container.
Note: When setting a container as scrollable, we recommend the size of the UI components within it be set to an absolute pixel value or Fit Contents.
Scrollable
false/off
The user cannot scroll within the container.
Scroll Bar Visible
true/on
The scroll bar is visible to the user.
Scroll Bar Visible
false/off
The scroll bar is not visible to the user.
Height
Fit contents
The container’s height is the same as the tallest UI component or container within it (horizontal direction) or the stacked UI components or containers within it (vertical direction).
Height
Fill container
The elements directly within the container (could be a UI component or another container) fill the container vertically.
Height
Size (e.g. 50px or 50%)
The container’s height is defined by a custom number of pixels or percentage of the screen.
Width
Fit contents
The container’s width is the same as the widest UI component or container within it (vertical direction) or the side-by-side UI components or containers within it (horizontal direction).
Width
Fill container
The elements directly within the container (could be a UI component or another container) fill the container horizontally.
Width
Size (e.g. 50px or 50%)
The container’s width is defined by a custom number of pixels or percentage of the screen.
Background Picture
Upload files
Click to upload an image file.
Background Picture
Type in URL
Type in an image URL.
Background Picture Resize Mode
cover
Fills the entire screen without changing the height and width ratio of the image.
Background Picture Resize Mode
contain
The entire image is scaled down to fit inside the screen, without changing the height and width ratio of the image.
Background Picture Resize Mode
stretch
The image's height will change to fill the screen length-wise.
Background Picture Resize Mode
repeat
The image repeats to cover the screen. The image's height and width ratio do not change.
Background Picture Resize Mode
center
The image is positioned in the middle of the frame.
Visible
visible
Users can see the container.
Visible
invisible
Users cannot see the container.
Background Color
color
The background color of the container.
Visible
solid
The container’s border is a solid line.
Visible
dotted
The container’s border is a dotted line.
Visible
dashed
The container’s border is a dashed line.
Border: Color
color
The container’s border is the color selected.
Border: Width
number in pixels
The width of the container’s border is defined by a custom number of pixels.
Border: Radius
number in pixels
The radius of the container border’s corners is defined by a custom number of pixels.
Shadow: Color
color
The container’s shadow is the color selected.
Shadow: Opacity
number between 0 and 100
The opacity of the container’s shadow.
Shadow: Radius
number in pixels
The radius of the container shadow’s corners is defined by a custom number of pixels.
Shadow: Offset
number in pixels
How far the container’s shadow should be offset, in height and width, is defined by a custom number of pixels.
Margin
top
The margin between the container’s top border and the next container as defined by a custom number of pixels.
Margin
bottom
The margin between the container’s bottom border and the next container as defined by a custom number of pixels.
Margin
left
The margin between the container’s left border and the next container as defined by a custom number of pixels.
Margin
right
The margin between the container’s right border and the next container as defined by a custom number of pixels.
Padding
top
The padding between the container and its top border as defined by a custom number of pixels.
Padding
bottom
The padding between the container and its bottom border as defined by a custom number of pixels.
Padding
left
The padding between the container and its left border as defined by a custom number of pixels.
Padding
right
The padding between the container and its right border as defined by a custom number of pixels.
To access the blocks specific to the layout component:
Navigate to the Blocks tab.
In the component tree on the left, click the Layout component.
A drawer of layout-specific blocks opens.
If the layout is scrollable, you can use this block to scroll the user to the end of the layout. For example, a user clicks a button in a chat app, and the layout scrolls to the end of the chat history to see the most recent messages.
If the layout is scrollable, you can use this block to scroll the user to the start of the layout.
Sets the layout’s height to a custom number of pixels.
Gets the layout’s height in pixels.
Gets the layout’s computed height, the on-screen dimensions of the layout, after it has been rendered on-screen. The value returned is an integer, representing the layout's height in pixels.
Sets the layout’s width to a custom number of pixels.
Gets the layout’s width in pixels.
Gets the layout’s computed width, the on-screen dimensions of the layout, after it has been rendered on-screen. The value returned is an integer, representing the layout's width in pixels.
When set to true, it sets the layout to visible, meaning the layout is visible to users.
When set to false, it sets the layout to invisible, meaning the layout is not visible to users.
Gets the layout’s visibility status. Returns true (visible) or false (invisible).
Set the position of the upper left corner of the layout on the X-axis, where the left side of the screen is X=0.
Get the position of the upper left corner of the layout on the X-axis, where the left side of the screen is X=0.
Set the position of the upper left corner of the layout on the Y-axis, where the top of the screen is Y=0.
Get the position of the upper left corner of the layout on the Y-axis, where the top of the screen is Y=0.
Set the layout’s background color.
Get the layout’s background color.
Set the layout's background picture. Click the dropdown menu to select an image from your computer.
Get the layout's background picture.
Set the layout’s background picture resize mode. See the layout Properties section for definitions of the acceptable values.
Get the layout’s background picture resize mode.
When set to true, it sets the layout to scrollable for users.
When set to false, it sets the layout to scrollable for users.
Gets the Layout’s scrollable status. Returns true (scrollable) or false (not scrollable).
When set to true, it sets the layout’s scroll bar to be visible to users.
When set to false, it sets the layout’s scroll bar to invisible for users.
Gets the layout’s scroll bar visibility status. Returns true (visible) or false (invisible).
To access the blocks specific to the container component:
Navigate to the Blocks tab.
In the component tree on the left, click the Container component that is nested under the layout component.
A drawer of container-specific blocks opens.
The blocks are the same as the ones above in the Layout Blocks section, but specific to the container instead of the layout.
The layout component is the foundation of custom data viewers, which allows for more precise positioning of UI components on an app screen.
Have feedback on this doc? Please take a moment to share your feedback here: Thunkable Docs Feedback. Your valuable insights will help us improve and better serve you in the future.