{"id":303,"date":"2026-04-14T21:37:25","date_gmt":"2026-04-14T21:37:25","guid":{"rendered":"https:\/\/beginnerprojects.com\/cms\/?p=303"},"modified":"2026-04-24T23:49:08","modified_gmt":"2026-04-24T23:49:08","slug":"stop-typing-urls-build-your-own-personal-productivity-dashboard","status":"publish","type":"post","link":"https:\/\/beginnerprojects.com\/cms\/stop-typing-urls-build-your-own-personal-productivity-dashboard\/","title":{"rendered":"Stop Typing URLs: Build Your Own Personal Productivity Dashboard"},"content":{"rendered":"\n<p>I spend a lot of time every day typing the same website addresses into my browser. Even worse, I have a hard time coming up with secure passwords. So, I solved this problem with a handy app I call &#8220;Dashboard&#8221;.<\/p>\n\n\n\n<p>The goal is simple: turn &#8220;typing a domain name&#8221; into &#8220;clicking a single button.&#8221; Instead of hunting through bookmarks or remembering complex URLs, I use one single local HTML file on my desktop that acts as my mission control, giving me instant access to everything I need to start my workday.<\/p>\n\n\n\n<p class=\"has-text-align-center has-medium-font-size\"><a href=\"https:\/\/beginnerprojects.com\/apps\/dashboard-app.html\">Live Dashboard app <strong>preview<\/strong><\/a><\/p>\n\n\n\n<p><strong>Note:<\/strong> This is a standalone \u201cSingle-File App.\u201d All the code, instructions, and security steps required to successfully run this software are contained within this post.<\/p>\n\n\n\n<div class=\"wp-block-group is-layout-constrained wp-block-group-is-layout-constrained\">\n<h2 class=\"wp-block-heading\">IMPORTANT: Security First (The AI Safety Check)<\/h2>\n\n\n\n<p><strong>I want you to <mark>verify this software before you run it.<\/mark><\/strong><br>Even though I have provided this for free, it is a best practice to always verify code from the internet.<\/p>\n\n\n\n<p>Before you save the code provided below, please do the following:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Copy the code from the block at the bottom of this post.<\/li>\n\n\n\n<li>Open one of these AI tools:\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/copilot.microsoft.com\/\" target=\"_blank\" rel=\"noreferrer noopener\">Microsoft Copilot<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/chatgpt.com\/\" target=\"_blank\" rel=\"noreferrer noopener\">ChatGPT<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/www.perplexity.ai\/\" target=\"_blank\" rel=\"noreferrer noopener\">Perplexity AI<\/a><\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Paste the code and ask: <em>\u201cCan you check this HTML\/JavaScript code for any security issues, vulnerabilities, or viruses?\u201d<\/em><\/li>\n<\/ol>\n\n\n\n<p>In a few seconds, the AI will confirm that the code is safe. Once you have that peace of mind, you are ready to go!<\/p>\n<\/div>\n\n\n\n<h2 class=\"wp-block-heading\">How to Set Up Your Dashboard App<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Save the code to your desktop. I suggest naming the file <strong><em>dashboard.html<\/em><\/strong>.\n<ul class=\"wp-block-list\">\n<li><em><strong>Pro Tip:<\/strong> If you plan on downloading more free tools from <a href=\"https:\/\/beginnerprojects.com\">Beginner Projects<\/a>, create a folder on your desktop called <strong>myApps<\/strong> and save your files there to keep things organized.<\/em><\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Launch the App<\/strong><br>Simply double-click the dashboard.html file. It will open instantly in your web browser. For instructions on how to customize the buttons with your own links, read the companion blog post: <a href=\"https:\/\/beginnerprojects.com\/cms\/how-i-built-my-personal-dashboard-and-how-to-tweak-it\/\" data-type=\"post\" data-id=\"307\">How I Built My Personal Dashboard (and How to Tweak It)<\/a><\/li>\n<\/ol>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1000\" height=\"447\" src=\"https:\/\/beginnerprojects.com\/cms\/wp-content\/uploads\/2026\/04\/personal-productivity-dashboard-template.webp\" alt=\"A dark-themed personal productivity dashboard showing a grid of quick-access links and a password generator tool.\" class=\"wp-image-305\" srcset=\"https:\/\/beginnerprojects.com\/cms\/wp-content\/uploads\/2026\/04\/personal-productivity-dashboard-template.webp 1000w, https:\/\/beginnerprojects.com\/cms\/wp-content\/uploads\/2026\/04\/personal-productivity-dashboard-template-300x134.webp 300w, https:\/\/beginnerprojects.com\/cms\/wp-content\/uploads\/2026\/04\/personal-productivity-dashboard-template-768x343.webp 768w\" sizes=\"auto, (max-width: 1000px) 100vw, 1000px\" \/><figcaption class=\"wp-element-caption\">Actual screenshot of the Dashboard app with starter \/ sample links<\/figcaption><\/figure>\n\n\n\n<p class=\"has-text-align-center has-medium-font-size\"><a href=\"https:\/\/beginnerprojects.com\/cms\/how-i-built-my-personal-dashboard-and-how-to-tweak-it\/\" data-type=\"post\" data-id=\"307\">How the Dashboard app works<\/a><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity is-style-wide\"\/>\n\n\n\n<div data-wp-context=\"{ &quot;autoclose&quot;: false, &quot;accordionItems&quot;: [] }\" data-wp-interactive=\"core\/accordion\" role=\"group\" class=\"wp-block-accordion is-layout-flow wp-block-accordion-is-layout-flow\">\n<div data-wp-class--is-open=\"state.isOpen\" data-wp-context=\"{ &quot;id&quot;: &quot;accordion-item-1&quot;, &quot;openByDefault&quot;: false }\" data-wp-init=\"callbacks.initAccordionItems\" data-wp-on-window--hashchange=\"callbacks.hashChange\" class=\"wp-block-accordion-item is-layout-flow wp-block-accordion-item-is-layout-flow\">\n<h3 class=\"wp-block-accordion-heading\"><button aria-expanded=\"false\" aria-controls=\"accordion-item-1-panel\" data-wp-bind--aria-expanded=\"state.isOpen\" data-wp-on--click=\"actions.toggle\" data-wp-on--keydown=\"actions.handleKeyDown\" id=\"accordion-item-1\" type=\"button\" class=\"wp-block-accordion-heading__toggle\"><span class=\"wp-block-accordion-heading__toggle-title\"><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-palette-color-1-color\">See the Code<\/mark> (click to expand)<\/span><span class=\"wp-block-accordion-heading__toggle-icon\" aria-hidden=\"true\">+<\/span><\/button><\/h3>\n\n\n\n<div inert aria-labelledby=\"accordion-item-1\" data-wp-bind--inert=\"!state.isOpen\" id=\"accordion-item-1-panel\" role=\"region\" class=\"wp-block-accordion-panel is-layout-flow wp-block-accordion-panel-is-layout-flow\">\n<pre class=\"wp-block-code has-palette-color-11-background-color has-background\"><code>&lt;!DOCTYPE html>\n&lt;html lang=\"en\">\n&lt;head>\n  &lt;meta charset=\"UTF-8\" \/>\n  &lt;title>Free Dashboard&lt;\/title>\n  &lt;meta name=\"viewport\" content=\"width=1280\" \/>\n  &lt;style>\n    :root {\n      --bg-main: #121212;\n      --bg-surface: #34373F;\n      --text-primary: #abb2ba;\n      --text-secondary: #abb2ba;\n      --accent-primary: #4169E1;\n      --accent-secondary: #45B52D;\n      --border-subtle: #40444C;\n      --border-radius: 7px;\n      --spacing-unit: 20px;\n      --font-sans: Inter, system-ui, sans-serif;\n      --font-mono: Fira Code, monospace;\n    }\n\n    body {\n      background-color: var(--bg-main);\n      color: var(--text-primary);\n      font-family: var(--font-sans);\n      margin: 0;\n      padding: 0;\n      font-size: 1.0625rem;\n      line-height: 1.6;\n    }\n\n    .dashboard-container {\n      max-width: 1140px;\n      margin: 0 auto;\n      padding: calc(var(--spacing-unit) * 1.5) var(--spacing-unit);\n    }\n\n    .section-spacer {\n      height: 40px;\n      width: 100%;\n    }\n\n    h1.main-title {\n      font-size: 48px;\n      font-weight: 500;\n      margin-bottom: 20px;\n      color: var(--text-primary);\n      text-align: left;\n    }\n\n    h2 {\n      font-size: 1.6rem; \n      font-weight: normal;\n      margin-bottom: 20px;\n      color: var(--text-primary);\n    }\n\n    footer p {\n      font-size: 1rem;\n      font-weight: 500;\n      color: var(--text-primary);\n      margin-top: 20px;\n      text-align: center;\n    }\n\n    .link-columns-wrapper {\n      display: grid;\n      grid-template-columns: repeat(4, 1fr);\n      gap: 20px;\n      margin-bottom: 0px;\n    }\n\n    .link-list-column h3 {\n      margin: 0 0 10px;\n      font-size: 1rem;\n      font-weight: 500;\n    }\n\n    .link-list-column ul {\n      list-style: none;\n      padding: 0;\n    }\n\n    .link-list-column li a {\n      display: block;\n      padding: 10px 12px;\n      margin-bottom: 8px;\n      background-color: transparent;\n      color: var(--text-primary);\n      text-decoration: none;\n      border-radius: var(--border-radius);\n      transition: background-color 0.2s ease, color 0.2s ease, border 0.2s ease;\n      font-size: 1.05rem;\n      font-weight: 400;\n      text-align: left;\n      border: 1px solid #3a3c3f;\n    }\n\n    .link-list-column li a:hover {\n      background-color: transparent;\n      color: #abb2ba;\n      border: 1px solid #abb2ba;\n    }\n\n    .password-controls {\n      display: flex;\n      gap: 10px;\n    }\n\n    .password-controls input&#91;type=\"number\"] {\n      width: 70px;\n      background-color: var(--bg-main);\n      color: var(--text-primary);\n      border: 1px solid var(--border-subtle);\n      border-radius: var(--border-radius);\n      padding: 10px;\n      font-family: var(--font-mono);\n      font-size: 1.0625rem;\n    }\n\n    .password-controls input&#91;type=\"text\"] {\n      flex-grow: 1;\n      min-width: 300px;\n      overflow-x: auto;\n      background-color: var(--bg-main);\n      color: var(--text-primary);\n      border: 1px solid var(--border-subtle);\n      border-radius: var(--border-radius);\n      padding: 10px;\n      font-family: var(--font-mono);\n      font-size: 1.0625rem;\n    }\n\n    .password-controls button {\n      background-color: transparent;\n      color: #abb2ba;\n      border: 1px solid #525563;\n      border-radius: var(--border-radius);\n      padding: 10px 32px;\n      cursor: pointer;\n      font-size: 1.0625rem;\n      transition: background-color 0.2s ease, color 0.2s ease;\n    }\n\n    .password-controls button:hover {\n      background-color: #abb2ba;\n      color: #000;\n    }\n\n    code {background-color: #111315; padding: 4px 8px;}\n  &lt;\/style>\n&lt;\/head>\n&lt;body>\n  &lt;div class=\"dashboard-container\">\n    &lt;!-- \ud83d\udd17 Quick Access Links -->\n    &lt;section id=\"link-organizer\">\n      &lt;h1 class=\"main-title\">My Links&lt;\/h1>\n      &lt;div class=\"link-columns-wrapper\">\n        &lt;div class=\"link-list-column\">\n          &lt;h3>Tools&lt;\/h3>\n          &lt;ul>\n            &lt;li>&lt;a href=\"https:\/\/pagespeed.web.dev\/\">PageSpeed&lt;\/a>&lt;\/li>\n            &lt;li>&lt;a href=\"https:\/\/search.google.com\/search-console\/about\">Search Console&lt;\/a>&lt;\/li>\n          &lt;\/ul>\n        &lt;\/div>\n        &lt;div class=\"link-list-column\">\n          &lt;h3>Websites&lt;\/h3>\n          &lt;ul>\n            &lt;li>&lt;a href=\"https:\/\/beginnerprojects.com\/\">beginnerprojects.com&lt;\/a>&lt;\/li>\n            &lt;li>&lt;a href=\"https:\/\/duckduckgo.com\">duckduckgo.com&lt;\/a>&lt;\/li>\n          &lt;\/ul>\n        &lt;\/div>\n        &lt;div class=\"link-list-column\">\n          &lt;h3>Supplemental Sites&lt;\/h3>\n          &lt;ul>\n            &lt;li>&lt;a href=\"https:\/\/lxer.com\/\">lxer.com&lt;\/a>&lt;\/li>\n            &lt;li>&lt;a href=\"https:\/\/www.youtube.com\">youtube.com&lt;\/a>&lt;\/li>\n          &lt;\/ul>\n        &lt;\/div>\n        &lt;div class=\"link-list-column\">\n          &lt;h3>AI&lt;\/h3>\n          &lt;ul>\n            &lt;li>&lt;a href=\"https:\/\/chatgpt.com\">chatgpt.com&lt;\/a>&lt;\/li>\n            &lt;li>&lt;a href=\"https:\/\/www.perplexity.ai\/\">perplexity.ai&lt;\/a>&lt;\/li>\n          &lt;\/ul>\n        &lt;\/div>\n      &lt;\/div>\n    &lt;\/section>\n\n    &lt;div class=\"section-spacer\">&lt;\/div>\n\n    &lt;!-- \ud83d\udd10 Password Generator -->\n    &lt;section id=\"password-generator-section\">\n      &lt;h2>Password Generator&lt;\/h2>\n      &lt;div class=\"password-controls\">\n        &lt;input id=\"password-length\" type=\"number\" min=\"8\" max=\"60\" value=\"36\" \/>\n        &lt;button onclick=\"generateAndDisplayPassword()\">Generate&lt;\/button>\n        &lt;input id=\"password-output\" type=\"text\" readonly \/>\n        &lt;button onclick=\"copyPasswordToClipboard()\">Copy&lt;\/button>\n      &lt;\/div>\n    &lt;\/section>\n\n    &lt;footer>\n      &lt;p>Today is &lt;span id=\"footer-date\">&lt;\/span>&lt;\/p>\n    &lt;\/footer>\n  &lt;\/div>\n\n  &lt;script>\n    document.addEventListener(\"DOMContentLoaded\", () => {\n      const today = new Date();\n      const dateSpan = document.getElementById(\"footer-date\");\n      if (dateSpan) {\n        dateSpan.textContent = today.toLocaleDateString(undefined, {\n          weekday: \"short\",\n          year: \"numeric\",\n          month: \"short\",\n          day: \"numeric\"\n        });\n      }\n    });\n\n    function generateAndDisplayPassword() {\n      const len = Math.max(8, Math.min(60, parseInt(document.getElementById(\"password-length\").value) || 24));\n      const chars = \"ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz0123456789!@#$%^&amp;*()_+-=~`&#91;]{}:;,.&lt;>?\";\n      let result = \"\";\n      while (result.length &lt; len) {\n        const c = chars&#91;Math.floor(Math.random() * chars.length)];\n        if (!\"\/\\\\&lt;>|\".includes(c)) result += c;\n      }\n      document.getElementById(\"password-output\").value = result;\n    }\n\n    async function copyPasswordToClipboard() {\n      const result = document.getElementById(\"password-output\").value;\n      if (result) await navigator.clipboard.writeText(result);\n    }\n  &lt;\/script>\n&lt;\/body>\n&lt;\/html><\/code><\/pre>\n<\/div>\n<\/div>\n<\/div>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity is-style-wide\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Make it Your Own<\/h3>\n\n\n\n<p>The beauty of this dashboard is that it is entirely yours. I encourage you to dive into the code and experiment! You can add dozens of new buttons, create new categories, or even change the colors to match your favorite theme. Don\u2019t be afraid to break things\u2014that is the best way to learn how HTML and CSS work. If you accidentally delete a bracket or mess up the layout, no worries; you can always come back to this post and grab a fresh copy of the starter file.<\/p>\n\n\n\n<p><em><strong>Pro Tip:<\/strong> I&#8217;ve edited the Brave browser settings to load this page every time I press the &#8220;home&#8221; button.<\/em><\/p>\n","protected":false},"excerpt":{"rendered":"<p>I spend a lot of time every day typing the same website addresses into my browser. Even worse, I have a hard time coming up with secure passwords. So, I solved this problem with a handy app I call &#8220;Dashboard&#8221;. The goal is simple: turn &#8220;typing a domain name&#8221; into &#8220;clicking a single button.&#8221; Instead [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":305,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_ecmd_meta_description":"Stop typing URLs! Build your own personal productivity dashboard with this free, single-file HTML app that turns website access into simple button clicks.","footnotes":""},"categories":[6,9],"tags":[],"class_list":["post-303","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-free-apps","category-javascript"],"blocksy_meta":{"page_structure_type":"type-4","styles_descriptor":{"styles":{"desktop":"","tablet":"","mobile":""},"google_fonts":[],"version":6}},"_links":{"self":[{"href":"https:\/\/beginnerprojects.com\/cms\/wp-json\/wp\/v2\/posts\/303","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/beginnerprojects.com\/cms\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/beginnerprojects.com\/cms\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/beginnerprojects.com\/cms\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/beginnerprojects.com\/cms\/wp-json\/wp\/v2\/comments?post=303"}],"version-history":[{"count":12,"href":"https:\/\/beginnerprojects.com\/cms\/wp-json\/wp\/v2\/posts\/303\/revisions"}],"predecessor-version":[{"id":443,"href":"https:\/\/beginnerprojects.com\/cms\/wp-json\/wp\/v2\/posts\/303\/revisions\/443"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/beginnerprojects.com\/cms\/wp-json\/wp\/v2\/media\/305"}],"wp:attachment":[{"href":"https:\/\/beginnerprojects.com\/cms\/wp-json\/wp\/v2\/media?parent=303"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/beginnerprojects.com\/cms\/wp-json\/wp\/v2\/categories?post=303"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/beginnerprojects.com\/cms\/wp-json\/wp\/v2\/tags?post=303"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}