Complete Streamlit from a Developer’s Perspective: A Practical, Developer-Friendly Guide to Building Data Applications
Playlists
Site Navigation
About Us | Contact Us | Privacy Policy | Disclaimer | Terms & Conditions | Cookies Policy | Return & Refund Policy | EULAComplete
Streamlit from a Developer’s Perspective
A Practical,
Developer-Friendly Guide to Building Data Applications
1. Introduction
Modern software development
increasingly revolves around data-driven applications. Organizations
today rely on dashboards, machine learning tools, analytics platforms, and
internal applications to interpret and act on data.
Traditionally, building such
tools required multiple technologies:
- Backend frameworks
- Frontend JavaScript frameworks
- Visualization libraries
- API layers
- Deployment infrastructure
For data scientists and Python
developers, this created a major challenge: they needed to become full-stack
developers just to share insights.
This challenge led to the rise
of Streamlit, an open-source framework that allows developers to build
interactive web applications directly using Python code.
With Streamlit, developers can
transform a Python script into a fully interactive web app with minimal
overhead.
Typical use cases include:
- Data science dashboards
- Machine learning model demos
- Data exploration tools
- internal analytics applications
- prototype business tools
- educational data applications
Instead of writing HTML, CSS,
and JavaScript, developers write pure Python.
2. What is Streamlit?
Streamlit is an open-source
Python framework designed for rapidly building data applications.
It focuses on three core
principles:
Simplicity
Developers write a Python
script, and Streamlit renders it as a web application.
Interactivity
Widgets allow users to interact
with the application without frontend code.
Rapid Development
Applications can be built in minutes
instead of weeks.
Key Capabilities
Streamlit allows developers to
easily build:
- Interactive dashboards
- ML model interfaces
- real-time analytics tools
- data exploration apps
- custom reporting tools
Why Streamlit Became Popular
Before Streamlit, developers
typically used frameworks like:
- Flask
- Django
- React
- Angular
These required frontend and
backend knowledge.
Streamlit changed the paradigm:
|
Traditional
Development |
Streamlit
Development |
|
Backend + Frontend |
Python only |
|
API development |
Direct Python logic |
|
JavaScript UI |
Built-in widgets |
|
Complex deployment |
Simple command |
This dramatically reduced development
complexity.
3. Architecture of Streamlit
Understanding Streamlit’s
architecture helps developers design scalable applications.
3.1 Execution Model
Streamlit follows a script
execution model.
Each time a user interacts with
the app:
- the Python script runs from top to bottom
- the UI updates automatically
This is different from
traditional frameworks where components update individually.
3.2 Server Architecture
Streamlit applications run on a
local web server.
Typical architecture:
User Browser
|
v
Streamlit Server
|
Python Script
|
Data Sources
The server handles:
- UI rendering
- user interaction
- state management
- caching
3.3 Reactive Programming Model
Streamlit automatically updates
the UI when:
- inputs change
- widgets update
- state changes
This enables reactive
applications without complex event handling.
4. Installing Streamlit
Installation is
straightforward.
Prerequisites
- Python 3.8+
- pip
Step 1: Install Streamlit
pip install streamlit
Step 2: Verify Installation
streamlit hello
This launches a demo
application showcasing:
- widgets
- charts
- layouts
- data tables
Step 3: Create Your First App
Create a file:
app.py
Example:
import streamlit as st
st.title("My First Streamlit App")
st.write("Hello, Streamlit!")
Run the app:
streamlit run app.py
A browser window opens
automatically.
5. Core Components of Streamlit
Streamlit applications are
composed of UI elements and widgets.
5.1 Text Elements
Streamlit provides multiple
text rendering options.
Example:
st.title("Dashboard")
st.header("Sales Overview")
st.subheader("Monthly Performance")
st.text("This is plain text.")
Markdown is supported:
st.markdown("**Bold text**")
5.2 Data Display
Streamlit integrates seamlessly
with Pandas.
Example:
import pandas as pd
import streamlit as st
data = pd.DataFrame({
"Month": ["Jan",
"Feb", "Mar"],
"Sales": [100, 120, 90]
})
st.dataframe(data)
5.3 Tables and Metrics
Example:
st.metric("Revenue", "$20K", "+5%")
Metrics are useful for
dashboards.
6. Interactive Widgets
Widgets enable user
interaction.
6.1 Buttons
if st.button("Run Model"):
st.write("Model executed")
6.2 Sliders
age = st.slider("Select age", 0, 100)
st.write(age)
6.3 Text Input
name = st.text_input("Enter name")
6.4 Select Box
option = st.selectbox(
"Select city",
["London", "New
York", "Tokyo"]
)
6.5 Checkbox
if st.checkbox("Show data"):
st.write(data)
6.6 File Upload
uploaded_file = st.file_uploader("Upload CSV")
This is essential for data
exploration tools.
7. Layout and Page Design
A well-designed layout improves
usability.
7.1 Columns
Example:
col1, col2 = st.columns(2)
with col1:
st.write("Column 1")
with col2:
st.write("Column 2")
7.2 Sidebar
Sidebars are used for controls.
Example:
st.sidebar.title("Filters")
year = st.sidebar.selectbox(
"Year",
[2022, 2023, 2024]
)
7.3 Containers
Containers group elements.
container = st.container()
with container:
st.write("Grouped content")
8. Data Visualization
Visualization is one of
Streamlit’s strongest capabilities.
8.1 Matplotlib Integration
Using Matplotlib:
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
ax.plot([1,2,3], [10,20,30])
st.pyplot(fig)
8.2 Plotly Charts
Using Plotly:
import plotly.express as px
fig = px.line(data, x="Month", y="Sales")
st.plotly_chart(fig)
Plotly provides:
- zooming
- filtering
- hover insights
8.3 Altair Charts
Using Altair:
import altair as alt
chart = alt.Chart(data).mark_bar().encode(
x="Month",
y="Sales"
)
st.altair_chart(chart)
9. Streamlit for Machine Learning
Streamlit is widely used for ML
model deployment.
Example ML Prediction App
import streamlit as st
import joblib
model = joblib.load("model.pkl")
feature = st.number_input("Input feature")
if st.button("Predict"):
prediction =
model.predict([[feature]])
st.write(prediction)
This allows developers to build
interactive AI demos quickly.
10. Streamlit State Management
Since Streamlit reruns the
script each interaction, state management is crucial.
Session State
Example:
if "count" not in st.session_state:
st.session_state.count = 0
if st.button("Increment"):
st.session_state.count += 1
st.write(st.session_state.count)
Session state allows persistent
values during a session.
11. Performance Optimization
Large applications require
performance tuning.
11.1 Caching
Streamlit provides caching
decorators.
Example:
@st.cache_data
def load_data():
return
pd.read_csv("data.csv")
Benefits:
- faster execution
- reduced computation
- improved user experience
11.2 Resource Caching
Example:
@st.cache_resource
def load_model():
return
joblib.load("model.pkl")
This prevents repeated model
loading.
12. Building Real-World Applications
Streamlit is used across
industries.
12.1 Business Dashboards
Features include:
- KPI tracking
- revenue analysis
- performance monitoring
12.2 Data Exploration Tools
Users can:
- upload datasets
- visualize trends
- run analytics
12.3 Machine Learning Tools
Examples:
- prediction apps
- recommendation engines
- anomaly detection systems
12.4 Internal Enterprise Tools
Organizations build:
- reporting tools
- decision dashboards
- analytics platforms
13. Example: Sales Dashboard
Example application structure:
project
├── app.py
├── data
│
└── sales.csv
├── models
└── utils
Example dashboard:
import streamlit as st
import pandas as pd
data = pd.read_csv("sales.csv")
st.title("Sales Dashboard")
region = st.selectbox(
"Region",
data["Region"].unique()
)
filtered = data[data["Region"] == region]
st.line_chart(filtered["Sales"])
14. Best Practices for Streamlit Developers
Keep Scripts Modular
Organize code into:
- modules
- utility functions
- components
Use Clear UI Layouts
Avoid cluttered interfaces.
Good design improves usability.
Handle Errors Gracefully
Example:
try:
data = pd.read_csv(file)
except:
st.error("Invalid file")
Optimize Performance
Use caching and efficient
queries.
Secure Sensitive Data
Avoid exposing:
- API keys
- credentials
- internal data
15. Advantages of Streamlit
Rapid Development
Applications can be built
quickly.
Python Ecosystem Integration
Works seamlessly with:
- Pandas
- NumPy
- machine learning frameworks
Minimal Frontend Knowledge Required
Python developers can build
full applications.
Excellent for Prototyping
Streamlit is ideal for rapid
experimentation.
16. Limitations of Streamlit
Limited Frontend Customization
Compared to React or Angular.
Not Ideal for Massive Applications
Very large enterprise systems
may require traditional architectures.
State Handling Complexity
Developers must carefully
manage session state.
17. Security Considerations
Developers must follow security
best practices:
- validate user input
- protect credentials
- avoid exposing datasets
18. SEO & Content Quality for Publishing This Article
To meet Google AdSense
approval standards, ensure:
Original Content
Avoid copying tutorials.
Deep Technical Value
Include practical examples.
Clear Structure
Use headings and sections.
Helpful Navigation
Add:
- table of contents
- code examples
- diagrams
No Misleading Content
Ensure accurate technical
information.
19. Conclusion
Streamlit has transformed the way developers build data
applications.
It enables:
- rapid dashboard development
- interactive machine learning tools
- data exploration applications
- internal business tools
For developers working in the Python
ecosystem, Streamlit provides a powerful bridge between data science and web
application development.
By combining Streamlit with
libraries like Pandas, NumPy, and Plotly, developers can
create highly interactive tools with minimal effort.
Streamlit is not just a
prototyping tool—it has become a serious platform for building
production-grade data applications.
Part 2 – Advanced Streamlit Development
20. Multipage Applications
As applications grow, keeping
everything inside a single file becomes difficult.
A common beginner mistake is
creating a large app.py file containing:
- UI logic
- Database logic
- ML models
- API integrations
- Business rules
This quickly becomes
unmaintainable.
Streamlit supports multipage
applications.
Why Multipage Apps Matter
Benefits include:
- Better organization
- Improved maintainability
- Team collaboration
- Scalability
- Cleaner navigation
Example Structure
streamlit_project/
│
├── Home.py
│
├── pages/
│ ├── Dashboard.py
│ ├── Analytics.py
│ ├── Reports.py
│ └── Settings.py
│
├── components/
├── services/
├── models/
├── utils/
└── assets/
Home Page
import streamlit as st
st.title("Enterprise Analytics Portal")
st.write("Welcome to the analytics platform.")
Streamlit automatically creates
navigation from the pages folder.
21. Navigation Patterns
Large applications require
predictable navigation.
Sidebar Navigation
import streamlit as st
page = st.sidebar.selectbox(
"Choose Page",
["Home",
"Reports", "Analytics"]
)
Radio Navigation
page = st.radio(
"Navigation",
["Dashboard",
"Settings"]
)
Menu-Based Navigation
menu = {
"Dashboard":
dashboard_page,
"Reports": reports_page
}
menu[selected]()
22. Forms and User Input Management
Forms are essential in
enterprise applications.
Examples:
- Customer registration
- Product entry
- Data collection
- Survey applications
Creating Forms
with st.form("employee_form"):
name =
st.text_input("Name")
department =
st.text_input("Department")
submitted =
st.form_submit_button("Submit")
if submitted:
st.success("Employee
Added")
Why Forms Matter
Without forms:
- Every widget interaction triggers rerun.
With forms:
- Multiple inputs are submitted together.
Benefits:
- Better performance
- Improved UX
- Reduced unnecessary processing
23. File Processing Applications
One of Streamlit's strongest
use cases is file processing.
Common examples:
- CSV analyzers
- Excel reporting tools
- PDF extraction tools
- Data validation systems
Uploading CSV Files
import pandas as pd
import streamlit as st
uploaded = st.file_uploader(
"Upload CSV",
type=["csv"]
)
if uploaded:
df = pd.read_csv(uploaded)
st.dataframe(df)
Excel File Processing
df = pd.read_excel(uploaded)
Multiple File Upload
files = st.file_uploader(
"Upload Files",
accept_multiple_files=True
)
24. Download Functionality
Enterprise users often require
exports.
CSV Download
csv = df.to_csv(index=False)
st.download_button(
label="Download CSV",
data=csv,
file_name="report.csv"
)
JSON Download
import json
json_data = json.dumps(data)
st.download_button(
"Download JSON",
json_data
)
25. Database Integration
Real-world applications rarely
use static data.
Instead they connect to
databases.
Common Databases
|
Database |
Usage |
|
PostgreSQL |
Enterprise systems |
|
MySQL |
Web applications |
|
SQLite |
Lightweight projects |
|
MongoDB |
Document storage |
|
SQL Server |
Corporate environments |
SQLite Example
import sqlite3
conn = sqlite3.connect("app.db")
query = """
SELECT * FROM employees
"""
data = conn.execute(query)
PostgreSQL Example
import psycopg2
conn = psycopg2.connect(
host="localhost",
database="sales",
user="admin",
password="secret"
)
26. ORM Integration
Developers often use ORMs.
Popular choices:
- SQLAlchemy
- Django ORM
SQLAlchemy Example
from sqlalchemy import create_engine
engine = create_engine(
"postgresql://user:pass@localhost/db"
)
df = pd.read_sql(
"SELECT * FROM customers",
engine
)
Benefits:
- Cleaner code
- Better maintainability
- Reduced SQL repetition
27. API Integration
Modern applications consume
APIs.
Examples:
- Weather APIs
- CRM APIs
- ERP APIs
- AI APIs
- Payment APIs
Basic API Request
import requests
response = requests.get(url)
data = response.json()
Display API Data
st.json(data)
Error Handling
try:
response = requests.get(url)
response.raise_for_status()
except Exception as e:
st.error(str(e))
28. Authentication Systems
Many enterprise applications
require authentication.
Authentication Approaches
Basic Login
username = st.text_input("Username")
password = st.text_input(
"Password",
type="password"
)
LDAP Integration
Often used in corporate
environments.
Benefits:
- Centralized identity management
- Active Directory integration
OAuth Integration
Common providers:
- Google
- Microsoft
- GitHub
29. Role-Based Access Control
Enterprise systems often
require permissions.
Examples:
|
Role |
Permissions |
|
Admin |
Full access |
|
Manager |
Reports |
|
Analyst |
Analytics |
|
User |
Read-only |
Example
if role == "Admin":
show_admin_panel()
elif role == "User":
show_user_dashboard()
30. Session State Deep Dive
Session State becomes
increasingly important in large applications.
Store Values
st.session_state.username = "john"
Retrieve Values
user = st.session_state.username
Delete Values
del st.session_state.username
Clear State
for key in st.session_state.keys():
del st.session_state[key]
31. Dynamic Dashboards
Many business dashboards update
dynamically.
Example
region = st.selectbox(
"Region",
regions
)
filtered = df[
df["Region"] == region
]
st.dataframe(filtered)
The dashboard updates
immediately when selections change.
32. Advanced Visualization Techniques
Professional dashboards require
more than simple charts.
Interactive Charts
Using Plotly:
fig.update_layout(
hovermode="x unified"
)
Multiple Series
fig.add_trace(...)
Drill-Down Analytics
Example workflow:
Country
↓
State
↓
City
↓
Customer
This provides deeper analytical
insights.
33. Building Data Exploration Platforms
A common enterprise use case.
Users upload data and explore
it.
Features
- Upload datasets
- View statistics
- Generate charts
- Apply filters
- Export results
Summary Statistics
st.write(df.describe())
Missing Values
st.write(
df.isnull().sum()
)
Correlation Matrix
st.write(
df.corr()
)
34. Machine Learning Dashboards
Streamlit excels at ML
deployment.
Workflow
User Input
↓
Model Prediction
↓
Result Visualization
↓
Business Action
Example
prediction = model.predict(
input_data
)
Display:
st.success(
f"Prediction: {prediction}"
)
35. Model Monitoring Applications
After deployment, models must
be monitored.
Metrics:
- Accuracy
- Precision
- Recall
- F1 Score
- Drift Detection
Example Dashboard
st.metric(
"Accuracy",
"96%"
)
36. Custom Components
Developers may need
functionality beyond built-in widgets.
Custom components enable:
- Specialized UI
- Third-party integrations
- Advanced interactions
Use Cases
- Maps
- Rich text editors
- Interactive diagrams
- Custom analytics widgets
37. Logging and Monitoring
Production systems require
visibility.
Logging Example
import logging
logging.basicConfig(
level=logging.INFO
)
Benefits
- Debugging
- Audit trails
- Performance monitoring
38. Error Handling Strategies
Robust applications anticipate
failures.
Example
try:
process_data()
except Exception as e:
st.error(
f"Error: {e}"
)
39. Configuration Management
Avoid hardcoding values.
Configuration File
database:
host: localhost
port: 5432
Benefits
- Easier maintenance
- Environment separation
- Better security
40. Advanced Streamlit Development Summary
At this stage developers should
be comfortable building:
- Multipage apps
- Database-driven tools
- API integrations
- Authentication systems
- Dynamic dashboards
- Data exploration platforms
- ML applications
The next section focuses on
enterprise deployment, scalability, DevOps, cloud infrastructure, Docker,
CI/CD, monitoring, and production-grade Streamlit architecture.
Part 3 – Enterprise Streamlit, DevOps,
Deployment, Scalability, and Production Best Practices
41. Moving from Prototype to Production
Many developers view Streamlit
only as a prototyping framework.
This is a misconception.
Organizations increasingly
deploy Streamlit applications into production for:
- Executive dashboards
- AI assistants
- Internal analytics
- Financial reporting
- Operational monitoring
- Data science platforms
The transition requires
additional engineering disciplines:
- Security
- DevOps
- Infrastructure
- Monitoring
- Governance
42. Production Architecture
A typical enterprise
architecture:
Users
↓
Load Balancer
↓
Streamlit Application
↓
API Layer
↓
Database
↓
Data Warehouse
Benefits:
- Scalability
- Reliability
- Separation of concerns
43. Layered Application Design
Avoid placing everything inside
one file.
Recommended Structure
project/
├── app.py
├── pages/
├── services/
├── repositories/
├── models/
├── components/
├── utilities/
├── tests/
└── configs/
Advantages
- Reusability
- Easier testing
- Better maintainability
- Team collaboration
44. Dockerizing Streamlit Applications
Containers simplify deployment.
Dockerfile
FROM python:3.12
WORKDIR /app
COPY . .
RUN pip install -r requirements.txt
EXPOSE 8501
CMD [
"streamlit",
"run",
"app.py",
"--server.address=0.0.0.0"
]
Build Image
docker build -t streamlit-app .
Run Container
docker run -p 8501:8501 streamlit-app
45. Container Benefits
Advantages:
- Consistency
- Portability
- Scalability
- Simplified deployment
Works across:
- Local systems
- Cloud platforms
- Kubernetes clusters
46. CI/CD for Streamlit
Modern software delivery relies
on CI/CD.
CI/CD enables:
- Automated testing
- Automated deployment
- Reduced human errors
Typical Pipeline
Code Commit
↓
Unit Tests
↓
Quality Checks
↓
Build Container
↓
Deploy
47. Testing Streamlit Applications
Testing remains essential.
Unit Testing
Focus on:
- Business logic
- Utility functions
- Data transformations
Example
def calculate_tax(amount):
return amount * 0.18
Test:
assert calculate_tax(100) == 18
48. Integration Testing
Validate:
- Database connectivity
- API communication
- Service interactions
49. User Acceptance Testing
Verify:
- Reports
- Dashboards
- Visualizations
- Business workflows
50. Cloud Deployment Options
Popular deployment targets
include:
AWS
Services:
- EC2
- ECS
- EKS
Azure
Services:
- App Service
- AKS
Google Cloud
Services:
- Cloud Run
- GKE
51. Kubernetes Deployment
Large organizations often use
Kubernetes.
Benefits:
- Auto scaling
- High availability
- Self-healing containers
Kubernetes Workflow
Container
↓
Pod
↓
Deployment
↓
Service
52. Scaling Streamlit Applications
As user numbers increase,
scaling becomes important.
Vertical Scaling
Increase:
- CPU
- Memory
Simple but limited.
Horizontal Scaling
Add multiple application
instances.
Benefits:
- Better resilience
- Higher throughput
53. Performance Optimization
Performance directly impacts
user experience.
Key Techniques
Caching
@st.cache_data
Resource Caching
@st.cache_resource
Query Optimization
Reduce database latency.
Lazy Loading
Load only required data.
54. Data Warehouse Integration
Enterprise dashboards often
connect to:
- Snowflake
- BigQuery
- Redshift
- Synapse
Benefits:
- Centralized analytics
- Historical reporting
- Large-scale querying
55. Enterprise Security
Security is mandatory.
Secure Secrets
Never store credentials inside
source code.
Bad:
password = "admin123"
Good:
password = os.getenv(
"DB_PASSWORD"
)
Secret Management
Use:
- Vault
- Cloud secret managers
- Environment variables
56. Data Privacy
Applications must protect
sensitive information.
Consider:
- Data masking
- Encryption
- Access controls
57. Audit Logging
Enterprise environments require
traceability.
Track:
- Logins
- Data access
- Report generation
- Configuration changes
Example Log
2026-05-30
User: analyst01
Action: Export Report
58. Monitoring and Observability
Production systems require
monitoring.
Track:
- CPU usage
- Memory usage
- Response times
- Error rates
Metrics Dashboard
Important KPIs:
Active Users
Requests
Errors
Latency
59. Streamlit for AI Applications
AI is one of the
fastest-growing Streamlit use cases.
Applications include:
- LLM chatbots
- AI assistants
- Document analyzers
- Recommendation engines
- Knowledge portals
Typical AI Architecture
User
↓
Streamlit UI
↓
LLM Service
↓
Vector Database
↓
Response
60. Streamlit for Data Science Teams
Data science teams benefit
because they can:
- Share experiments
- Present findings
- Demonstrate models
- Gather stakeholder feedback
without becoming frontend
engineers.
61. Streamlit in Financial Services
Use cases:
- Risk dashboards
- Fraud detection
- Revenue reporting
- Portfolio analytics
62. Streamlit in Healthcare
Use cases:
- Clinical analytics
- Operational dashboards
- Research reporting
- Medical AI prototypes
Organizations must ensure
regulatory compliance.
63. Streamlit in Manufacturing
Applications:
- Production monitoring
- Predictive maintenance
- Quality control dashboards
- Supply chain analytics
64. Streamlit in Retail
Examples:
- Sales analytics
- Inventory management
- Customer segmentation
- Demand forecasting
65. Streamlit Governance
As applications grow:
- Standards become important
- Architecture reviews become necessary
- Security reviews become mandatory
Establish:
- Coding standards
- Deployment policies
- Monitoring standards
66. Common Developer Mistakes
Monolithic Scripts
Avoid huge files.
No Caching
Leads to slow performance.
Hardcoded Credentials
Security risk.
Poor Error Handling
Creates unreliable systems.
Lack of Testing
Causes production failures.
67. Streamlit Development Roadmap
Beginner:
- Widgets
- Layouts
- Charts
Intermediate:
- APIs
- Databases
- Authentication
Advanced:
- Docker
- CI/CD
- Kubernetes
- Cloud Deployment
Expert:
- Enterprise Architecture
- AI Platforms
- Scalable Analytics Systems
68. Streamlit vs Traditional Frameworks
|
Feature |
Streamlit |
Traditional
Web Frameworks |
|
Learning Curve |
Low |
High |
|
Frontend Coding |
Minimal |
Extensive |
|
Rapid Development |
Excellent |
Moderate |
|
Data Science Support |
Excellent |
Moderate |
|
Enterprise Flexibility |
Moderate |
High |
|
Prototyping Speed |
Excellent |
Lower |
69. Future of Streamlit
Emerging trends include:
- AI-native applications
- LLM interfaces
- Real-time analytics
- Self-service business intelligence
- Enterprise data portals
Streamlit continues evolving as
a powerful bridge between software engineering and data science.
70. Final Conclusion
Streamlit has fundamentally changed how developers build
data-centric applications.
From simple dashboards to
enterprise-grade analytics platforms, Streamlit enables rapid development while
leveraging the full power of Python and its ecosystem.
A professional Streamlit
developer should understand:
- Application architecture
- State management
- Visualization techniques
- Database integration
- API consumption
- Authentication
- Security
- Docker
- CI/CD
- Cloud deployment
- Monitoring
- Scalability
When combined with engineering
best practices, Streamlit becomes much more than a dashboard framework—it
becomes a complete platform for delivering modern data products, machine
learning solutions, AI interfaces, and enterprise analytics applications.
This completes the advanced and enterprise sections of the "Complete Streamlit from a Developer's Perspective" guide and brings the overall series to a comprehensive, publication-ready reference suitable for developers, architects, data engineers, data scientists, and technical leaders.
Comments
Post a Comment