OpenBB
Product
Commercial OpenBB Workspace Snowflake Native App Security
Open Source Open Data Platform (ODP)
Introducing OpenBB Workspace Lite for small investment teams July 21, 2026 — 6 MIN Introducing OpenBB Workspace Lite for small investment teams Read post OpenBB Workspace Demo: Portfolio Analysis, Apps Marketplace, MCP & AI Agents July 1, 2026 — 11 MIN OpenBB Workspace Demo: Portfolio Analysis, Apps Marketplace, MCP & AI Agents Watch demo
Solutions
App Showcase App Marketplace
By audience Buy-Side AI Vendor
Introducing the OpenBB App Marketplace May 12, 2026 — 5 MIN Introducing the OpenBB App Marketplace Read post Introducing Workspace MCP: agentic financial workflows, governed by design May 26, 2026 — 8 MIN Introducing Workspace MCP: agentic financial workflows, governed by design Read post
Resources
Blog Videos About Documentation
Comparison
Streamlit Tableau Power BI
OpenBB Workspace Demo: Portfolio Analysis, Apps Marketplace, MCP & AI Agents July 1, 2026 — 11 MIN OpenBB Workspace Demo: Portfolio Analysis, Apps Marketplace, MCP & AI Agents Watch demo
Pricing
Commercial
OpenBB Workspace Snowflake Native App Security
Open Source
Open Data Platform (ODP)
App Showcase App Marketplace Buy-Side AI Vendor
Resources
Blog Videos About Documentation
Comparison
Streamlit Tableau Power BI
Pricing
Back to blog
Didier Lopes

Author

Didier Lopes

SHARE

A step-by-step guide to building custom crypto applications with OpenBB

May 13, 2025 — 18 MIN

A step-by-step guide to building custom crypto applications with OpenBB

Table of Contents:

  1. Bringing data into your application
  2. Leveraging OpenBB Widgets
  3. Ensuring consistent data styling
  4. Integrating Custom AI Agents
  5. Creating an OpenBB App

The exploding volume of financial data and the rise of AI-driven solutions have transformed expectations for financial tools, making customization and scalability essential for meeting diverse user needs.

At OpenBB, we are committed to providing developers with the resources they need to create tailored solutions that meet their unique requirements. This guide outlines how developers can leverage OpenBB’s capabilities to build advanced crypto applications using Python and FastAPI.

Minimal code examples will be provided for reference, utilizing Python and the FastAPI framework. However, developers proficient in other programming languages and frameworks can adapt the concepts to suit their preferred tools and technologies.

1. Bringing data into your application

The foundation of any robust crypto application lies in its data. OpenBB enables developers to seamlessly integrate data from various vendors into their custom backends. This allows for:

  • Mixing raw datasets or processed data to gain deeper insights.
  • Sharing dashboards across teams for collaborative workflows.
  • Utilizing AI models for enhanced decision-making.

By centralizing data sources, developers can create a powerful backend that serves as the backbone of their application.

After integrating and combining your datasets, a dashboard can look something like this:

Crypto Dashboard example built by Matt Maximo, Investor in digital assets at VanEck

Part of the dashboard built by Matt was made open source here where instructions can be found on how to get started and requires API keys from a few data vendors.

To learn more about how to integrate custom data into OpenBB, check out our Documentation.

2. Leveraging OpenBB Widgets

OpenBB Widgets are versatile containers that display your data. These widgets encapsulate:

  • Data: The core information displayed in the application.

  • Parameters: User inputs such as dropdowns or date selectors.

  • Metadata: Additional context to enhance functionality, including AI features.

Widgets allow you to control the user experience, dictating how data flows and interacts within the application. These specifications are defined through a JSON file.

For example, here’s a decorator from an endpoint that defines a widget specification:

