Tabbed Widgets
What Are Tabbed Widgets?
Tabbed widgets let you stack multiple widgets in one space with tabs to switch between them. Perfect for saving dashboard space!
Quick Examples
Example 1: Monitoring Hub (Docker + Home Lab)
Stack your monitoring widgets together:
json
{
"id": "monitoring",
"type": "Tabbed",
"config": {
"tabs": [
{
"id": "docker",
"label": "Docker",
"widgetType": "Docker"
},
{
"id": "homelab",
"label": "Services",
"widgetType": "Home Lab"
}
]
},
"position": { "x": 0, "y": 0, "w": 6, "h": 4 },
"enabled": true
}Example 2: Info Center (Time + Weather)
Quick glance information in one spot:
json
{
"id": "info",
"type": "Tabbed",
"config": {
"tabs": [
{
"id": "time",
"label": "Clock",
"widgetType": "Time"
},
{
"id": "weather",
"label": "Weather",
"widgetType": "Weather"
}
]
},
"position": { "x": 0, "y": 0, "w": 4, "h": 3 },
"enabled": true
}Example 3: Content Hub (Jellyfin + Reddit)
Entertainment and news together:
json
{
"id": "content",
"type": "Tabbed",
"config": {
"tabs": [
{
"id": "jellyfin",
"label": "Now Playing",
"widgetType": "Jellyfin"
},
{
"id": "reddit",
"label": "Reddit",
"widgetType": "Reddit",
"widgetConfig": {
"subreddits": ["movies", "television", "entertainment"]
}
}
]
},
"position": { "x": 6, "y": 0, "w": 6, "h": 4 },
"enabled": true
}How to Add Tabbed Widgets
Method 1: Using SQLite (Recommended)
- Access your database:
bash
cd /path/to/homepage
sqlite3 ./data/homepage.db- Insert a tabbed widget:
sql
INSERT INTO widgets (id, type, config, position, enabled) VALUES (
'monitoring-tabs',
'Tabbed',
'{
"tabs": [
{"id": "docker", "label": "Docker", "widgetType": "Docker"},
{"id": "homelab", "label": "Services", "widgetType": "Home Lab"}
]
}',
'{"x":0,"y":0,"w":6,"h":4}',
1
);- Exit and restart:
sql
.exitbash
docker-compose restartMethod 2: Using API
bash
curl -X PUT http://localhost:3020/api/widgets/monitoring-tabs \
-H "Content-Type: application/json" \
-d '{
"id": "monitoring-tabs",
"type": "Tabbed",
"config": {
"tabs": [
{"id": "docker", "label": "Docker", "widgetType": "Docker"},
{"id": "homelab", "label": "Services", "widgetType": "Home Lab"}
]
},
"position": {"x": 0, "y": 0, "w": 6, "h": 4},
"enabled": true
}'Available Widget Types
You can use any of these in your tabs:
Time- Clock and dateWeather- Current weatherBookmarks- Quick linksDocker- Container monitoringHome Lab- Service statusJellyfin- Now playingReddit- Subreddit feeds
Tab Configuration
Each tab needs:
| Field | Required | Description |
|---|---|---|
id | ✅ Yes | Unique ID for the tab |
label | ✅ Yes | Text shown on the tab button |
widgetType | ✅ Yes | Type of widget to display |
widgetConfig | ❌ No | Config to pass to the widget (e.g., Reddit subreddits) |
Widget Config Examples
Reddit with Custom Subreddits
json
{
"id": "reddit-tab",
"label": "Tech News",
"widgetType": "Reddit",
"widgetConfig": {
"subreddits": ["programming", "technology", "linux"]
}
}Multiple Tabs with Configs
json
{
"tabs": [
{
"id": "tech-reddit",
"label": "Tech",
"widgetType": "Reddit",
"widgetConfig": {"subreddits": ["programming", "webdev"]}
},
{
"id": "news-reddit",
"label": "News",
"widgetType": "Reddit",
"widgetConfig": {"subreddits": ["worldnews", "technology"]}
}
]
}Complete Example — Add via SQL
WARNING
Editing the database directly is a last resort. Credentials are no longer stored in widgets.config — see the security guide — so hand-written rows must leave credential fields out and let the settings UI store them.
Here's a complete SQL command to add a tabbed widget:
sql
-- Monitoring Hub with Docker and Home Lab
INSERT INTO widgets (id, type, config, position, enabled) VALUES (
'monitoring-hub',
'Tabbed',
'{"tabs":[{"id":"docker","label":"Containers","widgetType":"Docker"},{"id":"services","label":"Services","widgetType":"Home Lab"}]}',
'{"x":0,"y":0,"w":6,"h":4}',
1
);
-- Media Center with Jellyfin and Reddit
INSERT INTO widgets (id, type, config, position, enabled) VALUES (
'media-center',
'Tabbed',
'{"tabs":[{"id":"jellyfin","label":"Now Playing","widgetType":"Jellyfin"},{"id":"reddit-movies","label":"Movies","widgetType":"Reddit","widgetConfig":{"subreddits":["movies","television"]}}]}',
'{"x":6,"y":0,"w":6,"h":4}',
1
);
-- Quick Info with Time and Weather
INSERT INTO widgets (id, type, config, position, enabled) VALUES (
'quick-info',
'Tabbed',
'{"tabs":[{"id":"time","label":"Clock","widgetType":"Time"},{"id":"weather","label":"Weather","widgetType":"Weather"}]}',
'{"x":0,"y":4,"w":4,"h":3}',
1
);Tips
- Keep tab labels short - They should fit nicely in the tab bar
- Related widgets together - Group similar content (monitoring, media, etc.)
- 2-4 tabs works best - Too many tabs get cramped
- Size matters - Make sure the container is big enough for the content
- Test after adding - Refresh the page to see your new tabbed widget
Troubleshooting
Widget shows "No Tabs Configured":
- Check your JSON syntax in the config
- Make sure
tabsis an array with at least one tab
Widget shows "Widget type not found":
- Check the
widgetTypematches exactly (case-sensitive) - Available types: Time, Weather, Bookmarks, Docker, Home Lab, Jellyfin, Reddit
Tabs don't show content:
- Verify the widget config is valid JSON
- Check browser console for errors
- Make sure the widget has required config (e.g., Reddit needs subreddits)
Can't see the new widget:
- Refresh your browser
- Check Settings → Widgets to ensure it's enabled
- Verify the position doesn't overlap with other widgets
Deleting Tabbed Widgets
sql
DELETE FROM widgets WHERE id = 'your-widget-id';Or disable in Settings → Widgets
Enjoy stacking your widgets! 📚