Getting Started with Codular
Codular is an AI-first no-code platform for building mobile apps. Design screens visually, add logic with flows, and export to React Native - no coding required.
Screens
Each screen is a page in your app. Add components like Text, Buttons, Images, and Lists to design your UI.
Components
Drag-and-drop UI building blocks. Each has properties (appearance), events (interactions), and styles (layout).
Flows
Visual logic builder. Connect nodes to define what happens when users tap buttons, submit forms, or load screens.
Variables
Store data like user input, API responses, or app state. Variables can be used across screens and flows.
Quick Start
Create a new project from the dashboard
Design your first screen by dragging components from the left palette
Configure component properties in the right panel
Switch to Flows tab to add logic (button actions, API calls, navigation)
Preview your app in the browser or on your phone via Companion
Build an APK/AAB when you're ready to publish
Variables
Variables store data that your app uses - user input, API responses, counters, lists, and more.
Variable Types
| Type | Default | Use Case |
|---|---|---|
| string | "" | Text input, names, messages |
| number | 0 | Counters, prices, scores |
| boolean | false | Toggles, on/off states, dark mode |
| array | [] | Todo lists, chat messages, search results |
| object | {} | User profiles, API responses, form data |
Using Variables
Bind to Components
Connect a variable to a TextInput, Switch, or List to display/edit its value automatically.
Set in Flows
Use the Set Variable node to update values when buttons are pressed or events fire.
Use in Text
Reference variables in text using ${variableName} syntax - e.g., "Hello, ${userName}!"
Persist with Storage
Save to Storage / Load from Storage nodes let you keep variable data between app sessions.
Components Reference
169 components across 12 categories
Layout12
ContainerContainer
A flexible box that holds other components inside it
Properties
| Name | Type | Default |
|---|---|---|
| scrollable | boolean | false |
Events
Horizontal ArrangementRow
Arranges child components side by side horizontally
Vertical ArrangementColumn
Stacks child components vertically from top to bottom
Card ViewCard
A raised surface with shadow for grouping content
Properties
| Name | Type | Default |
|---|---|---|
| elevation | number | 2 |
| outlined | boolean | false |
Events
Grid ViewGridView
Arranges children in a grid with multiple columns
Properties
| Name | Type | Default |
|---|---|---|
| columns | number | 2 |
SpacerSpace
Adds empty space between components
Properties
| Name | Type | Default |
|---|---|---|
| size | number | 16 |
Vertical ScrollScrollView
Makes content scrollable when it overflows vertically
Events
Horizontal ScrollHorizontalScroll
Makes content scrollable horizontally
Events
Swipe RefreshSwipeRefresh
Pull down to refresh content inside
Events
ModalModal
A popup dialog that appears over the current screen
Properties
| Name | Type | Default |
|---|---|---|
| visible | boolean | false |
| title | string | Modal Title |
| animationType | select | fade |
| dismissable | boolean | true |
Events
Bottom SheetBottomSheet
A panel that slides up from the bottom
Properties
| Name | Type | Default |
|---|---|---|
| visible | boolean | false |
Events
Web ViewerWebView
Displays a website inside your app
Properties
| Name | Type | Default |
|---|---|---|
| url | string | |
| scrollbar | boolean | true |
| visible | boolean | true |
| zoomEnabled | boolean | true |
| zoomDisplay | boolean | true |
| zoomPercent | number | 100 |
| desktopMode | boolean | false |
| followLinks | boolean | true |
| loadImages | boolean | true |
| ignoreSslErrors | boolean | false |
| useExternalBrowser | boolean | false |
| userAgent | string | |
| usesLocation | boolean | false |
| promptForPermission | boolean | true |
Events
Navigation4
Bottom NavigationBottomTabs
Navigation bar at the bottom with tab icons. Multiple styles available.
Properties
| Name | Type | Default |
|---|---|---|
| tabs | string | [] |
| variant | select | default |
| activeColor | color | #6d28d9 |
| inactiveColor | color | #94a3b8 |
| backgroundColor | color | #ffffff |
| showLabels | boolean | true |
| activeTab | number | 0 |
Events
Tab LayoutTabLayout
Swipeable tabs to switch between views
Properties
| Name | Type | Default |
|---|---|---|
| tabs | string | Tab 1,Tab 2 |
Events
Side MenuDrawer
Slide-out menu from the side of the screen
Events
View PagerViewPager
Swipe left/right to navigate between pages
Events
Display35
TextText
Displays text like headings, paragraphs, or labels
Properties
| Name | Type | Default |
|---|---|---|
| text | string | Hello World |
| variant | select | body |
| maxLines | number | 0 |
| selectable | boolean | false |
Events
ImageImage
Shows an image from a URL or uploaded file
Properties
| Name | Type | Default |
|---|---|---|
| source | image | |
| resizeMode | select | cover |
| borderRadius | number | 0 |
| alt | string |
Events
IconIcon
Displays a small icon symbol
Properties
| Name | Type | Default |
|---|---|---|
| name | icon | star |
| size | number | 24 |
| color | color | #000000 |
Events
DividerDivider
A thin horizontal line to separate content
BadgeBadge
A small label for status or notifications
Properties
| Name | Type | Default |
|---|---|---|
| text | string | New |
| variant | select | primary |
Progress BarProgressBar
Shows progress as a horizontal bar
Properties
| Name | Type | Default |
|---|---|---|
| progress | number | 50 |
| color | color | #3b82f6 |
AvatarAvatar
A circular image for user profile pictures
Properties
| Name | Type | Default |
|---|---|---|
| source | image | |
| name | string | |
| size | number | 48 |
Events
MapMap
Google Maps view with markers and user location
Properties
| Name | Type | Default |
|---|---|---|
| latitude | number | 37.7749 |
| longitude | number | -122.4194 |
| zoom | number | 12 |
| showUserLocation | boolean | false |
| mapType | select | standard |
| markers | string | [] |
Events
Video PlayerVideo
Play video from a URL with playback controls
Properties
| Name | Type | Default |
|---|---|---|
| url | string | |
| autoPlay | boolean | false |
| loop | boolean | false |
| muted | boolean | false |
| controls | boolean | true |
Events
Audio PlayerAudioPlayer
Play audio from a URL with playback controls
Properties
| Name | Type | Default |
|---|---|---|
| url | string | |
| autoPlay | boolean | false |
| loop | boolean | false |
Events
Lottie AnimationLottieAnimation
Play Lottie animations from a JSON file URL or asset
Properties
| Name | Type | Default |
|---|---|---|
| source | image | |
| autoPlay | boolean | true |
| loop | boolean | true |
| speed | number | 1 |
Events
PDF ViewerPDFViewer
Display PDF documents from URL or local file
Properties
| Name | Type | Default |
|---|---|---|
| source | string | |
| showToolbar | boolean | true |
Events
Barcode / QR GeneratorBarcodeGenerator
Generate QR codes and barcodes from text
Properties
| Name | Type | Default |
|---|---|---|
| value | string | |
| format | select | QR_CODE |
| size | number | 200 |
| color | color | #000000 |
Timer / CountdownTimer
Countdown timer with start, pause, reset controls
Properties
| Name | Type | Default |
|---|---|---|
| duration | number | 60 |
| autoStart | boolean | false |
| showMinutes | boolean | true |
Events
StopwatchStopwatch
Count up timer with lap support
Properties
| Name | Type | Default |
|---|---|---|
| showMilliseconds | boolean | true |
Events
ChartChart
Display bar, line, pie, or donut charts with data from variables
Properties
| Name | Type | Default |
|---|---|---|
| chartType | select | bar |
| dataVariable | string | |
| labels | string | Mon,Tue,Wed,Thu,Fri |
| colors | string | #3b82f6,#8b5cf6,#22c55e,#f59e0b,#ef4444 |
| showLegend | boolean | true |
| showGrid | boolean | true |
| title | string |
Events
Drawing CanvasDrawingCanvas
Freehand drawing surface — sketch, annotate, doodle
Properties
| Name | Type | Default |
|---|---|---|
| strokeColor | color | #000000 |
| strokeWidth | number | 3 |
| backgroundColor | color | #ffffff |
| tool | select | pen |
Events
Carousel / Image SliderCarousel
Swipeable image slider with dots indicator and auto-play
Properties
| Name | Type | Default |
|---|---|---|
| images | string | |
| autoPlay | boolean | true |
| interval | number | 3000 |
| showDots | boolean | true |
| borderRadius | number | 12 |
Events
Image GalleryImageGallery
A grid of tappable images with lightbox preview
Properties
| Name | Type | Default |
|---|---|---|
| variableId | string | |
| columns | number | 3 |
| gap | number | 4 |
| aspectRatio | select | square |
Events
Circular ProgressCircularProgress
A ring-shaped progress indicator
Properties
| Name | Type | Default |
|---|---|---|
| value | number | 75 |
| variableId | string | |
| size | number | 120 |
| strokeWidth | number | 10 |
| color | color | #3b82f6 |
| trackColor | color | #e2e8f0 |
| showValue | boolean | true |
| label | string |
Skeleton LoaderSkeletonLoader
Animated loading placeholder
Properties
| Name | Type | Default |
|---|---|---|
| variant | select | text |
| lines | number | 3 |
| width | number | 0 |
| height | number | 0 |
Countdown TimerCountdownTimer
A visual countdown display
Properties
| Name | Type | Default |
|---|---|---|
| targetDate | string | |
| variableId | string | |
| showDays | boolean | true |
| showHours | boolean | true |
| showMinutes | boolean | true |
| showSeconds | boolean | true |
Events
Product CardProductCard
Display a product with image, title, price, and rating
Properties
| Name | Type | Default |
|---|---|---|
| title | string | Product Name |
| price | string | $99.00 |
| originalPrice | string | |
| image | image | |
| rating | number | 4.5 |
| badge | string |
Events
Cart BadgeCartBadge
Shopping cart icon with item count
Properties
| Name | Type | Default |
|---|---|---|
| count | number | 0 |
| variableId | string | |
| iconColor | color | #0f172a |
| badgeColor | color | #ef4444 |
Events
Price TagPriceTag
Formatted price display with optional discount
Properties
| Name | Type | Default |
|---|---|---|
| price | string | $99.00 |
| originalPrice | string | |
| currency | string | $ |
| showDiscount | boolean | true |
Order TrackerOrderTracker
Step progress for order status tracking
Properties
| Name | Type | Default |
|---|---|---|
| steps | string | Ordered,Shipped,Out for Delivery,Delivered |
| currentStep | number | 1 |
| variableId | string | |
| color | color | #22c55e |
Chat BubbleChatBubble
Message bubble with sent/received styling
Properties
| Name | Type | Default |
|---|---|---|
| message | string | Hello! |
| isSent | boolean | false |
| timestamp | string | |
| senderName | string | |
| avatar | image | |
| sentColor | color | #3b82f6 |
| receivedColor | color | #f1f5f9 |
Events
Post CardPostCard
Social media post with image, text, like/comment/share
Properties
| Name | Type | Default |
|---|---|---|
| author | string | User Name |
| authorAvatar | image | |
| content | string | This is a sample post! |
| image | image | |
| likes | number | 42 |
| comments | number | 5 |
| timeAgo | string | 2h ago |
Events
Story CircleStoryCircle
Instagram-style circular story avatar
Properties
| Name | Type | Default |
|---|---|---|
| image | image | |
| label | string | User |
| hasStory | boolean | true |
| size | number | 72 |
| borderColor | color | #ec4899 |
Events
Quiz CardQuizCard
Question card with multiple choice options
Properties
| Name | Type | Default |
|---|---|---|
| question | string | What is 2 + 2? |
| options | string | 3,4,5,6 |
| correctAnswer | string | 4 |
| variableId | string |
Events
FlashcardFlashcard
A flip card with front and back for learning
Properties
| Name | Type | Default |
|---|---|---|
| front | string | Question |
| back | string | Answer |
| frontColor | color | #3b82f6 |
| backColor | color | #22c55e |
Events
Music PlayerMusicPlayer
Full audio player with progress, controls, and artwork
Properties
| Name | Type | Default |
|---|---|---|
| title | string | Song Title |
| artist | string | Artist Name |
| artwork | image | |
| audioUrl | string |
Events
Map MarkerMapMarker
A customizable pin for use on maps
Properties
| Name | Type | Default |
|---|---|---|
| latitude | number | 0 |
| longitude | number | 0 |
| title | string | Location |
| color | color | #ef4444 |
Events
Place CardPlaceCard
Location card with address, rating, and distance
Properties
| Name | Type | Default |
|---|---|---|
| name | string | Place Name |
| address | string | 123 Main St |
| rating | number | 4.2 |
| distance | string | 1.2 km |
| image | image | |
| category | string | Restaurant |
Events
Game Grid (2048)GameGrid
A 2048-style sliding puzzle game with swipe controls and scoring
Properties
| Name | Type | Default |
|---|---|---|
| gridSize | select | 4 |
| scoreVariableId | string | |
| bestScoreVariableId | string | |
| gameStateVariableId | string | |
| targetTile | number | 2048 |
| bgColor | color | #bbada0 |
| emptyTileColor | color | #cdc1b4 |
| tile2Color | color | #eee4da |
| tile4Color | color | #ede0c8 |
| tile8Color | color | #f2b179 |
| tile16Color | color | #f59563 |
| tile32Color | color | #f67c5f |
| tile64Color | color | #f65e3b |
| tile128Color | color | #edcf72 |
| tile256Color | color | #edcc61 |
| tile512Color | color | #edc850 |
| tile1024Color | color | #edc53f |
| tile2048Color | color | #edc22e |
| tileLowTextColor | color | #776e65 |
| tileHighTextColor | color | #f9f6f2 |
| tileRadius | number | 6 |
Events
Input30
ButtonButton
A clickable button that triggers an action
Properties
| Name | Type | Default |
|---|---|---|
| title | string | Button |
| variant | select | primary |
| disabled | boolean | false |
| fullWidth | boolean | true |
| icon | icon |
Events
Text InputTextInput
A single-line text field for user input
Properties
| Name | Type | Default |
|---|---|---|
| placeholder | string | Enter text... |
| label | string | |
| secureTextEntry | boolean | false |
| keyboardType | select | default |
| variableId | string | |
| maxLength | number | 0 |
| autoFocus | boolean | false |
| multiline | boolean | false |
Events
Text AreaTextArea
A multi-line text field for longer input
Properties
| Name | Type | Default |
|---|---|---|
| placeholder | string | Enter text... |
| numberOfLines | number | 4 |
| variableId | string |
Events
SwitchSwitch
A toggle switch for on/off settings
Properties
| Name | Type | Default |
|---|---|---|
| label | string | Toggle |
| variableId | string | |
| trackColor | color | #3b82f6 |
Events
CheckboxCheckbox
A checkable box for yes/no choices
Properties
| Name | Type | Default |
|---|---|---|
| label | string | Check me |
| variableId | string | |
| color | color | #3b82f6 |
Events
DropdownDropdown
A dropdown menu to pick from a list of options
Properties
| Name | Type | Default |
|---|---|---|
| label | string | Select |
| placeholder | string | Choose an option |
| variableId | string |
Events
Date PickerDatePicker
Opens a calendar to pick a date
Properties
| Name | Type | Default |
|---|---|---|
| label | string | Select date |
| variableId | string |
Events
Radio ButtonRadioButton
Select one option from a group
Properties
| Name | Type | Default |
|---|---|---|
| label | string | Option |
| variableId | string |
Events
SliderSlider
Drag a handle to select a value in a range
Properties
| Name | Type | Default |
|---|---|---|
| min | number | 0 |
| max | number | 100 |
| step | number | 1 |
| variableId | string |
Events
Floating Action ButtonFloatingButton
A round button that floats above content
Properties
| Name | Type | Default |
|---|---|---|
| icon | icon | plus |
| size | select | normal |
Events
CameraCamera
Take a photo or record video using the device camera
Properties
| Name | Type | Default |
|---|---|---|
| quality | select | medium |
| cameraType | select | back |
| flashMode | select | off |
Events
Image PickerImagePicker
Pick an image or video from the device gallery
Properties
| Name | Type | Default |
|---|---|---|
| allowMultiple | boolean | false |
| maxFiles | number | 1 |
| mediaType | select | images |
Events
Audio RecorderAudioRecorder
Record audio from the device microphone
Properties
| Name | Type | Default |
|---|---|---|
| maxDuration | number | 60 |
| format | select | m4a |
Events
Contact PickerContactPicker
Pick a contact from the device address book
Events
QR/Barcode ScannerQRScanner
Scan QR codes and barcodes using the device camera
Properties
| Name | Type | Default |
|---|---|---|
| cameraType | select | back |
Events
Signature PadSignaturePad
Capture signatures — for forms, contracts, deliveries
Properties
| Name | Type | Default |
|---|---|---|
| penColor | color | #1e293b |
| penWidth | number | 2 |
| placeholder | string | Sign here |
| backgroundColor | color | #f8fafc |
| variableId | string |
Events
Color PickerColorPicker
Let users pick a color — for themes, customization, design tools
Properties
| Name | Type | Default |
|---|---|---|
| defaultColor | color | #3b82f6 |
| showHex | boolean | true |
| palette | string | #ef4444,#f59e0b,#22c55e,#3b82f6,#8b5cf6,#ec4899,#000000,#ffffff |
| variableId | string |
Events
Time PickerTimePicker
Pick a time (hours and minutes) — for alarms, scheduling, reminders
Properties
| Name | Type | Default |
|---|---|---|
| format | select | 12h |
| defaultTime | string | 09:00 |
| variableId | string |
Events
Rating BarRatingBar
Star rating component — 1 to 5 stars for reviews and feedback
Properties
| Name | Type | Default |
|---|---|---|
| maxStars | number | 5 |
| defaultRating | number | 0 |
| size | number | 28 |
| activeColor | color | #f59e0b |
| inactiveColor | color | #e2e8f0 |
| readOnly | boolean | false |
| variableId | string |
Events
Stepper / Number PickerStepper
Increment/decrement number with + and - buttons
Properties
| Name | Type | Default |
|---|---|---|
| min | number | 0 |
| max | number | 100 |
| step | number | 1 |
| defaultValue | number | 0 |
| variableId | string |
Events
Chip / Tag GroupChipGroup
Selectable chips/tags — for filters, categories, multi-select
Properties
| Name | Type | Default |
|---|---|---|
| chips | string | Option 1,Option 2,Option 3 |
| multiSelect | boolean | false |
| activeColor | color | #3b82f6 |
| variableId | string |
Events
Search BarSearchBar
Search input with icon, clear button, and voice search option
Properties
| Name | Type | Default |
|---|---|---|
| placeholder | string | Search... |
| showVoice | boolean | false |
| showClear | boolean | true |
| variableId | string |
Events
OTP InputOTPInput
A verification code input with separate digit boxes
Properties
| Name | Type | Default |
|---|---|---|
| length | number | 6 |
| variableId | string | |
| secureTextEntry | boolean | false |
Events
CalendarCalendar
A monthly calendar view for selecting dates
Properties
| Name | Type | Default |
|---|---|---|
| variableId | string | |
| minDate | string | |
| maxDate | string | |
| highlightToday | boolean | true |
Events
Rich Text EditorRichTextEditor
A text editor with bold, italic, and list formatting
Properties
| Name | Type | Default |
|---|---|---|
| variableId | string | |
| placeholder | string | Start typing... |
| minHeight | number | 200 |
Events
Quantity StepperQuantityStepper
+/- quantity selector for cart items
Properties
| Name | Type | Default |
|---|---|---|
| variableId | string | |
| min | number | 1 |
| max | number | 99 |
Events
Coupon InputCouponInput
Promo code input with apply button
Properties
| Name | Type | Default |
|---|---|---|
| variableId | string | |
| placeholder | string | Enter coupon code |
| buttonText | string | Apply |
Events
Chat InputChatInput
Text input with send button and attachment
Properties
| Name | Type | Default |
|---|---|---|
| variableId | string | |
| placeholder | string | Type a message... |
| showAttachment | boolean | true |
Events
Like ButtonLikeButton
Animated like/heart button with count
Properties
| Name | Type | Default |
|---|---|---|
| count | number | 0 |
| variableId | string | |
| liked | boolean | false |
| likedVariableId | string | |
| color | color | #ef4444 |
Events
Swipe ButtonSwipeButton
Swipe-to-confirm button with animated slider thumb, icon, and label
Properties
| Name | Type | Default |
|---|---|---|
| title | string | Swipe to confirm |
| thumbIcon | icon | ChevronRight |
| trailIcon | icon | |
| thumbColor | color | #c8ff00 |
| trackColor | color | #2a2a1e |
| textColor | color | #ffffff |
| thumbSize | number | 52 |
| resetAfterSlide | boolean | true |
| disabled | boolean | false |
Events
Data4
ListList
Displays a scrollable list of items from data
Properties
| Name | Type | Default |
|---|---|---|
| dataSourceId | string | |
| variableId | string | |
| emptyText | string | No items |
| showDivider | boolean | true |
| itemHeight | number | 56 |
Events
Data TableDataTable
Displays data in rows and columns like a spreadsheet
Properties
| Name | Type | Default |
|---|---|---|
| variableId | string | |
| columns | string |
Events
Message ListMessageList
Scrollable chat messages container (auto-scrolls to bottom)
Properties
| Name | Type | Default |
|---|---|---|
| variableId | string | |
| emptyText | string | No messages yet |
Events
Kanban BoardKanbanBoard
Drag-and-drop columns (Todo/Doing/Done)
Properties
| Name | Type | Default |
|---|---|---|
| columns | string | Todo,In Progress,Done |
| variableId | string |
Events
Storage3
Local StorageLocalStorage
Save and load data on the device. Data persists between app sessions.
Properties
| Name | Type | Default |
|---|---|---|
| namespace | string | app_data |
Cloud DatabaseCloudDB
Store data in the cloud. Sync across devices. Requires Supabase setup.
Properties
| Name | Type | Default |
|---|---|---|
| provider | select | supabase |
| apiUrl | string | |
| apiKey | string |
File StorageFileStorage
Upload and download files. Store images, documents, and media.
Properties
| Name | Type | Default |
|---|---|---|
| provider | select | local |
Feedback7
SnackbarSnackbar
A brief message bar at the bottom of the screen with an optional action
Properties
| Name | Type | Default |
|---|---|---|
| message | string | Action completed |
| actionLabel | string | |
| visible | boolean | false |
Events
Local NotificationLocalNotification
Schedule local notifications on the device — no server needed
Properties
| Name | Type | Default |
|---|---|---|
| title | string | Reminder |
| body | string | |
| channelId | string | default |
Events
Alert DialogAlertDialog
Alert dialog with icon, title, message, and confirm/cancel buttons
Properties
| Name | Type | Default |
|---|---|---|
| visible | boolean | false |
| icon | icon | AlertCircle |
| iconColor | color | #ef4444 |
| title | string | Are you sure? |
| message | string | This action cannot be undone. |
| confirmText | string | Confirm |
| cancelText | string | Cancel |
| confirmColor | color | #ef4444 |
| variant | select | default |
Events
Confirm DialogConfirmDialog
Success/info dialog with image or icon, title, message, and action buttons
Properties
| Name | Type | Default |
|---|---|---|
| visible | boolean | false |
| image | image | |
| icon | icon | CheckCircle |
| iconColor | color | #22c55e |
| title | string | Success! |
| message | string | Your action was completed. |
| primaryText | string | Continue |
| secondaryText | string | |
| primaryColor | color | #3b82f6 |
Events
Input DialogInputDialog
Dialog with text input — for prompts, rename, etc.
Properties
| Name | Type | Default |
|---|---|---|
| visible | boolean | false |
| title | string | Enter Value |
| message | string | |
| placeholder | string | Type here... |
| inputType | select | text |
| confirmText | string | Submit |
| cancelText | string | Cancel |
| confirmColor | color | #3b82f6 |
| variableId | string |
Events
Action SheetActionSheet
Bottom slide-up sheet with action options — like iOS action sheet
Properties
| Name | Type | Default |
|---|---|---|
| visible | boolean | false |
| title | string | Choose an option |
| options | string | Edit,Share,Delete |
| destructiveIndex | number | -1 |
| cancelText | string | Cancel |
Events
Loading DialogLoadingDialog
Loading overlay with spinner and optional message
Properties
| Name | Type | Default |
|---|---|---|
| visible | boolean | false |
| message | string | Please wait... |
| variant | select | overlay |
| spinnerColor | color | #3b82f6 |
Monetization32
AdMob BannerAdMobBanner
Displays a Google AdMob banner ad
Properties
| Name | Type | Default |
|---|---|---|
| adUnitId | string | |
| size | select | BANNER |
| testMode | boolean | true |
| visible | boolean | true |
Events
AdMob InterstitialAdMobInterstitial
Full-screen Google AdMob interstitial ad (shown via flow)
Properties
| Name | Type | Default |
|---|---|---|
| adUnitId | string | |
| testMode | boolean | true |
| autoLoad | boolean | true |
Events
AdMob RewardedAdMobRewarded
Google AdMob rewarded video ad — user watches ad to earn reward
Properties
| Name | Type | Default |
|---|---|---|
| adUnitId | string | |
| testMode | boolean | true |
| autoLoad | boolean | true |
Events
AdMob Native AdAdMobNative
Google AdMob native ad that blends with your app content
Properties
| Name | Type | Default |
|---|---|---|
| adUnitId | string | |
| testMode | boolean | true |
| mediaAspectRatio | select | ANY |
| visible | boolean | true |
Events
AdMob App OpenAdMobAppOpen
Google AdMob app open ad shown when app comes to foreground
Properties
| Name | Type | Default |
|---|---|---|
| adUnitId | string | |
| testMode | boolean | true |
| autoShow | boolean | true |
Events
AdMob Rewarded InterstitialAdMobRewardedInterstitial
Google AdMob rewarded interstitial — full-screen ad with optional reward
Properties
| Name | Type | Default |
|---|---|---|
| adUnitId | string | |
| testMode | boolean | true |
| autoLoad | boolean | true |
Events
Ad Manager BannerAdManagerBanner
Google Ad Manager banner ad
Properties
| Name | Type | Default |
|---|---|---|
| adUnitId | string | |
| size | select | BANNER |
| testMode | boolean | true |
| visible | boolean | true |
Events
Ad Manager InterstitialAdManagerInterstitial
Google Ad Manager full-screen interstitial ad
Properties
| Name | Type | Default |
|---|---|---|
| adUnitId | string | |
| testMode | boolean | true |
| autoLoad | boolean | true |
Events
Ad Manager RewardedAdManagerRewarded
Google Ad Manager rewarded video ad
Properties
| Name | Type | Default |
|---|---|---|
| adUnitId | string | |
| testMode | boolean | true |
| autoLoad | boolean | true |
Events
Ad Manager Native AdAdManagerNative
Google Ad Manager native ad layout that blends with app content
Properties
| Name | Type | Default |
|---|---|---|
| adUnitId | string | |
| testMode | boolean | true |
| mediaAspectRatio | select | ANY |
| visible | boolean | true |
Events
Ad Manager App OpenAdManagerAppOpen
Google Ad Manager app open ad shown when app comes to foreground
Properties
| Name | Type | Default |
|---|---|---|
| adUnitId | string | |
| testMode | boolean | true |
| autoShow | boolean | true |
Events
Ad Manager Rewarded InterstitialAdManagerRewardedInterstitial
Google Ad Manager rewarded interstitial ad
Properties
| Name | Type | Default |
|---|---|---|
| adUnitId | string | |
| testMode | boolean | true |
| autoLoad | boolean | true |
Events
Facebook BannerFacebookBanner
Displays a Meta Audience Network banner ad
Properties
| Name | Type | Default |
|---|---|---|
| placementId | string | |
| size | select | STANDARD |
| visible | boolean | true |
Events
Facebook InterstitialFacebookInterstitial
Full-screen Meta Audience Network interstitial ad
Properties
| Name | Type | Default |
|---|---|---|
| placementId | string | |
| autoLoad | boolean | true |
Events
Facebook RewardedFacebookRewarded
Meta Audience Network rewarded video ad
Properties
| Name | Type | Default |
|---|---|---|
| placementId | string | |
| autoLoad | boolean | true |
Events
Unity BannerUnityBanner
Displays a Unity Ads banner
Properties
| Name | Type | Default |
|---|---|---|
| gameId | string | |
| placementId | string | banner |
| testMode | boolean | true |
| visible | boolean | true |
Events
Unity InterstitialUnityInterstitial
Full-screen Unity Ads interstitial
Properties
| Name | Type | Default |
|---|---|---|
| gameId | string | |
| placementId | string | interstitial |
| testMode | boolean | true |
Events
Unity RewardedUnityRewarded
Unity Ads rewarded video — user watches ad for reward
Properties
| Name | Type | Default |
|---|---|---|
| gameId | string | |
| placementId | string | rewarded |
| testMode | boolean | true |
Events
AppLovin BannerAppLovinBanner
AppLovin MAX banner ad
Properties
| Name | Type | Default |
|---|---|---|
| adUnitId | string | |
| size | select | BANNER |
| visible | boolean | true |
Events
AppLovin InterstitialAppLovinInterstitial
AppLovin MAX full-screen interstitial ad
Properties
| Name | Type | Default |
|---|---|---|
| adUnitId | string |
Events
AppLovin RewardedAppLovinRewarded
AppLovin MAX rewarded video ad
Properties
| Name | Type | Default |
|---|---|---|
| adUnitId | string |
Events
Start.io BannerStartIoBanner
Start.io banner ad
Properties
| Name | Type | Default |
|---|---|---|
| appId | string | |
| size | select | BANNER |
| visible | boolean | true |
Events
Start.io InterstitialStartIoInterstitial
Start.io full-screen interstitial ad
Properties
| Name | Type | Default |
|---|---|---|
| appId | string |
Events
Start.io RewardedStartIoRewarded
Start.io rewarded video ad
Properties
| Name | Type | Default |
|---|---|---|
| appId | string |
Events
Razorpay Pay ButtonRazorpayButton
Accept payments via Razorpay. Supports UPI, cards, netbanking, wallets.
Properties
| Name | Type | Default |
|---|---|---|
| apiKey | string | |
| amount | number | 10000 |
| currency | select | INR |
| name | string | My Store |
| description | string | Purchase |
| buttonText | string | Pay Now |
| color | color | #528FF0 |
| prefillEmail | string | |
| prefillPhone | string |
Events
Stripe Pay ButtonStripeButton
Accept payments via Stripe. Supports cards, Apple Pay, Google Pay.
Properties
| Name | Type | Default |
|---|---|---|
| publishableKey | string | |
| amount | number | 1000 |
| currency | select | usd |
| buttonText | string | Pay with Card |
| description | string | Purchase |
Events
PayPal Pay ButtonPayPalButton
Accept payments via PayPal. One-time and subscription payments.
Properties
| Name | Type | Default |
|---|---|---|
| clientId | string | |
| amount | number | 10 |
| currency | select | USD |
| buttonText | string | Pay with PayPal |
Events
In-App PurchaseInAppPurchase
Sell digital products or subscriptions within your app (Google Play / App Store).
Properties
| Name | Type | Default |
|---|---|---|
| productId | string | |
| productType | select | one_time |
| buttonText | string | Purchase |
Events
Play Store ReviewPlayStoreReview
Prompt users to rate and review your app on Google Play Store
Properties
| Name | Type | Default |
|---|---|---|
| minLaunches | number | 5 |
| minDays | number | 3 |
Events
Play Store UpdatePlayStoreUpdate
Check for app updates and prompt users to update from Google Play Store
Properties
| Name | Type | Default |
|---|---|---|
| updateMode | select | flexible |
| checkOnLoad | boolean | true |
Events
Google Play BillingGooglePlayBilling
Accept payments through Google Play Store — one-time purchases, subscriptions, and consumables
Properties
| Name | Type | Default |
|---|---|---|
| productIds | string | |
| purchaseType | select | inapp |
| buttonText | string | Buy Now |
| autoFetchPrices | boolean | true |
Events
Play Store SubscriptionPlayStoreSubscription
Manage recurring subscriptions via Google Play — monthly, yearly, free trial
Properties
| Name | Type | Default |
|---|---|---|
| subscriptionId | string | |
| planId | string | |
| offerId | string | |
| buttonText | string | Subscribe |
| showPrice | boolean | true |
Events
Authentication9
Google Sign-InGoogleSignIn
Lets users sign in with their Google account
Properties
| Name | Type | Default |
|---|---|---|
| clientId | string | |
| scopes | string | email,profile |
| autoSignIn | boolean | false |
Events
Facebook LoginFacebookLogin
Lets users sign in with their Facebook account
Properties
| Name | Type | Default |
|---|---|---|
| appId | string | |
| permissions | string | public_profile,email |
Events
Firebase Email AuthFirebaseAuth
Firebase email/password authentication
Properties
| Name | Type | Default |
|---|---|---|
| projectId | string | |
| apiKey | string | |
| allowSignUp | boolean | true |
| emailVerification | boolean | false |
Events
Firebase Google AuthFirebaseGoogleAuth
Sign in with Google via Firebase Authentication
Properties
| Name | Type | Default |
|---|---|---|
| projectId | string | |
| apiKey | string | |
| clientId | string |
Events
Firebase Phone AuthFirebasePhoneAuth
Sign in with phone number via Firebase (OTP verification)
Properties
| Name | Type | Default |
|---|---|---|
| projectId | string | |
| apiKey | string | |
| timeout | number | 60 |
| autoVerify | boolean | true |
Events
Apple Sign-InAppleSignIn
Lets users sign in with their Apple ID (iOS)
Properties
| Name | Type | Default |
|---|---|---|
| serviceId | string | |
| requestedScopes | string | fullName,email |
Events
GitHub LoginGitHubLogin
Lets users sign in with their GitHub account
Properties
| Name | Type | Default |
|---|---|---|
| clientId | string | |
| scopes | string | user:email |
Events
Twitter/X LoginTwitterLogin
Lets users sign in with their Twitter/X account
Properties
| Name | Type | Default |
|---|---|---|
| apiKey | string | |
| apiSecret | string |
Events
Biometric AuthBiometricAuth
Authenticate using fingerprint or Face ID
Properties
| Name | Type | Default |
|---|---|---|
| promptTitle | string | Authenticate |
| promptSubtitle | string | Use biometrics to continue |
| cancelText | string | Cancel |
Events
Firebase7
Firebase Realtime DBFirebaseDatabase
Read and write data to Firebase Realtime Database
Properties
| Name | Type | Default |
|---|---|---|
| projectId | string | |
| apiKey | string | |
| databaseUrl | string | |
| path | string | / |
Events
Firebase FirestoreFirebaseFirestore
Read and write documents in Cloud Firestore
Properties
| Name | Type | Default |
|---|---|---|
| projectId | string | |
| apiKey | string | |
| collection | string |
Events
Firebase StorageFirebaseStorage
Upload and download files from Firebase Cloud Storage
Properties
| Name | Type | Default |
|---|---|---|
| projectId | string | |
| apiKey | string | |
| storageBucket | string | |
| maxFileSize | number | 10 |
Events
Firebase Push NotificationsFirebaseMessaging
Send and receive push notifications via Firebase Cloud Messaging
Properties
| Name | Type | Default |
|---|---|---|
| projectId | string | |
| apiKey | string | |
| topic | string | |
| requestPermission | boolean | true |
Events
Firebase AnalyticsFirebaseAnalytics
Track user events and app usage with Firebase Analytics
Properties
| Name | Type | Default |
|---|---|---|
| projectId | string | |
| apiKey | string | |
| analyticsEnabled | boolean | true |
| sessionTimeout | number | 30 |
Firebase CrashlyticsFirebaseCrashlytics
Automatic crash reporting with Firebase Crashlytics
Properties
| Name | Type | Default |
|---|---|---|
| projectId | string | |
| apiKey | string | |
| enabled | boolean | true |
| collectUserId | boolean | false |
Firebase Remote ConfigFirebaseRemoteConfig
Remotely configure your app without publishing updates
Properties
| Name | Type | Default |
|---|---|---|
| projectId | string | |
| apiKey | string | |
| fetchInterval | number | 3600 |
| defaults | string | {} |
Events
Social6
Share ButtonShareButton
Native share dialog to share text, links, or images
Properties
| Name | Type | Default |
|---|---|---|
| title | string | Share |
| message | string | |
| url | string | |
| variant | select | primary |
Events
Deep LinkDeepLink
Handle deep links and universal links to open specific screens
Properties
| Name | Type | Default |
|---|---|---|
| scheme | string | myapp |
| host | string | |
| pathPrefix | string | / |
Events
Activity StarterActivityStarter
Launch other apps or Android intents — open settings, maps, other apps
Properties
| Name | Type | Default |
|---|---|---|
| action | select | android.intent.action.VIEW |
| customAction | string | |
| dataUri | string | |
| dataType | string | |
| packageName | string | |
| className | string | |
| extraKey | string | |
| extraValue | string |
Events
SMS SenderSMSSender
Send SMS messages via device intent
Properties
| Name | Type | Default |
|---|---|---|
| phoneNumber | string | |
| message | string |
Events
Email SenderEmailSender
Send emails via device email app
Properties
| Name | Type | Default |
|---|---|---|
| to | string | |
| subject | string | |
| body | string |
Events
Phone CallPhoneCall
Initiate a phone call via device dialer
Properties
| Name | Type | Default |
|---|---|---|
| phoneNumber | string |
Events
Media20
Flashlight / TorchFlashlight
Control the device flashlight/torch
Battery StatusBatteryStatus
Get device battery level and charging status
Events
AccelerometerAccelerometer
Detect device motion and orientation changes
Properties
| Name | Type | Default |
|---|---|---|
| updateInterval | number | 100 |
Events
GyroscopeGyroscope
Detect device rotation rate
Properties
| Name | Type | Default |
|---|---|---|
| updateInterval | number | 100 |
Events
Bluetooth AdminBluetoothAdmin
Check Bluetooth status, enable/disable, get device name and address
Events
Bluetooth ClientBluetoothClient
Connect to other Bluetooth devices — Arduino, printers, sensors. Your app initiates the connection.
Properties
| Name | Type | Default |
|---|---|---|
| uuid | string | 00001101-0000-1000-8000-00805F9B34FB |
| secure | boolean | true |
Events
Bluetooth ServerBluetoothServer
Accept incoming Bluetooth connections — your app listens and waits for other devices.
Properties
| Name | Type | Default |
|---|---|---|
| uuid | string | 00001101-0000-1000-8000-00805F9B34FB |
| name | string | CodularBT |
Events
NFC Reader/WriterNFC
Read and write NFC tags
Events
Arduino / SerialArduino
Communicate with Arduino and serial devices over Bluetooth or USB
Properties
| Name | Type | Default |
|---|---|---|
| connectionType | select | bluetooth |
| baudRate | select | 9600 |
| delimiter | string | \n |
Events
FTP ClientFTP
Upload and download files via FTP/SFTP server
Properties
| Name | Type | Default |
|---|---|---|
| host | string | |
| port | number | 21 |
| username | string | |
| password | string | |
| secure | boolean | false |
Events
Network StatusNetworkStatus
Check internet connectivity — WiFi, mobile data, offline detection
Events
PrinterPrinter
Print documents, images, or HTML content to any connected printer (WiFi, USB, system print dialog)
Properties
| Name | Type | Default |
|---|---|---|
| printType | select | html |
| content | string | |
| jobName | string | Print Job |
Events
Thermal PrinterThermalPrinter
Print receipts and labels via Bluetooth or USB thermal printer (ESC/POS compatible)
Properties
| Name | Type | Default |
|---|---|---|
| connectionType | select | bluetooth |
| deviceAddress | string | |
| port | number | 9100 |
| paperWidth | select | 58 |
| encoding | select | UTF-8 |
Events
WiFi StatusWifiStatus
Get WiFi connection status and network info
Events
Screen BrightnessScreenBrightness
Get and set screen brightness level
Text to SpeechTextToSpeech
Convert text to spoken audio
Properties
| Name | Type | Default |
|---|---|---|
| language | select | en-US |
| pitch | number | 1 |
| rate | number | 1 |
Events
Speech to TextSpeechToText
Convert spoken audio to text using device microphone
Properties
| Name | Type | Default |
|---|---|---|
| language | select | en-US |
| continuous | boolean | false |
Events
File PickerFilePicker
Pick any file from device storage
Properties
| Name | Type | Default |
|---|---|---|
| fileTypes | select | */* |
| multiple | boolean | false |
Events
File DownloaderFileDownloader
Download files from URL to device storage
Properties
| Name | Type | Default |
|---|---|---|
| url | string | |
| fileName | string |
Events
GeofencingGeofencing
Monitor when device enters or exits a geographic area
Properties
| Name | Type | Default |
|---|---|---|
| latitude | number | 0 |
| longitude | number | 0 |
| radius | number | 100 |
Events
Flow Nodes Reference
Visual logic building blocks - connect nodes to create app behavior
Trigger
Action
Logic
Data
Storage
Cloud DB
Auth
Social
Ads
Firebase
Media
Payments
Play Store
Device
Communication
Speech
Files
Timer
Notifications
Sensors
Extensions
Extend Codular with custom components and flow nodes. Create your own, import from the community, or share with others.
What Extensions Can Do
Custom Components
Add new UI components with custom properties and events. They appear in the Extensions category of the palette.
Custom Flow Nodes
Add new flow nodes with configurable inputs. They appear in the Nodes sidebar under your extension's name.
Share & Import
Export as .codular-ext files, publish to the community marketplace, or import extensions from other users.
Creating an Extension
Open your project in the builder
Go to Project > Extensions from the menu bar
In the Create Component tab, define your component's name, properties, events, and optional flow nodes
Click "Add to This Project" to register it immediately, or "Export .codular-ext" to save as a file
Your extension appears in the Extensions category (puzzle icon) in the component palette
Custom flow nodes appear in the Nodes sidebar under your extension's name
Extension Definition Format
{
"type": "custom_rating_stars",
"label": "Rating Stars",
"description": "A star rating component",
"icon": "Star",
"acceptsChildren": false,
"props": [
{ "name": "maxStars", "label": "Max Stars", "type": "number", "defaultValue": 5 },
{ "name": "color", "label": "Star Color", "type": "color", "defaultValue": "#f59e0b" }
],
"events": ["onRatingChange"],
"flowNodes": [
{
"type": "ext_set_rating",
"label": "Set Rating",
"description": "Set the rating value programmatically",
"icon": "Star",
"color": "#f59e0b",
"inputs": [
{ "name": "value", "label": "Rating Value", "type": "number", "defaultValue": 0 },
{ "name": "targetVar", "label": "Save to Variable", "type": "variable", "defaultValue": "" }
]
}
]
}Importing Extensions
From file: Go to Project > Extensions > Import tab. Select a .codular-ext file.
From community: Browse the Community page, find an extension, and click Install.
The extension is registered in your project and saved automatically.
Properties & Events
Properties
Every component has configurable properties. Select a component on the canvas, and its properties appear in the right panel.
| Property Type | Description | Example |
|---|---|---|
| string | Text value | Button label, placeholder text |
| number | Numeric value | Font size, border radius |
| boolean | True/false toggle | Visible, disabled |
| color | Color picker | Background color, text color |
| select | Dropdown options | Alignment, resize mode |
| image | Image URL or asset | Image source, icon |
| variable | Bind to a variable | Dynamic text, list data |
Events
Events fire when users interact with components. Connect events to flows to define behavior.
User taps the component
Used by: Button, Card, Container
Value changes (text input, switch)
Used by: TextInput, Switch, Slider
Form is submitted
Used by: TextInput
Screen finishes loading
Used by: Screen
Pull-to-refresh triggered
Used by: SwipeRefresh
Tab selection changes
Used by: BottomTabs, TabLayout
Storage & API
Local Storage
Save data on the device that persists when the app is closed. Use the Save to Storage, Load from Storage, and Remove from Storage flow nodes.
Cloud Database (Supabase / Firebase)
Connect to Supabase or Firebase to store data in the cloud. Use the Cloud DB flow nodes (Read, Insert, Update, Delete).
Supabase Setup
- Create project at supabase.com
- API URL = Settings > API > Project URL
- API Key = Settings > API > anon public key
- Create tables in Table Editor first
Firebase Setup
- Create project at console.firebase.google.com
- API URL = Realtime Database URL
- API Key = Project Settings > Web API Key
- No google-services.json needed (REST API)
API Call
Use the API Call flow node to send HTTP requests. Supports GET, POST, PUT, DELETE methods. The response is automatically parsed as JSON and can be stored in a variable.
Asset Storage
Images and files are uploaded to Mobcraft Storage (cloud CDN). Each project gets its own folder. Max 50MB per file, 2GB total on the free tier.
| Type | Formats | Use In |
|---|---|---|
| Images | PNG, JPG, WebP, GIF, SVG | Image component, Background Image, Avatar |
| Fonts | TTF, OTF, WOFF, WOFF2 | Font Family picker in Style panel |
| Lottie | JSON (Lottie animation files) | LottieAnimation component |
| Video | MP4, WebM, MOV | Video component |
| Audio | MP3, WAV, FLAC, AAC | AudioPlayer component, Play Audio flow node |
Lottie Animations
Add rich animations to your app using Lottie. Upload a .json Lottie file to Assets, then use the LottieAnimation component.
LottieAnimation
Drag onto screen. Set source to a Lottie JSON URL or pick from assets.
Flow Control
Use Play Lottie, Pause Lottie, Reset Lottie nodes to control animations.
Events
onAnimationFinish, onAnimationLoop, onPress - trigger flows when animation completes.
Custom Fonts
Upload .ttf, .otf, or .woff font files in the Assets Manager. They appear in the Font Family dropdown in the Style panel for any text component.
Themes
Customize your app's appearance globally. Theme values are applied to all components.
| Property | Default | Description |
|---|---|---|
| primaryColor | #3b82f6 | Main brand color (buttons, links, active states) |
| secondaryColor | #8b5cf6 | Accent color for secondary actions |
| backgroundColor | #f8fafc | App background color |
| surfaceColor | #ffffff | Card/surface background color |
| textColor | #0f172a | Primary text color |
| textSecondaryColor | #64748b | Secondary/muted text color |
| errorColor | #ef4444 | Error states and validation messages |
| fontFamily | System | Default font for all text |
| borderRadius | 8 | Default border radius (px) |
Edit themes in Project Settings or via the Theme panel in the builder.
Build & Export
Generate installable apps from your Codular project.
Android APK
Debug APK for testing on Android devices. Install directly - no Play Store needed.
Android AAB
App Bundle for publishing to Google Play Store. Smaller download size, optimized delivery.
How to Build
Save your project (Cmd+S or click Save)
Click the Build button in the toolbar
Choose APK (testing) or AAB (Play Store)
Wait for the build to complete (usually 2-5 minutes)
Download the built file when ready
iOS Support
iOS IPA builds are coming soon. Requires a macOS build server and Apple Developer account.
Companion App
Test your app live on your phone while you build. Changes appear instantly.
How to Connect
Open your project in the builder
Go to Project > Companion from the menu bar
A 6-character code appears - note it down
On your phone, open the Codular Companion app (or browser)
Enter the code to connect
Your app appears live on your phone - changes sync in real-time
Requirements
- Phone and computer must be on the same WiFi network
- Use your computer's local IP address (shown in the companion modal)
- Companion works in any mobile browser - no app install required
Prefer Live Reload?
For testing the actual installed app (not a web preview), use Live Reload instead. It updates your real APK in real-time over USB or WiFi. See the Live Reload & USB Debug section.
Live Reload & USB Debug
Test your app changes instantly on your phone without rebuilding. Works over USB and WiFi.
Quick Start
Build and install your APK on the phone (one time only)
Open the Test menu in the builder menu bar
Click 'Live Reload' to enable it
Edit anything in the builder - text, styles, components, flows
Your phone updates automatically within 1-2 seconds
Connection Modes
USB Mode (Fastest)
Phone connected via USB cable. Updates in ~1 second.
- Enable USB Debugging on phone
- Connect via USB cable
- Open USB Debug panel or use Test menu
- Click Launch App (auto-enables Live Reload)
WiFi / Cloud Mode
No cable needed. Works over internet. Updates in ~2 seconds.
- Phone connected to WiFi or mobile data
- App installed with Live Reload support
- Enable Live Reload from Test menu
- Works from anywhere - no USB required
USB Debug Panel
The USB Debug panel (click USB icon in toolbar) provides full device management:
Install APK
Install the latest built APK on connected device
Launch App
Launch the app and auto-enable Live Reload
Screenshot
Capture a screenshot from the device
Watch Logs
View React Native error logs in real-time
Live Reload
Toggle real-time sync of builder changes
Device Selector
Choose which connected device to target
What Updates Live?
Updates Instantly
Text, colors, styles, components, layout, flows, variables, icons, background images, screens
Needs Rebuild
Native modules (camera, maps), app icon, splash screen, package name, new native packages
Live Reload Indicator
When Live Reload is active, a green "LIVE" badge appears in the top-right corner of your app on the phone. This confirms the connection is working. The badge never appears in production builds.
AI Assistant
Codular includes a built-in AI assistant that helps you build apps faster.
What AI Can Do
Generate Screens
Describe a screen and AI creates it with components, layout, and styling.
Add Components
Ask AI to add specific components to your current screen.
Create Flows
Describe app logic and AI generates the flow with connected nodes.
Modify Styles
Ask AI to change colors, spacing, fonts, or layout across your app.
How to Use
Click the chat icon in the toolbar to open the AI panel. Type your request in natural language.
Example Prompts
- "Create a login screen with email and password fields"
- "Add a todo list with an input field and add button"
- "Make the button blue with rounded corners"
- "Create a flow that saves the input text to a list when the button is pressed"