Example of a widget spec decorator
``` @register_widget({ "name": "Net Liquidations", "description": "Net liquidations (long - short) across exchanges", "category": "crypto", "source": "VeloData", "endpoint": "velo/net-liquidations", "type": "chart", "data": {"chart": {"type": "line"}}, "gridData": {"w": 40, "h": 12}, "params": [ { "paramName": "coin", "value": "ETH", "label": "Coin", "show": True, "description": "Cryptocurrency to display data for", }, { "paramName": "resolution", "value": "1d", "label": "Resolution", "show": True, "description": "Time resolution for data points", "type": "endpoint", "optionsEndpoint": "velo/resolution-options", }, { "paramName": "begin", "value": "2024-01-01", "label": "Start Date", "show": True, "description": "Start date for the data", "type": "date", } ], }) ```

While this decorator simplifies adding specifications to widgets, it is optional. Developers can also use a widgets.json file to define widget specifications.

Parameters

Parameters are the key to enabling user interaction with widgets. They allow users to modify inputs, such as tickers, dates, numbers, or dropdown selections, directly in the interface. These changes trigger backend requests to update the displayed data based on the latest input, ensuring a seamless and responsive experience.

A notable example of this flexibility arose when a customer requested support for an input form field. Once implemented, one of our team members created a widget that enables users to execute trades directly within OpenBB, attesting the true the versatility of parameters.

Let’s explore some examples of parameter configurations to better understand their capabilities:

Coin Parameter

The coin symbol parameter is a string and allows users to select a cryptocurrency, with "ETH" set as the default value.

It includes a label and description that appear when hovering over the field, providing clear guidance for users. These fields are also leveraged by AI agents to make relevant data requests for the dataset.

{
  "paramName": "coin",
  "value": "ETH",
  "label": "Coin",
  "show": True,
  "description": "Cryptocurrency to display data for",
}

Resolution Dropdown

The resolution parameter uses an endpoint to dynamically fetch available options. This ensures that users can search and select valid choices while developers maintain control over the options presented.

{
 "paramName": "resolution",
  "value": "1d",
  "label": "Resolution",
  "show": True,
  "description": "Time resolution for data points",
  "type": "endpoint",
  "optionsEndpoint": "velo/resolution-options",
}

Date selector

The date parameter is commonly used in financial applications where users need to specify a starting date for data retrieval. This functionality is controlled by setting the "type" field.

{
 "paramName": "begin",
  "value": "2024-01-01",
  "label": "Start Date",
  "show": True,
  "description": "Start date for the data",
  "type": "date",
}

More information on parameters can be found here.

Metadata

Metadata provides additional context about the widget, including its title, description, category, and source. This information is sent to the workspace's AI agent(s), enabling it to identify the most relevant widget when responding to user queries.

For example, if a user asks, “What was the net liquidation of BTC on March 17 of this year?”, the AI agent can retrieve the correct widget and use its parameters to provide an accurate response.

This is achieved through function calling, which is explained in detail in a dedicated post available here.

If users want to explore further, they can add the referenced widget directly to their dashboard with all parameters pre-configured by checking the citation and clicking “Add widget to dashboard”:

This new widget will look like this:

Others specs

Beyond parameters and metadata, widgets include other critical specifications such as:

  • The API endpoint used to retrieve data (e.g., "velo/net-liquidations").
  • The default visualization type (e.g., chart or raw data).
  • The chart type (e.g., line chart) if using AgGrid.
  • Widget dimensions when added to a dashboard.
  • Any additional customization options required for specific use cases.

These elements ensure that widgets are not only functional but also adaptable to various workflows, allowing developers to streamline user interaction and create dynamic dashboards tailored to specific use cases.

3. Ensuring consistent data styling

A consistent and visually appealing interface is crucial for users. OpenBB supports data styling through Plotly configurations, ensuring uniformity across charts and visualizations. Think of it as your own design system for OpenBB widgets. Developers can dynamically adjust themes and implement dark and light themes.

This flexibility ensures that applications remain visually cohesive while catering to user preferences.

Plotly charts customization

OpenBB supports advanced data visualization through Plotly charts, a powerful visualization tool known for its extensive customization options.

To maintain consistency across your application, it is recommended to create a centralized Plotly configuration. This ensures that your interface retains the same branding and visual style, regardless of the workflow or functionality being executed within your app.

