{"id":16569969,"url":"https://github.com/andygrunwald/sico","last_synced_at":"2025-10-29T01:30:17.853Z","repository":{"id":138434876,"uuid":"555511274","full_name":"andygrunwald/sico","owner":"andygrunwald","description":"A Sitemap Comparison that helps you to not fuck up your website migration.","archived":false,"fork":false,"pushed_at":"2022-10-21T20:27:50.000Z","size":7,"stargazers_count":4,"open_issues_count":0,"forks_count":0,"subscribers_count":3,"default_branch":"main","last_synced_at":"2025-02-01T20:51:12.156Z","etag":null,"topics":["hacktoberfest","sitemap","sitemap-comparison","website-migration"],"latest_commit_sha":null,"homepage":"","language":"Go","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/andygrunwald.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":"2022-10-21T18:21:58.000Z","updated_at":"2023-09-16T18:02:30.000Z","dependencies_parsed_at":null,"dependency_job_id":"c7eff014-4f98-471c-bd4c-f0f2342f241d","html_url":"https://github.com/andygrunwald/sico","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andygrunwald%2Fsico","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andygrunwald%2Fsico/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andygrunwald%2Fsico/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andygrunwald%2Fsico/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/andygrunwald","download_url":"https://codeload.github.com/andygrunwald/sico/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":238751722,"owners_count":19524626,"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","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":["hacktoberfest","sitemap","sitemap-comparison","website-migration"],"created_at":"2024-10-11T21:16:08.199Z","updated_at":"2025-10-29T01:30:17.555Z","avatar_url":"https://github.com/andygrunwald.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# sico - A Sitemap comparison tool\n\nA Sitemap Comparison that helps you to not fuck up your website migration.\n\n## Usecase\n\n### Website migration\n\nImagine you want to migrate a website.\nLets say, your personal website https://andygrunwald.com/ (incl. a blog) from [Hugo](https://gohugo.io/) to [Astro](https://astro.build/).\nYou have a few blog posts that rank pretty well in Google - You want to keep all previous URLs.\n\nThis tool checks if all URLs from the old website's sitemap are present in the new one.\nIt is not doing a 1:1 check!\nThe new site can contain more links in the sitemap.\n\n## Usage\n\n```\nUsage of ./sico:\n  -exclude value\n        Regex to match against URLs in {source} sitemap that don't need to be in {new} sitemap. It can be defined multiple times.\n  -new string\n        New Sitemap URL - Sitemap entries you want to check for presence (default \"https://example-new.com/sitemap.xml\")\n  -newBaseURL new\n        Base URL that will be used if new contains a SitemapIndex to replace the SitemapIndex entries\n  -source string\n        Source Sitemap URL - Sitemap you want to check against (default \"https://example.com/sitemap.xml\")\n```\n\n### An example\n\nThe call ...\n\n```sh\n./sico -source \"https://andygrunwald.com/sitemap.xml\" \\\n       -new \"https://deploy-preview-7--spiffy-shortbread-df2800.netlify.app/sitemap-index.xml\" \\\n       -newBaseURL \"https://deploy-preview-7--spiffy-shortbread-df2800.netlify.app/\" \\\n       -exclude \"andygrunwald\\\\.com/tags/\"\n```\n\n... means:\n\n1. We read the `-source` sitemap from `https://andygrunwald.com/sitemap.xml` and collect the URLs:\n    ```xml\n    \u003curlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\" xmlns:xhtml=\"http://www.w3.org/1999/xhtml\"\u003e\n        \u003curl\u003e\n            \u003cloc\u003ehttps://andygrunwald.com/\u003c/loc\u003e\n            \u003clastmod\u003e2021-09-21T20:30:00+02:00\u003c/lastmod\u003e\n        \u003c/url\u003e\n        \u003curl\u003e\n        [...]\n    \u003c/\u003curlset\u003e\n    ```\n2. We read the `-new` sitemap from `https://deploy-preview-7--spiffy-shortbread-df2800.netlify.app/sitemap-index.xml` and collect the URLs:\n    ```xml\n    \u003csitemapindex xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\"\u003e\n        \u003csitemap\u003e\n            \u003cloc\u003ehttps://andygrunwald.com/sitemap-0.xml\u003c/loc\u003e\n        \u003c/sitemap\u003e\n    \u003c/sitemapindex\u003e\n    \n    1. If this URL is a SitemapIndex ([one sitemap split into multiple sitemaps](https://developers.google.com/search/docs/crawling-indexing/sitemaps/large-sitemaps))\n    2. AND `-newBaseURL` is set, replace the Base URL (Scheme + Host) of the Sub-Sitemap with `-newBaseURL`\n    3. Means `https://andygrunwald.com/sitemap-0.xml` will be changed to `https://deploy-preview-7--spiffy-shortbread-df2800.netlify.app/sitemap-0.xml`\n3. Loop through all URLs from `-source` (`https://andygrunwald.com/sitemap.xml`), check if the URL matches a defined `-exclude` and needs to be skipped; if not check if it is part of the `-new` sitemap. If yes, all good; if not, raise this as output (see below)\n4. Result:\n    ```\n    Result\n    =============\n    Source Sitemap: https://andygrunwald.com/sitemap.xml\n    URLs checked (from source sitemap): 60\n    New Sitemap: https://deploy-preview-7--spiffy-shortbread-df2800.netlify.app/sitemap-index.xml\n    Excludes configured: 1\n\n    URLs skipped because they matched an exclude: 24\n    URLs missing from source sitemap in new sitemap: 14\n\n    Missing URLs in the new sitemap:\n    https://andygrunwald.com/categories/\n    https://andygrunwald.com/categories/hardware/\n    [...]\n    ```\n\n## Production ready?\n\nNo, not really.\nBut it does the job.\n\nThis tool was created \"on the get-go\".\nIt has no focus on reliability, proper error handling, or things that fit into the *production ready* category.\nHowever, this is (partially) not needed.\n\nThis tool only reads data from the web and compares it.\nNo write functionality or anything else.\nHence, no damage.\n\nMeans: You can see it as a (kind of) production ready.","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fandygrunwald%2Fsico","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fandygrunwald%2Fsico","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fandygrunwald%2Fsico/lists"}