{"id":19631353,"url":"https://github.com/teekay/blogroll","last_synced_at":"2025-08-28T08:07:12.471Z","repository":{"id":88183484,"uuid":"190521665","full_name":"teekay/Blogroll","owner":"teekay","description":"Administer and publish links for your blog running on any platform","archived":false,"fork":false,"pushed_at":"2023-02-24T16:29:34.000Z","size":586,"stargazers_count":1,"open_issues_count":1,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-02-26T21:13:38.033Z","etag":null,"topics":["blogging","oop","publishing"],"latest_commit_sha":null,"homepage":null,"language":"C#","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/teekay.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":"2019-06-06T05:46:25.000Z","updated_at":"2023-01-31T10:18:06.000Z","dependencies_parsed_at":null,"dependency_job_id":"e39e9c7f-8fa2-4c92-bda4-2a32836cb2ff","html_url":"https://github.com/teekay/Blogroll","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/teekay/Blogroll","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/teekay%2FBlogroll","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/teekay%2FBlogroll/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/teekay%2FBlogroll/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/teekay%2FBlogroll/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/teekay","download_url":"https://codeload.github.com/teekay/Blogroll/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/teekay%2FBlogroll/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":272467066,"owners_count":24939508,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-08-28T02:00:10.768Z","response_time":74,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":["blogging","oop","publishing"],"created_at":"2024-11-11T12:08:46.317Z","updated_at":"2025-08-28T08:07:12.418Z","avatar_url":"https://github.com/teekay.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"# About\n\n---\n\nRunning a self-published blog on a platform that does not have a blogroll component? You can run this web app to administer your links, then import them to your weblog as an HTML snippet. Or, if you are feeling fancy, import them as JSON then present them in whichever way you'd like.\n\n**IMPORTANT** - this is a toy/learning project. I'm using it as I prepare for my AZ-204 exam.\n\n## Platform\n\nASP.NET Core 6 using SQLite, LiteDB, Azure Tables, or MySQL for data storage.\n\nHost it on Windows, Linux, in the cloud or in a Docker container.\n\n## License\n\nMIT. Do what you want with this and do not sue me if it does not work.\n\n## Installation\n\n### Docker\nReview the Dockerfile and customize it as necessary. Then deploy to your favorite cloud provider. For my blog, I am using Azure with a Linux host.\n\n### VPS / Azure App Service\n\nPublish the project `Blogroll.Web`, which contains the web app. I strongly suggest putting the Kestrel behind a proxy such as `nginx`. Then, you'd want to obtain an SSL certificate, and configure your web server accordingly. By default, the app does not require or care about SSL but you do.\n\n### Azure Functions\n\nDeploy the project `Blogroll.Api` as a function app in Azure.\n\n## Configuration\n\nThere are three environment variables you want to set:\n\n- `Auth_Admin__Password` to be set with a password you'll use to manage your links (no username)\n- `Data_Data__Engine` to be set with `sqlite`, `litedb`, `azuretables`, or `mysql` (case-insensitive)\n- `Data_Data__Storage` - when using `sqlite` or `litedb`, set this with the relative or absolute path to an existing folder where the app will store the database file.\n\n## Administration\n\nHead over to the URL of your deployed app and log in using the pre-configured password (hopefully, over SSL).\n\nFor each link you want to add, the only truly mandatory field is the \"Blog address\". Enter a name if you want to customize it. If not, the app will try to obtain the name from the website's RSS feed.\n\nLikewise, the \"Feed url\" field is optional. The app will perform auto-discovery if not entered.\n\nYou can change the ordering of the links within your blogroll by dragging and dropping the links.\n\n## Integration\n\nThere's a simple anonymous API that serves your links as text, HTML, or JSON.\n\nAssuming your deployed instance runs at `https://blogroll.example.com`, it's API server runs at `https://blogroll.example.com/api/v1`.\n\nThere are two endpoints:\n\n- `/api/v1/links` for links that include a snippet  from the link's RSS feed's latest entry\n- `/api/v1/links/simple` for links that do not include said snippet\n\nBy default, the endpoint will return HTML. You can explicitly request the content type by either specifying it in the request header, or by affixing `.json`, `.txt`, or `.html` to the URL, e.g. `https://blogroll.example.com/api/v1/links/simple.json` for JSON output.\n\n### Example of integration\n\nEdit your blog's template and place the following HTML snippet where you want your blogroll to appear:\n```\n\u003caside class=\"blogroll-host\" id=\"blogroll-host\" style=\"display:none\"\u003e\n  \u003ch3\u003eBlogroll\u003c/h3\u003e\n  \u003cdiv id=\"blogroll-contents\"\u003e\n  \u003c/div\u003e\n\u003c/aside\u003e\n```\n\nThen, add this at the bottom of your template:\n\n```javascript\n\u003cscript\u003e\n(function(){  \n  var request = new XMLHttpRequest();\n  request.open('GET', 'https://blogroll.example.com/api/v1/links.html', true);\n  request.onload = function () {\n    if (request.status \u003e= 200 \u0026\u0026 request.status \u003c 400) {\n      // Success!        \n      var home = document.getElementById(\"blogroll-contents\");\n      if (home != null) {\n        home.innerHTML = request.responseText;\n      }\n      document.getElementById(\"blogroll-host\").style.display=\"block\";\n    } else {\n      // We reached our target server, but it returned an error\n      console.log(\"Could not fetch the links\");\n    }\n  };\n\n  request.onerror = function (err) {\n    // There was a connection error of some sort\n    console.log(err);\n  };\n\n  request.send();\n})();\n\u003c/script\u003e\n```\n\n(replacing `https://blogroll.example.com/api/v1/links.html` with the URL containing your instance's domain name).\n\nFor this to work, set up your web server such that it sends the right CORS headers like this:\n`Access-Control-Allow-Origin: https://amazing.site` where `https://amazing.site` will be the URL where your blog is published.\n\nYou will notice it takes a second or two for your blogroll to appear. I will address caching and performance topics later. In the meantime, if you want top performance today, save the generated HTML and simply put it straight in your template, bypassing the XHR request altogether.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fteekay%2Fblogroll","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fteekay%2Fblogroll","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fteekay%2Fblogroll/lists"}