Configurable self-hosted "personal dashboard"?

I would like to have a screen in my home displaying a summary of different information that is relevant to me, like weather forecast, bus/train times, news headlines, etc. I was planning to use a Raspberry Pi and either buy a screen to display the information or just show it on my TV. It could probably be as simple as serving a page with HTML and JavaScript and then displaying it in a full screen web browser.

I feel like this is probably something that a lot of people want so I am wondering if there is something out there already that can easily be extended with custom “widgets”. Nextcloud actually has a dashboard that’s a bit like this but ideally I’d like something that is standalone and easier to extend with my own widgets.

Anyone have any recommendations?

monty,

I use Heimdall. It is basic and simple to setup. I tried Organizr but it was more customization than I was looking for.

MDKAOD,

+1 for Heimdall, but I don’t think it does widgets. It’s more like a Intranet homepage.

Max_P,
@Max_P@lemmy.max-p.me avatar

If you want to skip the web browser + server part (well, sort of), you could also build your dashboard as an electron or nwjs app. That way you can easily make it go fullscreen on its own and it doesn’t come with most browser UI around your page. It’s still running essentially Chrome, but it has some advantages if you need to interact with system things, run shell commands at the press of a button, etc.

scarcer,
scarcer avatar

Organizr might be the closest thing you're looking for

idle,

I use Flame Dashboard for something similar to this. It uses a simple sqllite database, so i just whipped together a few python scripts that gather information such as my to do list, calendar, gir repos, etc and update the database table it uses.

hikeandbike,

I just set up flame and am liking it so far. Care to share your scripts?

idle,

Keep in mind they are hacked together and were not meant for mass consumption. Here is an example of one of the scripts that contacts the gitea api and inserts the most recent 10 issues into Flames database with a specific category.

`import sqlite3 from datetime import datetime import requests import re import json from datetime import datetime, timezone

def insert_bookmark(name, url, category_id, order_id): conn = sqlite3.connect(‘/app/db.sqlite’) cursor = conn.cursor()

<pre style="background-color:#ffffff;">
<span style="color:#323232;">cursor.execute("SELECT MAX(id) FROM bookmarks")
</span><span style="color:#323232;">result = cursor.fetchone()
</span><span style="color:#323232;">max_id = result[0] if result[0] else 0
</span><span style="color:#323232;">
</span><span style="color:#323232;">current_time = datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f %z')
</span><span style="color:#323232;">values = (name, url, category_id, "", current_time, current_time, 0, order_id)
</span><span style="color:#323232;">
</span><span style="color:#323232;">cursor.execute("INSERT INTO bookmarks (name, url, categoryId, icon, createdAt, updatedAt, isPublic, orderId) VALUES (?, ?, ?, ?, ?, ?, ?, ?);", values)
</span><span style="color:#323232;">
</span><span style="color:#323232;">max_id += 1
</span><span style="color:#323232;">
</span><span style="color:#323232;">conn.commit()
</span><span style="color:#323232;">conn.close()
</span><span style="color:#323232;">
</span><span style="color:#323232;">return max_id
</span>

def delete_bookmark(category_id): conn = sqlite3.connect(‘/app/db.sqlite’) cursor = conn.cursor() cursor.execute(“DELETE FROM bookmarks WHERE categoryId = ?”, (category_id,)) # Commit the changes and close the connection conn.commit() conn.close()

def get_recently_updated_issues(repo_urls, user_name, api_token): headers = { “Authorization”: f"token {api_token}“, “Content-Type”: “application/json” }

<pre style="background-color:#ffffff;">
<span style="color:#323232;">all_issues = []
</span><span style="color:#323232;">
</span><span style="color:#323232;">for repo_url, repo_name in repo_urls:
</span><span style="color:#323232;">    api_url = repo_url
</span><span style="color:#323232;">
</span><span style="color:#323232;">    # Query the Gitea API to get the issues
</span><span style="color:#323232;">    response = requests.get(api_url, headers=headers, params={"state": "all"})
</span><span style="color:#323232;">    response.raise_for_status()
</span><span style="color:#323232;">
</span><span style="color:#323232;">    issues = response.json()
</span><span style="color:#323232;">
</span><span style="color:#323232;">    sorted_issues = sorted(issues, key=lambda x: x["updated_at"], reverse=True)
</span><span style="color:#323232;">
</span><span style="color:#323232;">    all_issues.extend(sorted_issues[:5])
</span><span style="color:#323232;">
</span><span style="color:#323232;">sorted_all_issues = sorted(all_issues, key=lambda x: x["updated_at"], reverse=True)
</span><span style="color:#323232;">
</span><span style="color:#323232;">recent_issue_titles = []
</span><span style="color:#323232;">recent_issue_links = []
</span><span style="color:#323232;">recent_timestamps = []
</span><span style="color:#323232;">
</span><span style="color:#323232;">for issue in sorted_all_issues[:10]:
</span><span style="color:#323232;">    title = issue["title"]
</span><span style="color:#323232;">    link = issue["html_url"]
</span><span style="color:#323232;">    timestamp = issue["updated_at"]
</span><span style="color:#323232;">
</span><span style="color:#323232;">    recent_issue_titles.append(title)
</span><span style="color:#323232;">    recent_issue_links.append(link)
</span><span style="color:#323232;">    recent_timestamps.append(timestamp)
</span><span style="color:#323232;">
</span><span style="color:#323232;">return recent_issue_titles, recent_issue_links, recent_timestamps
</span>

repo_urls = [ (”gitea.example.com/api/v1/repos/user1/…/issues“, “repo1”), (”gitea.example.com/api/v1/repos/user1/…/issues", “repo2”) ] user_name = “user1” api_token = “example token”

delete_bookmark(8) order_id = 1

recent_issue_titles, recent_issue_links, recent_timestamps = get_recently_updated_issues(repo_urls, user_name, api_token)

for title, link, timestamp in zip(recent_issue_titles, recent_issue_links, recent_timestamps): print(“Issue Title:”, title) print(“Issue Link:”, link) print(“Last Updated:”, timestamp) print() bookmark_id = insert_bookmark(title, link, 8, order_id) order_id += 1`

brian,

The first thing that springs to mind is something like a “magic mirror”. I haven’t delved into it a ton, but I’m fairly certain that it would be able to hit most of your criteria.

That being said, I’d think it could be a decent enough starting point to at least find other things in the same vein.

sol,

Yes you’re right, what I’m thinking of is basically a magic mirror without the mirror. Thanks for the link, I will check that out!

  • All
  • Subscribed
  • Moderated
  • Favorites
  • selfhosted@lemmy.world
  • Durango
  • magazineikmin
  • mdbf
  • thenastyranch
  • khanakhh
  • rosin
  • Youngstown
  • ethstaker
  • slotface
  • modclub
  • kavyap
  • DreamBathrooms
  • everett
  • ngwrru68w68
  • JUstTest
  • InstantRegret
  • tacticalgear
  • GTA5RPClips
  • cubers
  • normalnudes
  • osvaldo12
  • tester
  • anitta
  • cisconetworking
  • megavids
  • Leos
  • provamag3
  • lostlight
  • All magazines