Example of Plotly config
``` def get_layout_update(theme="dark"): """ Returns standard layout updates to apply to all charts.
Parameters:
    theme (str): The theme to use, either "light" or "dark"

Returns:
    dict: A dictionary of layout settings to update Plotly charts
"""
# Define color schemes based on theme
if theme == "light":
    text_color = '#333333'
    grid_color = 'rgba(221, 221, 221, 0.3)'  # Very faded grid
    line_color = '#AAAAAA'
    tick_color = '#AAAAAA'
    bg_color = '#ffffff'  # More opaque background
    active_color = '#3366CC'  # Nice blue color for light theme
    # Black text for better contrast in light mode
    legend_text_color = '#000000'
    # Darker border for better visibility
    legend_border_color = '#ffffff'
else:  # dark theme (default)
    text_color = '#FFFFFF'
    grid_color = 'rgba(51, 51, 51, 0.3)'  # Very faded grid
    line_color = '#444444'
    tick_color = '#444444'
    bg_color = '#151518'  # More opaque background
    active_color = '#FF8000'  # Orange color for dark theme
    legend_text_color = text_color  # Use the same text color
    legend_border_color = "#151518"  # Use the same border color

return {
    'uirevision': 'constant',  # Maintains view state during updates
    'autosize': True,  # Enables auto-sizing for responsive behavior
    'dragmode': 'zoom',  # Sets default mode to zoom instead of pan
    'hovermode': 'closest',  # Improves hover experience
    'clickmode': 'event',  # Makes clicking more responsive
    'margin': {
        't': 50,  # Top margin - increase this for more modebar space
        'r': 30,  # Right margin
        'b': 40,  # Bottom margin
        'l': 40,  # Left margin
        'pad': 4   # Padding between the plotting area and the axis lines
    },
    'transition': {
        'duration': 50,  # Small transition for smoother feel
        'easing': 'cubic-in-out'  # Smooth easing function
    },
    'modebar': {
        'orientation': 'v',  # Vertical orientation for modebar
        'activecolor': active_color  # Active button color
    },
    'font': {
        'family': 'Arial, sans-serif',  # Sans-serif font
        'size': 12,
        'color': text_color  # Text color based on theme
    },
    'xaxis': {
        'rangeslider': {'visible': False},  # Disable rangeslider
        'autorange': True,  # Enable autorange
        'constrain': 'domain',  # Constrain to domain for better zoom
        'showgrid': True,  # Show vertical grid lines
        'gridcolor': grid_color,  # Very faded grid lines
        'linecolor': line_color,  # Axis line color based on theme
        'tickcolor': tick_color,  # Tick color based on theme
        'linewidth': 1,  # Match y-axis line width
        'mirror': True,  # Mirror axis to match y-axis
        'showline': False,  # Hide the axis line to remove the box
        'zeroline': False,  # Hide zero line to match y-axis
        'ticks': 'outside',  # Place ticks outside
        'tickwidth': 1  # Match y-axis tick width
    },
    'yaxis': {
        'autorange': True,  # Enable autorange
        'constrain': 'domain',  # Constrain to domain
        'fixedrange': False,  # Allow y-axis zooming
        'showgrid': True,  # Show horizontal grid lines
        'gridcolor': grid_color,  # Very faded grid lines
        'linecolor': line_color,  # Axis line color based on theme
        'tickcolor': tick_color,  # Tick color based on theme
        'linewidth': 1,  # Consistent line width
        'mirror': True,  # Mirror axis
        'showline': False,  # Hide the axis line to remove the box
        'zeroline': False,  # Hide zero line
        'ticks': 'outside',  # Place ticks outside
        'tickwidth': 1  # Consistent tick width
    },
    'legend': {
        # Legend text color with better contrast
        'font': {'color': legend_text_color},
        'bgcolor': bg_color,  # More opaque background
        'bordercolor': legend_border_color,  # Better visible border
        'borderwidth': 1  # Add border width for better visibility
    },
}
  </div>
</details> 

<br> 

<figure>
<img src="https://openbb-cms.directus.app/assets/d2d1ef80-1b77-47cc-a7b9-3884625ead8c" className="large-img border-none"/>
   <figcaption style="text-align: center" > Example of a dashboard that utilizes that same Plotly config file
</figcaption>
</figure>

### Dark and light mode

Even though dark mode has always been a favorite among our team, through conversations with our users, we discovered that some have a strong preference for light mode.

To accommodate everyone, OpenBB Workspace was designed to support both themes, allowing users to switch seamlessly with a simple **Ctrl+M** shortcut.

<figure>
<img src="https://openbb-cms.directus.app/assets/7bd276e1-5266-4a6b-afa6-46f57ea386f9" className="large-img border-none"/>
   <figcaption style="text-align: center" > Same dashboard in light mode
</figcaption>
</figure>

To ensure a consistent visual experience across both themes, the Plotly configuration is prepared to handle dark and light modes dynamically. But how does the system know which theme to apply?

Whenever a user retrieves data through an API request, an additional `theme` parameter is sent, specifying whether the user is in dark or light mode. This allows the application to adjust its visual styling accordingly.

For instance, here’s an example of how theme support is implemented in a FastAPI endpoint:

<details>
  <summary>Example of a FastAPI endpoint with theme support </summary>
  <div>
    ```
   async def get_velo_net_liquidations(
    coin: str = "BTC",
    begin: str = None,
    resolution: str = "1d",
    theme: str = "dark"  # defaults to dark mode
	)

