{"id":45157403,"url":"https://github.com/couchbase-examples/streamlit-quickstart","last_synced_at":"2026-02-20T05:02:39.678Z","repository":{"id":278184608,"uuid":"934789978","full_name":"couchbase-examples/streamlit-quickstart","owner":"couchbase-examples","description":"Quickstart demo for couchbase_streamlit_connector in Couchbase-Ecosystem/","archived":false,"fork":false,"pushed_at":"2025-03-26T09:05:06.000Z","size":2075,"stargazers_count":0,"open_issues_count":1,"forks_count":0,"subscribers_count":4,"default_branch":"main","last_synced_at":"2025-03-26T09:41:21.573Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Jupyter Notebook","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/couchbase-examples.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2025-02-18T12:08:52.000Z","updated_at":"2025-03-19T05:05:57.000Z","dependencies_parsed_at":"2025-03-19T12:31:26.828Z","dependency_job_id":null,"html_url":"https://github.com/couchbase-examples/streamlit-quickstart","commit_stats":null,"previous_names":["couchbase-examples/streamlit-quickstart"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/couchbase-examples/streamlit-quickstart","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/couchbase-examples%2Fstreamlit-quickstart","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/couchbase-examples%2Fstreamlit-quickstart/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/couchbase-examples%2Fstreamlit-quickstart/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/couchbase-examples%2Fstreamlit-quickstart/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/couchbase-examples","download_url":"https://codeload.github.com/couchbase-examples/streamlit-quickstart/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/couchbase-examples%2Fstreamlit-quickstart/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29641929,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-20T03:21:14.183Z","status":"ssl_error","status_checked_at":"2026-02-20T03:18:24.455Z","response_time":59,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-02-20T05:02:35.584Z","updated_at":"2026-02-20T05:02:39.673Z","avatar_url":"https://github.com/couchbase-examples.png","language":"Jupyter Notebook","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Getting Started with the Couchbase-Streamlit Connector\n\n## Introduction\n\nThe [Couchbase-Streamlit Connector](https://github.com/Couchbase-Ecosystem/couchbase-streamlit-connector) provides a seamless way to integrate Couchbase with Streamlit applications. This connector simplifies database operations, allowing developers to interact with Couchbase clusters directly within Streamlit without requiring extensive SDK knowledge.\n\nThis quickstart tutorial will guide you through building a basic Streamlit application with Couchbase, covering fundamental **CRUD** (Create, Read, Update, Delete) and **Query** operations. If you want to see the simple app built in this tutorial, check it out [here](https://couchbase-st-tutorial.streamlit.app/). The whole code for this tutorial is available [here](https://github.com/couchbase-examples/streamlit-quickstart/blob/main/Home.py).\n\nIf you're looking for a more comprehensive application with advanced functionalities, refer to [this tutorial](https://developer.couchbase.com/tutorial-couchbase-streamlit-connector), which builds the [Couchbase Connector Demo App](https://couchbase-connector-demo-app.streamlit.app/).\n\n\n## Features\n\n- **Seamless Connection Handling**: Establishes a Couchbase cluster connection via environment variables or manual parameters.\n- **CRUD Operations**: Supports inserting, retrieving, updating, and deleting documents from Couchbase collections.\n- **Dynamic Collection Switching**: Allows setting and switching between different Couchbase buckets, scopes, and collections.\n- **Efficient Query Execution**: Runs SQL++ queries directly within Streamlit.\n- **Exception Handling**: Provides meaningful error messages for authentication failures, timeouts, and other Couchbase-related issues.\n- **Streamlit Integration**: Works as a `BaseConnection` class, making it compatible with Streamlit’s `st.connection()` API.\n\n\n## Running the Demo Applications\n\nYou can run both the **Quickstart Demo** and the **Comprehensive Demo** locally by following these steps:\n\n\n### Initialization\n\n```sh\n# Clone the repository\ngit clone https://github.com/couchbase-examples/streamlit-quickstart.git\ncd streamlit-quickstart\n\n# Python Virtual Environment\npython -m venv venv\nsource venv/bin/activate  # On Windows: venv\\Scripts\\activate\n\n# Install dependencies\npip install -r requirements.txt\n```\n\n### Running the Quickstart Demo (Basic CRUD App)\n\n```sh\n# Run the application\nstreamlit run Home.py\n```\n\n\u003cdiv style=\"text-align: center;\"\u003e\n    \u003cimg src=\"images/startup_page.png\" style=\"width: 50vw; height: auto; border-radius: 1vw;\"\u003e\n\u003c/div\u003e\n\n### Running the Comprehensive Demo (Advanced Features)\n\n```sh\n# Run the application\nstreamlit run Demo.py\n```\n\n\u003cdiv style=\"text-align: center;\"\u003e\n    \u003cimg src=\"images/hotel_near_landmarks_tab.png\" style=\"width: 50vw; height: auto; border-radius: 1vw;\"\u003e\n\u003c/div\u003e\n\nFor a detailed explanation of how these applications work, refer to the [official tutorial](https://github.com/couchbase-examples/couchbase-tutorials/tree/main/tutorial/markdown/python/streamlit).\n\n\n## Creating the Basic CRUD Application Step-by-Step\n\nThis section outlines the step-by-step process of building the Streamlit application that integrates with Couchbase for retrieving and inserting data.\n\n### Prerequisites\nBefore setting up the environment, ensure you have the following:\n\n- **Python 3.10 or higher** (check [compatibility](https://docs.couchbase.com/python-sdk/current/project-docs/compatibility.html#python-version-compat) with the Couchbase SDK).  \n- A **Couchbase Capella account** ([Docs](https://docs.couchbase.com/cloud/get-started/intro.html)) **or** a local installation of **Couchbase Server** ([Download](https://www.couchbase.com/downloads)).  \n- An **operational cluster** created in a project (Capella) or properly configured on your local machine (Couchbase Server).  \n- Ensure proper access control:  \n  - For **Couchbase Capella**, configure cluster access permissions and allowlisted IP addresses ([Docs](https://docs.couchbase.com/cloud/get-started/connect.html#prerequisites)).  \n  - For **Couchbase Server**, set up appropriate user roles and permissions ([Docs](https://docs.couchbase.com/server/current/manage/manage-security/manage-users-and-roles.html)).  \n- Obtain the **connection string** for **Couchbase Capella** or **Couchbase Server** by following the official guide: [Docs](https://docs.couchbase.com/python-sdk/current/hello-world/start-using-sdk.html#connect).  \n\n### Installation and Setup\nCreate an isolated Python environment, run the following commands:\n\n```sh\npython -m venv venv\nsource venv/bin/activate  # On Windows: venv\\Scripts\\activate\n```\nInstall the required libraries for this project:\n```sh\npip install couchbase-streamlit-connector\n```\nRun the following command to check if Streamlit is installed correctly:\n```sh\nstreamlit hello\n```\n\nIf everything is set up correctly, a browser window should open with Streamlit's demo application.\n\n### Implementing Function to make a Connection\n\nCreate a new file `app.py`:\n\nMain function:\n```python\nconnection = st.connection(\n    \"couchbase\",  # Connection alias\n    type=CouchbaseConnector,  # Specify the Couchbase connector type\n    CONNSTR=conn_str,  # Connection string\n    USERNAME=username,  # Username for authentication\n    PASSWORD=password,  # Password for authentication\n    BUCKET_NAME=bucket_name,  # Name of the target bucket\n    SCOPE_NAME=scope_name,  # Name of the target scope\n    COLLECTION_NAME=collection_name  # Name of the target collection\n)\n```\nIn Context:\n```python\nimport streamlit as st\nimport json\nfrom couchbase_streamlit_connector.connector import CouchbaseConnector\n\ndef initialize_connection():\n    # Set the application title\n    st.title(\"Couchbase + Streamlit Application\")\n    \n    # Sidebar for connection settings\n    with st.sidebar:\n        st.header(\"Connection Settings\") # Sidebar header for clarity\n\n        # User input fields for Couchbase connection parameters\n        conn_str = st.text_input(\"Connection String\")  # Connection string for Couchbase\n        username = st.text_input(\"Username\")  # Username for authentication\n        password = st.text_input(\"Password\", type=\"password\")  # Password (masked for security)\n        bucket_name = st.text_input(\"Bucket Name\")  # Couchbase bucket to connect to\n        scope_name = st.text_input(\"Scope Name\")  # Scope within the bucket\n        collection_name = st.text_input(\"Collection Name\")  # Collection within the scope\n        \n        # Button to establish a connection\n        if st.button(\"Connect\", key=\"connect_btn\"):\n            try:\n                # Attempt to create a connection using the provided details\n                connection = st.connection(\n                    \"couchbase\",  # Connection alias\n                    type=CouchbaseConnector,  # Specify the Couchbase connector type\n                    CONNSTR=conn_str,  # Connection string\n                    USERNAME=username,  # Username for authentication\n                    PASSWORD=password,  # Password for authentication\n                    BUCKET_NAME=bucket_name,  # Name of the target bucket\n                    SCOPE_NAME=scope_name,  # Name of the target scope\n                    COLLECTION_NAME=collection_name  # Name of the target collection\n                )\n\n                # Store the connection in session state for later use\n                st.session_state[\"connection\"] = connection  \n                \n                # Display success message if connection is successful\n                st.success(\"Connected successfully!\")\n            except Exception as e:\n                # Display an error message if connection fails\n                st.error(f\"Connection failed: {e}\")\n```\nThis Streamlit app provides a simple user interface to connect to a Couchbase database. Users enter connection details (such as the connection string, credentials, and collection details) in the sidebar, and clicking the \"Connect\" button attempts to establish a connection using CouchbaseConnector. If successful, a success message is displayed, and the connection is stored in the session state. If the connection fails, an error message is shown.\n\n### Implementing CRUD Operations\n\n#### Create Operation\n\nMain function:\n```python\nst.session_state[\"connection\"].insert_document(doc_id, json_data)\n```\nIn Context:\n```python\ndef insert_document():\n    st.subheader(\"Create Document\")  # Section header for inserting a document\n\n    # Expander widget to collapse/expand the document insertion panel\n    with st.expander(\"Insert a new document\", expanded=False):\n        # Input field for Document ID (unique identifier for the document)\n        doc_id = st.text_input(\"Document ID\", key=\"create_id\")\n\n        # Multi-line text area for entering document data in JSON format\n        doc_data = st.text_area(\n            \"Document Data (JSON)\",\n            value='{\\n  \"name\": \"John Doe\",\\n  \"email\": \"john@example.com\"\\n}',  # Pre-filled example JSON\n            key=\"create_data\"\n        )\n\n        # Button to insert the document\n        if st.button(\"Insert\", key=\"create_btn\"):\n            try:\n                # Convert input JSON string to a Python dictionary safely\n                json_data = json.loads(doc_data)  # Using json.loads() instead of eval() to prevent security risks\n\n                # Insert the document into Couchbase using the active connection\n                st.session_state[\"connection\"].insert_document(doc_id, json_data)\n\n                # Display success message upon successful insertion\n                st.success(\"Document inserted successfully!\")\n            except Exception as e:\n                # Display error message if insertion fails\n                st.error(f\"Insert failed: {e}\")\n\n```\nThis function allows users to create and insert a new document into a Couchbase collection through a Streamlit interface. Users provide a Document ID and JSON-formatted data, which is then inserted when they click the \"Insert\" button. The function ensures safe JSON parsing using json.loads() instead of eval(), preventing potential security risks like code injection. If the insertion is successful, a success message is displayed; otherwise, an error message appears.\n\n#### Read Operation\nMain function:\n```python\ndoc = st.session_state[\"connection\"].get_document(doc_id)\n```\nIn Context:\n```python\ndef fetch_document():\n    st.subheader(\"Read Document\")  # Section header for fetching a document\n\n    # Expander widget to optionally collapse/expand the fetch panel\n    with st.expander(\"Fetch an existing document\", expanded=False):\n        # Input field for the Document ID to retrieve\n        doc_id = st.text_input(\"Document ID to fetch\", key=\"read_id\")\n\n        # Button to trigger document retrieval\n        if st.button(\"Fetch\", key=\"read_btn\"):\n            try:\n                # Fetch the document from Couchbase using the provided ID\n                doc = st.session_state[\"connection\"].get_document(doc_id)\n\n                # Display the retrieved document in JSON format for easy reading\n                st.json(doc)\n            except Exception as e:\n                # Show an error message if fetching fails (e.g., document not found, connection issue)\n                st.error(f\"Fetch failed: {e}\")\n\n```\nThis function allows users to retrieve a document from Couchbase by entering its Document ID. When the \"Fetch\" button is clicked, it queries the database and displays the document's contents in a structured JSON format. If the document is not found or there's a connection issue, an error message is shown.\n\n#### Update Operation\nMain function:\n```python\nst.session_state[\"connection\"].replace_document(doc_id, json_data)\n```\nIn Context:\n```python\ndef update_document():\n    st.subheader(\"Update Document\")  # Section header for updating a document\n\n    # Expander widget to optionally collapse/expand the update panel\n    with st.expander(\"Update an existing document\", expanded=False):\n        # Input field for the Document ID to update\n        doc_id = st.text_input(\"Document ID to update\", key=\"update_id\")\n\n        # Multi-line text area for entering new document data in JSON format\n        new_data = st.text_area(\n            \"Updated Data (JSON)\",\n            key=\"update_data\",\n            value='{\\n  \"name\": \"John Doe\",\\n  \"email\": \"john@example.com\"\\n}',  # Pre-filled example JSON\n        )\n\n        # Button to update the document\n        if st.button(\"Update\", key=\"update_btn\"):\n            try:\n                # Convert input JSON string to a Python dictionary safely\n                json_data = json.loads(new_data)  # Using json.loads() instead of eval() for security\n\n                # Replace the existing document with new data\n                st.session_state[\"connection\"].replace_document(doc_id, json_data)\n\n                # Display success message upon successful update\n                st.success(\"Document updated successfully!\")\n            except Exception as e:\n                # Display an error message if the update fails\n                st.error(f\"Update failed: {e}\")\n```\nThis function allows users to update an existing document in Couchbase by providing a Document ID and new JSON data. When the \"Update\" button is clicked, the document's content is entirely replaced with the new data. The function ensures safe JSON parsing using json.loads() to prevent security risks. If the update is successful, a success message is displayed; otherwise, an error message appears.\n\n#### Delete Operation\nMain function:\n```python\nst.session_state[\"connection\"].remove_document(doc_id)\n```\nIn Context:\n```python\ndef delete_document():\n    st.subheader(\"Delete Document\")  # Section header for deleting a document\n\n    # Expander widget to optionally collapse/expand the delete panel\n    with st.expander(\"Delete an existing document\", expanded=False):\n        # Input field for the Document ID to delete\n        doc_id = st.text_input(\"Document ID to delete\", key=\"delete_id\")\n\n        # Button to trigger document deletion\n        if st.button(\"Delete\", key=\"delete_btn\"):\n            try:\n                # Remove the document from Couchbase using the provided ID\n                st.session_state[\"connection\"].remove_document(doc_id)\n\n                # Display success message upon successful deletion\n                st.success(\"Document deleted successfully!\")\n            except Exception as e:\n                # Show an error message if deletion fails (e.g., document not found, connection issue)\n                st.error(f\"Delete failed: {e}\")\n\n```\nThis function allows users to delete an existing document from Couchbase by specifying its Document ID. When the \"Delete\" button is clicked, the document is removed from the database. The function provides immediate feedback, displaying a success message if the deletion is successful or an error message if the document does not exist or there is a connection issue.\n\n### Implement Function for Querying Data\nMain function:\n```python\nresults = st.session_state[\"connection\"].query(query)\ndata = []\nfor row in results:\n    data.append(row)\n```\nIn Context:\n```python\ndef query_data():\n    st.subheader(\"Query Data\")  # Section header for executing queries\n\n    # Expander widget to collapse/expand the query execution panel\n    with st.expander(\"Execute SQL++ Query\", expanded=False):\n        # Multi-line text area for entering a SQL++ query\n        query = st.text_area(\n            \"SQL++ Query\",\n            value=\"SELECT * FROM `travel-sample`.inventory.airline LIMIT 5;\",  # Pre-filled example query\n            key=\"query_input\"\n        )\n\n        # Button to execute the query\n        if st.button(\"Execute Query\", key=\"query_btn\"):\n            try:\n                # Execute the SQL++ query using the active Couchbase connection\n                results = st.session_state[\"connection\"].query(query)\n\n                # Convert query results from an iterator to a list for display\n                data = []\n                for row in results:\n                    data.append(row)\n\n                # Display query results in Streamlit\n                st.write(data)\n            except Exception as e:\n                # Show an error message if the query execution fails\n                st.error(f\"Query failed: {e}\")\n\n```\nThis function enables users to execute SQL++ queries against Couchbase and view the results in a Streamlit interface. Users enter a query in the text area and click the \"Execute Query\" button to retrieve data. The query results are processed using a for row in results loop, which converts the iterator into a list, ensuring that all results are displayed at once while optimizing memory usage. If the query execution fails, an error message is displayed.\n\n### Implementing Main function\n```python\ndef main():\n    # Initialize the Couchbase connection settings in the sidebar\n    initialize_connection()\n    \n    # Check if a connection is successfully established\n    if \"connection\" in st.session_state:\n        # Create tabbed navigation for different database operations\n        tab1, tab2, tab3, tab4, tab5 = st.tabs([\n            \"Create\", \"Read\", \"Update\", \"Delete\", \"Query\"\n        ])\n\n        # Assign each tab to its respective function\n        with tab1:\n            insert_document()  # Tab for inserting new documents\n        with tab2:\n            fetch_document()  # Tab for reading (fetching) documents\n        with tab3:\n            update_document()  # Tab for updating existing documents\n        with tab4:\n            delete_document()  # Tab for deleting documents\n        with tab5:\n            query_data()  # Tab for executing SQL++ queries\n    else:\n        # Display an informational message if no connection is found\n        st.info(\"Please connect to Couchbase using the sidebar to start.\")\n\n# Run the Streamlit application\nif __name__ == \"__main__\":\n    # Set up the page configuration (title, icon, layout)\n    st.set_page_config(\n        page_title=\"Couchbase Streamlit Demo\",  # Title of the web app\n        page_icon=\"🔌\",  # Page icon (plugin symbol)\n        layout=\"wide\"  # Use a wide layout for better visibility\n    )\n    \n    # Call the main function to start the app\n    main()\n\n```\nThis script serves as the main entry point for the Streamlit application, handling user interaction and connecting to Couchbase. It first initializes the Couchbase connection settings in the sidebar and then provides a tabbed interface for performing CRUD (Create, Read, Update, Delete) operations along with executing SQL++ queries. If the user has not connected to Couchbase, an info message prompts them to do so.\n\n\n\n## Running Your Application\n\n1. **Start the Streamlit application**:\n   ```bash\n   streamlit run app.py\n   ```\n\n2. **Access the application**:\n   - Open your browser to `http://localhost:8501`\n   - Enter your Couchbase connection details\n   - Start interacting with your data\n\n3. **Screenshots of the Steps**\n\n- Entering Couchbase Connection Details\n\n\u003cdiv style=\"text-align: center;\"\u003e\n    \u003cimg src=\"images/startup_page.png\" style=\"width: 50vw; height: auto; border-radius: 1vw;\"\u003e\n\u003c/div\u003e\n\n\n- Performing CRUD Operations\n\u003ctable style=\"margin: auto; text-align: center; border-spacing: 2vw;\"\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003cimg src=\"images/create_tab.png\" style=\"width: 20vw; height: auto; border-radius: 1vw;\"\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cimg src=\"images/read_tab.png\" style=\"width: 20vw; height: auto; border-radius: 1vw;\"\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003cimg src=\"images/update_tab.png\" style=\"width: 20vw; height: auto; border-radius: 1vw;\"\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cimg src=\"images/delete_tab.png\" style=\"width: 20vw; height: auto; border-radius: 1vw;\"\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/table\u003e\n\n- Running a Query\n\n\u003cdiv style=\"text-align: center;\"\u003e\n    \u003cimg src=\"images/query_tab.png\" style=\"width: 20vw; height: auto; border-radius: 1vw;\"\u003e\n\u003c/div\u003e\n\n## Conclusion\n\nThe [Couchbase-Streamlit Connector](https://github.com/Couchbase-Ecosystem/couchbase-streamlit-connector) simplifies the integration of Couchbase with Streamlit, enabling seamless database interactions within Streamlit applications. With built-in support for CRUD operations, dynamic collection switching, and efficient query execution, this connector reduces development overhead while enhancing productivity. \n\nBy leveraging this connector, developers can focus on building interactive applications without worrying about complex database connections or SDK configurations. Whether you're managing real-time data, performing analytics, or handling structured documents, this tool provides a reliable and efficient way to work with Couchbase in Streamlit.\n\n## Appendix\n\nHere are some helpful resources for working with Couchbase and Streamlit:\n\n### **Couchbase Documentation**\n- [Couchbase Python SDK Compatibility](https://docs.couchbase.com/python-sdk/current/project-docs/compatibility.html#python-version-compat)  \n- [Getting Started with Couchbase Capella](https://docs.couchbase.com/cloud/get-started/intro.html)  \n- [Connecting to Couchbase Capella](https://docs.couchbase.com/cloud/get-started/connect.html#prerequisites)  \n- [SQL++ Query Language Guide](https://docs.couchbase.com/server/current/n1ql/n1ql-language-reference/index.html)  \n- [Couchbase SDKs Overview](https://docs.couchbase.com/home/sdk.html)  \n\n### **Streamlit Documentation**\n- [Streamlit Secrets Management](https://docs.streamlit.io/develop/concepts/connections/secrets-management)  \n- [Using `st.connection`](https://docs.streamlit.io/develop/api-reference/connections)  \n- [Streamlit Components](https://docs.streamlit.io/develop/api-reference)  \n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcouchbase-examples%2Fstreamlit-quickstart","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcouchbase-examples%2Fstreamlit-quickstart","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcouchbase-examples%2Fstreamlit-quickstart/lists"}