{"id":36904902,"url":"https://github.com/qlova/seed","last_synced_at":"2026-01-12T15:50:52.387Z","repository":{"id":54499899,"uuid":"146002995","full_name":"qlova/seed","owner":"qlova","description":"A full-stack webapp development module for Go.","archived":false,"fork":false,"pushed_at":"2024-12-18T02:15:54.000Z","size":5395,"stargazers_count":115,"open_issues_count":3,"forks_count":11,"subscribers_count":7,"default_branch":"master","last_synced_at":"2025-11-22T14:54:29.154Z","etag":null,"topics":["app","cross-platform","framework","pwa","seeds"],"latest_commit_sha":null,"homepage":"https://qlovaseed.com","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"agpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/qlova.png","metadata":{"files":{"readme":"Readme.md","changelog":null,"contributing":null,"funding":null,"license":"Copying","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":"2018-08-24T14:38:44.000Z","updated_at":"2025-09-26T11:36:22.000Z","dependencies_parsed_at":"2024-06-18T20:12:03.810Z","dependency_job_id":null,"html_url":"https://github.com/qlova/seed","commit_stats":null,"previous_names":["qlova/app"],"tags_count":5,"template":false,"template_full_name":null,"purl":"pkg:github/qlova/seed","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/qlova%2Fseed","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/qlova%2Fseed/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/qlova%2Fseed/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/qlova%2Fseed/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/qlova","download_url":"https://codeload.github.com/qlova/seed/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/qlova%2Fseed/sbom","scorecard":{"id":754136,"data":{"date":"2025-08-11","repo":{"name":"github.com/qlova/seed","commit":"626ae6ba65bd8c713d9fe76d4b6353520a00f027"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":2.8,"checks":[{"name":"Code-Review","score":0,"reason":"Found 1/29 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Dangerous-Workflow","score":-1,"reason":"no workflows found","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Pinned-Dependencies","score":-1,"reason":"no dependencies found","details":null,"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: Copying:0","Info: FSF or OSI recognized license: GNU Affero General Public License v3.0: Copying:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 2 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Vulnerabilities","score":8,"reason":"2 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GO-2023-2074 / GHSA-m9xq-6h2j-65r2","Warn: Project is vulnerable to: GO-2024-3205 / GHSA-xhr3-wf7j-h255"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-22T21:07:35.956Z","repository_id":54499899,"created_at":"2025-08-22T21:07:35.956Z","updated_at":"2025-08-22T21:07:35.956Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28341882,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-12T15:50:39.657Z","status":"ssl_error","status_checked_at":"2026-01-12T15:49:49.297Z","response_time":98,"last_error":"SSL_read: 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":["app","cross-platform","framework","pwa","seeds"],"created_at":"2026-01-12T15:50:52.297Z","updated_at":"2026-01-12T15:50:52.379Z","avatar_url":"https://github.com/qlova.png","language":"Go","readme":"# ![logo](assets/logo.svg) [![Godoc](https://godoc.org/qlova.org/seed?status.svg)](https://pkg.go.dev/qlova.org/seed) [![Go Report Card](https://goreportcard.com/badge/github.com/qlova/seed)](https://goreportcard.com/report/github.com/qlova/seed) [![Build Status](https://travis-ci.org/qlova/seed.svg?branch=master)](https://travis-ci.org/qlova/seed)\n\nThe cross-platform Go module for building apps (pronounced klo-va-seed). \n\n## Usecases\n\n*As a lightweight alternative to Electron*  \n Write your frontend and native code in Go, distribute native binaries of your app.\n Supported on Windows, Mac \u0026 Linux. Mobile support planned.\n \n*Full-stack progressive webapp*  \n Write the complete app in Go, place binaries on public-facing web servers.\n Access these apps on Windows, Mac, Linux, IOS \u0026 Android.\n \n*As a lightweight alternative to Phonegap* (WIP linux-only)  \n Write your app in Go, export the frontend as a native app.\n Android-only. IOS support planned.\n\n[Examples](examples)\n\n![showcase](assets/showcase.jpg)\n\n## Getting started\n\nCreate HelloWorld.go file and paste in the following contents:\n\n```go\npackage main\n\nimport \"qlova.org/seed/new/app\"\n\nfunc main() {\n\tapp.New(\"Hello World\").Launch()\n}\n```\n\nIn the same folder, run 'go mod init .' to initialise the project and then 'go build' to create an executable for the app, run this to launch the app. By default, Qlovaseed will start a WebServer and open a browser window displaying your app.\n\n## Core Concepts\n\nQlovaseed is a full-stack cross-platform application-development framework.  \nThis means that Apps created with Qlovaseed under the hood feature both a client and server component.  \n\nQlovaseed aims to blur the client-server distinction, the app is written as a whole, in Go.\nThen communication is achieved with 'client' and 'clientside' packages.\n\nJavascript and http.Handlers are managed by the framework.\n\nThis is a clientside pattern that changes the text of the button on the client-side.\n```go\n    var Text = new(clientside.String)\n\n    button.New(\n        text.SetTo(Text),\n\n        client.OnClick(Text.Set(\"You Clicked me\")),\n    )\n```\n\nThis is client handler that changes the text of the button from the server.\n```go\n\tvar Text = new(clientside.String)\n\n    button.New(\n        text.SetTo(Text),\n\n        client.OnClick(client.Go(func() client.Script {\n            return Text.Set(\"You Clicked me\")\n        }),\n    )\n```\n\nGiven an App, by default Qlovaseed will create a web server, manage the handlers, HTML, JS \u0026 CSS. All these resources are pre-rendered by Qlovaseed.\nThen the app will be launched on the local web browser in kiosk mode (if available).  \nAlternatively, the app can be placed on a remote server and proxied through a webserver with automatic HTTPS (such as [Caddy](https://caddyserver.com/)).  \nThis will serve the app as a Lighthouse-compliant progressive WebApp.\n\n## Full App example.\n\n```go\npackage main\n\nimport (\n\t\"image/color\"\n\n\t\"qlova.org/seed/client\"\n\t\"qlova.org/seed/client/clientside\"\n\n\t//Import a seed to use it, a list of seeds can be found [here](https://github.com/qlova/seed/tree/master/new).\n\t\"qlova.org/seed/new/app\"\n\t\"qlova.org/seed/new/button\"\n\t\"qlova.org/seed/new/text\"\n\n\t\"qlova.org/seed/set\"\n)\n\nfunc main() {\n\tvar Text1 = \u0026clientside.String{Value: \"My callback runs on the client\"}\n\tvar Text2 = \u0026clientside.String{Value: \"My callback runs on the server\"}\n\n\tapp.New(\"My App\",\n\t\tbutton.New(\n\t\t\ttext.SetStringTo(Text1),\n\n\t\t\tclient.OnClick(Text1.Set(\"You Clicked me\")),\n\t\t),\n\n\t\tbutton.New(\n\t\t\ttext.SetStringTo(Text2),\n\n\t\t\tset.Color(color.RGBA{100, 100, 0, 255}),\n\n\t\t\tclient.OnClick(client.Go(func() client.Script {\n\t\t\t\treturn Text2.Set(\"You Clicked me\")\n\t\t\t})),\n\t\t),\n\t).Launch()\n}\n```\n\nThis example shows a quick glimpse on how powerful Qlovaseed is.\n\n## Project folder structure\n\nFor larger apps, it is a good idea to seperate the ui from the business logic. The recommended folder structure is:\n\n```\n    domain (business logic)\n    |\n    ├───── main (main package that launches the app)\n    |      └─── main.go\n    |\n    ├───── ui (pages \u0026 popups)\n    |      ├─ new (place custom seed packages in here)\n    |      |  └─── customseed\n    |      |        └──────── customseed.go\n    |      |\n    |      ├─ user (global clientside state)\n    |      |  └─── user.go\n    |      |\n    |      ├─ style (styles for your seeds)\n    |      |  └─── styles.go\n    |      |\n    |      └─ page.Home.go\n    |\n    └───── domain.go\n```\n\n## Styles\n\nAll seeds can be styled with methods from the set package.\n\n```\nimport \"color\"\nimport \"qlova.org/seed/set\"\nimport \"qlova.org/seed/new/text\"\nimport \"qlova.org/seed/use/css/units/rem\"\n\ntext.New(set.Color(color.RGBA{100, 0, 0, 255}),\n    set.Margin(rem.One, rem.One),\n\n    text.Set(\"Some stylable text\"),\n)\n```\n\n## HTML/CSS/JS\n\nThe use of raw HTML, CSS and Javascript to build apps is discouraged.\nHowever, there may be good reasons to use these technologies to extend functionality or to create new seeds.\n\n* Seeds have a html.Set option for setting raw HTML.\n* When in doubt, css.Set can be used to set css styles with strings,\n* js.Bundle is useful for embedding Javascript and CSS files. Checkout the gallery seed.\n\n## Contributing\nIf you are missing a minor feature (such as a standard javascript wrapper, a css unit or the like) and decide to implement it please create a pull request \nso that the feature can be added into the framework.\n\n## Community \nThere is a reddit community: [/r/Qlovaseed](https://www.reddit.com/r/Qlovaseed/).\nYou can also ask questions on the [Github Discussions](https://github.com/qlova/seed/discussions) page.\n\n**Please remember**, this framework is in development, it does not have a stable API and features are currently implemented as needed.\n\n**License**  \nThis work is subject to the terms of the Qlova Public\nLicense, Version 2.0. If a copy of the QPL was not distributed with this\nwork, You can obtain one at https://license.qlova.org/v2\n\nThe QPL is similar to the MPL except it tracks modifications at the Go package level instead at the file level and you \nmust release changes you make to the packages in this module if you distribute/host an app with a modified version of Qlovaseed. \nThe intent is to keep the Qlovaseed module open but allows you to import and use the framework inside a proprietary app.\n\nThe QPL is compatible with the AGPL which is why both licenses are provided within this repository.\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fqlova%2Fseed","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fqlova%2Fseed","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fqlova%2Fseed/lists"}