4. Building Custom AI Agents

Combining all your data in a comprehensive and user-friendly UI is helpful, but it's not enough.

AI agents are becoming an integral part of modern applications. With OpenBB, developers can not only leverage our out-of-the-box AI agent but also integrate tailored agents that are specialized to perform specific tasks. This includes:

  • Designing agents for distinct use cases.
  • Incorporating multiple agents into a single application for enhanced functionality.

These AI-driven features enable applications to adapt to complex scenarios and provide actionable insights.

Additional examples for building your own AI agent with OpenBB are available in our open-source repository.

A full step-by-step guide is coming soon — subscribe to our newsletter to be notified.

5. Creating an App on OpenBB

Efficiency is key when building applications, and reusable workflows play a significant role in achieving it.

Once you’ve integrated the data you need into OpenBB and refined the user interface for an optimal experience, the next step is to bring everything together into a cohesive workflow and be able to replicate it.

The recently released concept of OpenBB Apps allows you to package your dashboard and workflows into a reusable format, so you can build applications that include:

  1. Pre-configured dashboard layouts with all your data widgets organized and grouped.
  2. Pre-saved prompts that can be reused to interact with AI agents for consistent results.
  3. Integrated custom AI agents designed for specific use cases.

Building reusable layouts

Anyone with access to your App can load the exact same dashboard you’ve designed, complete with all widgets, their configurations, and even their grouping relationships.

All of this ensures that your specific workflow can be replicated seamlessly.

Creating these Apps is straightforward. Simply export a dashboard you’ve built and save it as an App. For example:

The exported app is now available for reuse via the apps.json. This approach allows you to create and manage multiple custom workflows tailored to different use cases.

You can have multiple different Apps for different use cases

Automating repetitive tasks with pre-saved prompts

An App on OpenBB is more than just a collection of widgets and their layout. It’s a combination of steps designed to help automate manual, time-consuming tasks. To achieve this, OpenBB allows users to save prompts into their Apps.

Instead of having to write the same prompts everyday, this will allow you to save time when interacting with the data on your dashboard. For instance:

By running a prompt on the data available, users can streamline complex processes and focus on deriving insights rather than performing repetitive tasks.

This feature allows users to replicate successful workflows across multiple projects, saving time and effort.

Conclusion

OpenBB provides a comprehensive framework for building powerful crypto applications that are both customizable and scalable. By integrating data, combining data visualization widgets, creating workflows, and incorporating AI agents, developers can craft solutions tailored to their needs.

Following some requests, we’re planning an upcoming workshop in which we'll guide you through building your own custom application using OpenBB’s tools. Keep an eye on our newsletter to get more details soon.

Overview

  • Parameters
  • Metadata
  • Others specs
  • Plotly charts customization
  • Dark and light mode
  • Building reusable layouts
  • Automating repetitive tasks with pre-saved prompts

