{"id":18602983,"url":"https://github.com/devlooped/oss","last_synced_at":"2026-01-21T09:32:10.760Z","repository":{"id":25438565,"uuid":"28868344","full_name":"devlooped/oss","owner":"devlooped","description":"Basic repo configuration for my OSS projects","archived":false,"fork":false,"pushed_at":"2026-01-12T17:54:45.000Z","size":577,"stargazers_count":16,"open_issues_count":1,"forks_count":1,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-01-14T01:39:13.850Z","etag":null,"topics":["netconfig","oss","template"],"latest_commit_sha":null,"homepage":"","language":"SCSS","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/devlooped.png","metadata":{"files":{"readme":"readme.md","changelog":null,"contributing":null,"funding":null,"license":"license.txt","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,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"github":"devlooped"}},"created_at":"2015-01-06T15:03:36.000Z","updated_at":"2026-01-12T17:54:49.000Z","dependencies_parsed_at":"2024-03-12T06:24:56.146Z","dependency_job_id":"375a1672-0b92-4a45-b12d-7e38dfdb58ec","html_url":"https://github.com/devlooped/oss","commit_stats":null,"previous_names":["kzu/oss"],"tags_count":10,"template":false,"template_full_name":null,"purl":"pkg:github/devlooped/oss","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/devlooped%2Foss","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/devlooped%2Foss/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/devlooped%2Foss/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/devlooped%2Foss/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/devlooped","download_url":"https://codeload.github.com/devlooped/oss/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/devlooped%2Foss/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28631142,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-21T04:47:28.174Z","status":"ssl_error","status_checked_at":"2026-01-21T04:47:22.943Z","response_time":86,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":["netconfig","oss","template"],"created_at":"2024-11-07T02:13:09.963Z","updated_at":"2026-01-21T09:32:10.737Z","avatar_url":"https://github.com/devlooped.png","language":"SCSS","funding_links":["https://github.com/sponsors/devlooped"],"categories":[],"sub_categories":[],"readme":"![logo](https://github.com/devlooped/devlooped.github.io/blob/main/img/tiny.png) oss template\n===\n\nFor my new open source projects, this is the basic repository structure and build approach I'm going to use. \n\n## Goals\n\n1. Trivial to apply and update via [dotnet-file](https://github.com/kzu/dotnet-file) with just two simple `dotnet` commands.\n2. Repo instructions should just be: `dotnet restore \u0026 dotnet build \u0026 dotnet test` right on the repo root.\n\n## Installing\n\nAfter creating an empty repo (maybe with just a `readme.md`), just run:\n\n```\ndotnet file init https://github.com/devlooped/oss/blob/main/.netconfig\n```\n \nThis will fetch the given [dotnetconfig](https://dotnetconfig.org] and\nsynchronize the configured files and create a [.netconfig](.netconfig) \nin the repo containing all the downloaded entries for future sync.\n\nAt this point, you should add a `skip` value to the `.netconfig` file for the entries \nyou don't want to keep up-to-date afterwards. The default skips would likely match \nthe provided [.netconfig](.netconfig), plus any extra files you want to modify, for \nexample:\n\n```gitconfig\n[file]\n\turl = https://github.com/devlooped/oss\n\n# don't sync the .netconfig itself, to avoid a loop\n[file \".netconfig\"]\n\turl = https://github.com/devlooped/oss/blob/main/.netconfig\n\tskip\n\n# readme is always customized for the project\n[file \"readme.md\"]\n\turl = https://github.com/devlooped/oss/blob/main/readme.md\n\tskip\n\n# we'll be tweaking the build, say\n[file \".github/workflows/build.yml\"]\n\turl = https://github.com/devlooped/oss/blob/main/.github/workflows/build.yml\n\tskip\n ```\n\n\u003e NOTE: you can also download the raw [.netconfig](.netconfig) from this repository \n\u003e and run `dotnet file update` instead. It already contains skips for the readme.\n\n## Updating\n\nFrom this point on, applying template changes is as easy as running:\n\n```\ndotnet file update\n```\n\nYou can also just list detected changes with:\n\n```\ndotnet file changes\n```\n\nAutomation is provided via the [dotnet-file.yml](.github/workflows/dotnet-file.yml) \nworkflow, which runs daily and does a `dotnet file sync` and creates a PR in your \nrepository as needed, with a populated changelog to inspect the incoming changes.\n\n\n## Design Choices\n\nIn no particular order:\n\n1. `src` folder contains `Directory.Build.props` and `Directory.Build.targets` \n   and those contain all the customizations for the build, packaging and versioning. \n   In the past I went crazy factoring the targets into multiple files with single \n   purpose groupings and it bcomes [quite hard to follow](https://github.com/devlooped/moq/tree/a76c3cea6/src/build) \n   even for me, having written it all. So it's better to Keep Things Simple™.\n   Logically related properties and items have a `Label` attribute as documentation.\n   You can customize both by adding a `Directory.props` or `Directory.targets`, \n   which are imported at the end of both files.\n\n2. If a `src/Directory.Packages.props` is found, I turn on \n   [centrally managed package versions](https://github.com/NuGet/Home/wiki/Centrally-managing-NuGet-package-versions), but it's not required.\n    \n3. GitHub Actions are provided for the CI/CD process as follows:\n   - [Build](.github/workflows/build.yml): regular branch builds and PRs build. By default, build and test \n     jobs will run on `ubuntu-latest`. To customize this, create a `./.github/workflows/os-matrix.json` file in the \n     repository, with the matrix to use for the build, such as `[\"windows-latest\", \"ubuntu-latest\", \"macOS-latest\"]`. \n   - [Changelog](.github/workflows/changelog.yml): when a release is released (not created, but actually released), \n     a changelog is calculated and pushed to main. The [changelog.config](.github/workflows/changelog.config) file \n     defines [changelog generation options](https://github.com/github-changelog-generator/github-changelog-generator/wiki/Advanced-change-log-generation-examples).\n   - [Release notes](.github/workflows/release-notes.yml): when a release (either draft or final) is published, \n     the notes are generated using the same configuration above.\n   - [Includes](.github/workflows/includes.yml): allows using HTML includes in markdown files for \n     easier content reuse. Readmes should include the \n     [standard footer](https://github.com/devlooped/sponsors/raw/main/footer.md) with:\n\n     ```\n     \u003c!-- include https://github.com/devlooped/sponsors/raw/main/footer.md --\u003e\n     ```\n\n4. `dotnet format` is enforced on builds to keep consistency with `.editorconfig`.\n\n5. [dependabot](.github/dependabot.yml) is configured to check for updated nuget packages daily.\n\n6. A default [strong-name key](src/kzu.snk) is provided by default too. If the project does not desire to \n   strong-name the assemblies, it can be skipped as well in the `.netconfig` file. If present, the mentioned \n   `Directory.Build.*` targets will automatically pick the file and strong name assemblies.\n\n7. [Bug](.github/ISSUE_TEMPLATE/bug.md) template provided. No addiitonal config provided since the \n   discussions URLs cannot be relative :(.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdevlooped%2Foss","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdevlooped%2Foss","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdevlooped%2Foss/lists"}