{"id":32693092,"url":"https://github.com/iamgoroot/backline","last_synced_at":"2026-05-18T10:07:13.357Z","repository":{"id":298109696,"uuid":"935078434","full_name":"iamgoroot/backline","owner":"iamgoroot","description":"Backline - IDP inspired by backstage.io written in golang and htmx","archived":false,"fork":false,"pushed_at":"2025-07-17T21:50:31.000Z","size":452,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-07-27T09:54:05.375Z","etag":null,"topics":["asyncapi","backstage","go-templ","golang","htmx-go","internal-developer-portal","openapi","software-catalog"],"latest_commit_sha":null,"homepage":"https://backline-demo.koyeb.app/","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/iamgoroot.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"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}},"created_at":"2025-02-18T21:42:25.000Z","updated_at":"2025-07-17T21:50:34.000Z","dependencies_parsed_at":"2025-06-09T13:38:52.017Z","dependency_job_id":"d292f3f7-93f2-4099-b83c-031c80daada7","html_url":"https://github.com/iamgoroot/backline","commit_stats":null,"previous_names":["iamgoroot/backline"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/iamgoroot/backline","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/iamgoroot%2Fbackline","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/iamgoroot%2Fbackline/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/iamgoroot%2Fbackline/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/iamgoroot%2Fbackline/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/iamgoroot","download_url":"https://codeload.github.com/iamgoroot/backline/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/iamgoroot%2Fbackline/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33174091,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-18T09:27:30.708Z","status":"ssl_error","status_checked_at":"2026-05-18T09:27:28.300Z","response_time":71,"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":["asyncapi","backstage","go-templ","golang","htmx-go","internal-developer-portal","openapi","software-catalog"],"created_at":"2025-11-01T16:03:13.288Z","updated_at":"2026-05-18T10:07:13.351Z","avatar_url":"https://github.com/iamgoroot.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Backline IDP\n\nBackline is a minimalistic Internal Developer Portal (IDP) inspired by Backstage, built using Go and HTMX. It provides a flexible and extensible platform for exploring various developer resources.\n\n## Table of Contents\n- [Demo](#demo)\n- [Features](#features)\n- [Why?](#why)\n- [Getting Started](#getting-started)\n- [Contributing](#contributing)\n- [License](#license)\n\n# Demo\n\nCheck out deployed demo app loaded with same entities that backstage use for their demo app and backstage itself:\n\n[https://backline.onrender.com](https://backline.onrender.com)\n\nSome features may be disabled (for example \"Scan\" button)\n\n## Features\n- **Use existing backstage entities**: Backline can be used with your existing Backstage entity definitions, so you can use your existing entity definitions and metadata.\n- **No scaffolding**: You don't need to worry about setting up a complex backend or frontend, Backline handles it all for you. (see \"./cmd\" directory for examples)\n- **Plugin System**: Backline supports a simple, type-safe plugin system, allowing developers to extend and customize the portal's functionality with ease. (see \"./plugins\" directory)\n- **OAuth2 Integration**: Authentication and authorization using OAuth2.\n\n## Why?\n- **Lower learning curve**: Backline is designed to be easier to learn and use.\n- **Simpler upgrades**: Unlike Backstage, which requires scaffolding and is hard to upgrade, Backline isn't scaffolded and should work just by updating go.mod.\n- **Easy plugin development**:\n  - Plugins register themselves and do not require any code modifications (for now you need to include them into your main file as dependency. Later should be possible to just drop them as *.so files into plugins folder).\n  - Plugins implement statically typed interfaces, making them easy to implement and detect version incompatibilities.\n- **Addressing Backstage issues**:\n  - Backstage does not support search on openapi and asyncapi specs (closed as not planned [backstage/backstage#22802](https://github.com/backstage/backstage/issues/22802)).\n  - Backstage does not respect some relations like `apiProvidedBy` out of the box [backstage/backstage#25387](https://github.com/backstage/backstage/issues/25387).\n  - Plugins use different HTTP clients that may not respect proxy settings [help-im-behind-a-corporate-proxy](https://github.com/backstage/backstage/blob/master/contrib/docs/tutorials/help-im-behind-a-corporate-proxy.md).\n\n## Getting Started\n\nTo get started with Backline you need to add as least few plugins or specify implementations for core functionality\n\nLet's start with a simple example of running just catalog and scanner with minimalistic set of plugins\nWe will use the following plugins/features:\n\n* Discovery for entities on file system\n* PostgreSQL plugin for storage (both entity and as Key-Value) \n* PostgreSQL plugin for distributed lock (using pg_try_advisory_xact_lock)\n* Default plugin for scheduler (this is only option for now)\n* Default theme (with dark and light modes depending on OS theme)\n\n```golang\n\tapplication := app.App{\n\t\t// run catalog and scanner\n\n\t\tPluggableDeps: app.PluggableDeps{\n\t\t\tEntityDiscoveries: []core.Discovery{    // Add Location Readers so backline knows how to read entities from different sources\n\t\t\t\t\u0026fs.Discovery{},                      // github repo to search entities\n\t\t\t},\n\t\t\tEntityRepo:         \u0026pg.Repo{},         // use postgres implementation explicitly.\n\t\t\tKeyValStore:        \u0026kv.PgKV{},         // use postgres KV store explicitly.\n\t\t\tJobScheduler:       \u0026store.Scheduler{}, // job scheduler plugin. Basic implementation that uses KV store and Locker for scheduling and synchronizing tasks\n\t\t\tDistributedLocker:  \u0026store.Locker{},    // distributed lock plugin\n\t\t\tScannerPlugin:      \u0026scanner.Plugin{},  // add scanner plugin to scan/read entities. \n\t\t},\n\t\tPlugins: []core.Plugin{\n\t\t\tcatalog.Plugin{},                       // add web interface for catalog\n\t\t\tstock.Theme{},                          // add stock theme for catalog\n\t\t},\n\t}\n\n  err := application.Run()\n  if err != nil {\n    log.Fatal(err)\n  }\n```\n\nAlthough configuration can be done by populating plugin fields directly in the code, we will use a configuration file\nFor sake of simplicity we will disable some security features (https, csrf, cors are enabled by default)\n\n\n```yaml\ncore:\n  server:\n    https:\n      disabled: true\n    csrf:\n      disabled: true\n    cors:\n      disabled: true\n  logger:\n    level: env:LOG_LEVEL\n    format: json\n  repo:\n    pg:\n      dsn: env:PG_DSN\n  kv:\n    pg:\n      dsn: env:PG_DSN\n  lock:\n    pg:\n      dsn: env:PG_DSN\n  scanner:\n    enableScanEndpoint: true\n    enableScanButton: true\nlocations:\n  fs:\n    - \"./entities\"\n\n```\n\nYou can populate config file directly or use env variables for config values\n\n```env\nPG_DSN=postgresql://postgres:postgres@localhost:5432/backline?sslmode=disable\nLOG_LEVEL=INFO\n```\n\nRun the application\n\n```bash\ngo run main.go --config {your-config-location}/config.yaml\n```\n\nOpen [http://localhost:8080](http://localhost:8080) and you should see the catalog UI. Click on `Scan entities` button to start scanning entities in directory `./entities`\n\nSee more examples in `./examples` directory\n\n## Core dependencies and Plugins\n\nFor more info about plugins and how to write them, see [plugin readme](./plugin/README.md)\n\n## Contributing\n\nContributions to Backline are welcome! If you'd like to contribute, please fork the repository and submit a pull request with your changes.\n\n## License\n\nBackline is open-source software licensed under the MIT License.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fiamgoroot%2Fbackline","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fiamgoroot%2Fbackline","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fiamgoroot%2Fbackline/lists"}