Recommended For You

OpenBB belongs to everyone
August 25, 2026 — 8 MIN

OpenBB belongs to everyone

Read more
SnapTrade brings connected brokerage account data into OpenBB
August 5, 2026 — 5 MIN

SnapTrade brings connected brokerage account data into OpenBB

Read more
Carbon Arc brings card spend, web traffic, and more into OpenBB
July 23, 2026 — 7 MIN

Carbon Arc brings card spend, web traffic, and more into OpenBB

Read more

Analysts shouldn't need a data scientist to get an answer

The firms that fix that first will have a structural advantage

Start now
OpenBB
OpenBB Workspace Snowflake Native App Security Open Data Platform (ODP)
App Showcase App Marketplace Buy-Side AI Vendor
Blog Videos About Documentation Streamlit Tableau Power BI
Pricing Open Startup Support Contact Sitemap
Product
OpenBB Workspace Snowflake Native App Security
Open Data Platform (ODP)
Solutions
App Showcase App Marketplace Buy-Side AI Vendor
Resources
Blog Videos About Documentation Streamlit Tableau Power BI
Other
Pricing Open Startup Support Contact Sitemap

Copyright © 2026 OpenBB Inc. All rights reserved.
Privacy Policy Terms Trust Center OSS Friends

August 25, 2026

OpenBB belongs to everyone

Didier Lopes

Founder & CEO, OpenBB


TL;DR: We are open-sourcing the entire OpenBB product suite under a permissive open source license

Today is bittersweet.

On December 20, 2020, over the Christmas holidays, I wrote the first lines of Gamestonk Terminal, what would eventually become OpenBB. My flight home to visit my parents had been cancelled because of COVID, so I stayed in London and started building a tool to streamline my own investment research process.

At the time, the idea was simple: individuals (and firms) should be able to own their research platforms. They shouldn't have to adapt their workflows to whatever a data or software vendor decided to build. They should own the entire experience - from the data they connect to, to the interface analysts and PMs use every day, to the APIs, models, skills, tools and AI agents that increasingly form part of the investment process.

Over the last almost six years, OpenBB evolved far beyond anything I imagined when writing those first lines of code. We started as an open-source terminal and went on to build the SDK (now Open Data Platform), the OpenBB Bot, the OpenBB Workspace, the OpenBB Copilot, the Excel Add-in, and an ecosystem of applications created by our team, our partners and the community.

We kept innovating and being at the forefront of what user experience should be. I was prepared to die on the hill that if we were to become the financial infrastructure software for the buy-side and sell-side, then we could not monetize data. Monetizing data would have made us a data vendor. The margins would have been higher, but the incentive would have shifted from offering a better UI/UX to selling more datasets. Selling an infrastructure platform is incredibly challenging, for many reasons. And so we died on that hill. Along the way, we built an incredible community, reached millions of people through our open-source project, worked with some of the largest financial institutions in the world and assembled a team that consistently built far beyond what should have been possible for a company of 10 people. There is a lot to be proud of.

But despite all of that, we couldn't find the product-market fit needed to build a sustainable business around this vision within the time we had.

As a founder, I've always bet the house on the next customer, the next feature or the next launch to change the trajectory of the company. Until even just last weeks, when we announced self-serve Workspace Lite. If we were ever going to close doors, then we never wanted to look back and think "what if".

In hindsight, we could obviously have made different decisions - e.g., surrounding data, or going more vertical with clients and their workflows. But short-term monetization was not something I was prioritizing over where I thought the industry was heading. Ultimately, I wanted us to stand for something.

In the last phase of the company, I explored many paths to give OpenBB a better home. We spoke with larger companies that shared parts of our vision and tried to find a home where the products, and ideally the team behind them, could continue to grow. Ultimately, we weren't able to make that happen.

I left London with my wife to build OpenBB and dedicated almost six years of my life to it. So did the team. We built at the intersection of finance, AI, open source and software infrastructure, often working on problems before they became obvious to the broader market.

Before MCP existed, we had created our own API protocol so agents could interact with the data and analytics widgets in the workspace. In 2023, we built askobb, which let anyone ask investment research questions in natural language that required joining multiple different datasets together.

What this team created deserves to continue existing.

More importantly, I still believe the original vision is inevitable. The future of financial software is not a single platform every firm is forced to use. It is thousands of firms building environments that reflect how they actually work - their own data, internal systems, investment processes, risk models and compliance requirements. Increasingly, their own APIs, MCP servers, models and AI agents too.

If that future is coming, then the technology we built shouldn't disappear simply because we weren't able to commercialize it successfully.

It should become available to everyone.

Today, with the support of the team and OSS Capital, we are committing to releasing the entire OpenBB product suite under a permissive license. This includes OpenBB Workspace, Open Data Platform, OpenBB Copilot and the OpenBB Excel Add-in.

These products represent over 5 years of engineering, millions of dollars invested in R&D and thousands of decisions, experiments and iterations with users. They will become a foundation that individuals, startups, data providers and financial institutions can freely use, modify and build on top of.

We will share more details about the order and timing of each release as we complete that work. In parallel, we will determine the right long-term structure to steward the projects, support contributors and preserve what made OpenBB special in the first place. Existing customers and users of the hosted products will hear from us directly about timelines.

For the partners who built applications for the OpenBB ecosystem, I hope this decision makes your products even more valuable. You already did the work of turning your datasets and analytics into applications that users can interact with. Now, those applications will be able to run inside infrastructure that firms can fully own, extend and customize, while combining them with data and tools from other providers across the ecosystem.

The same applies to the broader community. Developers will be able to use the entire OpenBB stack as a starting point rather than rebuilding the same infrastructure from scratch. Firms will be able to deploy it, adapt it to their requirements and connect it to the systems where their differentiated knowledge already lives.

Over the years, many talented people helped make OpenBB what it is today - employees, contributors, partners. Every one of them left a mark on the product.

But I want to recognize the people who carried OpenBB to the very end. Through the uncertainty and the final stretch, they kept building. They are engineers, product builders, designers and operators who have worked across financial data, AI, developer infrastructure and open source. In alphabetical order, they are:

  • Andrew Kenreich, Head of Product Engineering - LinkedIn
  • Darren Lee, Software Engineer - GitHub, LinkedIn
  • Ihsan Saracgil, CPO - LinkedIn
  • José Donato, Software Engineer - LinkedIn, X, GitHub, Website
  • Juan Alfonso, Software Engineer - GitHub, LinkedIn
  • Minh Hoang, Head of Product - LinkedIn, GitHub
  • Ogonna Nnamani, DevOps - LinkedIn, Medium
  • Rita Figueiredo, Head of Marketing - LinkedIn, Website
  • Rita Soares, Head of Design - LinkedIn, Website
  • Theodore Aptekarev, CTO - LinkedIn, GitHub

To our customers: thank you for trusting a small team with such an ambitious vision.

To our partners: thank you for building alongside us and helping create a more open financial data ecosystem. I hope the next chapter gives you even more freedom to serve your users.

To our investors: thank you for believing in us, including when OpenBB was little more than an idea being built from my living room in London. In particular, I want to thank OSS Capital and Joseph Jacks for supporting this decision and enabling the technology to live beyond the company. Two people I want to name separately: Justin Hoffman and Larry Augustin - working with both of you made me a better founder, but more importantly, a better person.

To every contributor who opened a pull request, reported a bug, wrote documentation, answered a question in Discord, built an integration or simply told someone else about OpenBB: thank you. OpenBB would not have been possible without you.

Finally, to every person who spent part of their career building OpenBB: thank you. We pushed the industry forward and proved that world-class financial infrastructure can be built in the open. The commercial outcome doesn't change the quality of the work.

OpenBB didn't become the company I imagined when I started this journey. But the mission was always larger than the company, and I still believe the ideas behind it are right.

If, ten years from now, firms around the world are using OpenBB as the foundation for software they truly own - connecting their own data, building their own workflows and deploying their own AI agents - then what we built will have achieved something that lasts far beyond us; which was my goal all along: have an impact.

Thank you for one hell of a ride.

Didier Lopes
(LinkedIn, X, GitHub)