{"id":35523966,"url":"https://github.com/numelon-oss/sklair-cli","last_synced_at":"2026-01-24T02:28:53.076Z","repository":{"id":331747568,"uuid":"1022751485","full_name":"numelon-oss/sklair-cli","owner":"numelon-oss","description":"HTML compiler","archived":false,"fork":false,"pushed_at":"2026-01-11T06:57:57.000Z","size":18667,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-01-11T09:32:58.942Z","etag":null,"topics":["compiler","html","templating-engine"],"latest_commit_sha":null,"homepage":"https://sklair.numelon.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/numelon-oss.png","metadata":{"files":{"readme":"README-old.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,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"github":["numelon-oss","Richy-Z"],"ko_fi":"iirzd"}},"created_at":"2025-07-19T18:40:44.000Z","updated_at":"2026-01-11T06:58:00.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/numelon-oss/sklair-cli","commit_stats":null,"previous_names":["numelon-oss/sklair-cli"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/numelon-oss/sklair-cli","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/numelon-oss%2Fsklair-cli","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/numelon-oss%2Fsklair-cli/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/numelon-oss%2Fsklair-cli/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/numelon-oss%2Fsklair-cli/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/numelon-oss","download_url":"https://codeload.github.com/numelon-oss/sklair-cli/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/numelon-oss%2Fsklair-cli/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28399508,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-13T14:36:09.778Z","status":"ssl_error","status_checked_at":"2026-01-13T14:35:19.697Z","response_time":56,"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":["compiler","html","templating-engine"],"created_at":"2026-01-04T00:27:30.619Z","updated_at":"2026-01-13T21:05:43.013Z","avatar_url":"https://github.com/numelon-oss.png","language":"Go","readme":"# Sklair\n\nSklair is a HTML compiler and templating engine which makes building sites with HTML, CSS, and JavaScript both elegant and powerful again, through reducing repetition for large sites.\n\n## The Sklair Philosophy\n\nUsing this compiler requires some context as to why it was made in teh first place.\n\nSklair is essentially a protest against modern frontend excess.\n\nSklair parses HTML - not JSX -\nand it is not a full framework and doesn't inject a bunch of JavaScript to create virtual DOM trees.\nIt injects logic **only where needed** through (future) compiler directives and embedded Lua,\nuses plain `.html` files as component boundaries,\nhas zero runtime dependencies (no hydration, no runtime VDOM, no `bundle.js`),\nand actually treats the web as a markup-first platform, not a JavaScript rendering target.\n\nTherefore, Sklair is not just a tooling choice, but rather an ideological revolt against complex build steps,\n800 kB \"starter kits\", component trees that only exist in memory, and, JS controlling the entire DOM lifecycle.\nInstead, it says: \"What if your website was literally just a folder of HTML,\nCSS and JS, but with just enough compiler help to stay dry, clean, and powerful?\"\nIt is a return to native HTML as the primary language,\nCSS *actually* doing layour instead of being second-class\n(although we at Numelon prefer to use Tailwind CSS, ironically),\nand JavaScript added for interactivity, not absolutely everything.\n\nIn summary, Sklair is basically old-school but modernised static site generation.\n\n## Real use cases\n\nIn all truth, Sklair targets quite a niche audience.\nBut let's theoretically say that you are a developer (or developers)\nwho absolutely despises every single framework and refuses to use the likes of React,\nNextJS, et cetera.\nYou like using regular HTML and actual CSS (or TailwindCSS)\nto make your sites not look like garbage from the 1990s. And on top of that,\nthe only JavaScript in your site *is* actually functional and serves a purpose\n(i.e. to make a button do work, add animations, etc.) -\nto the point where it is genuinely a single page app.\n\nIn this case, you will have a single `.html` file that is ***absolutely huge*** and almost innavigable,\nand whilst you hate frameworks,\nyou must admire the utility of being able to write `\u003cCustomComponent /\u003e` in common frameworks,\nand it saves you some time and provides you with consistency,\nthe ability to update the same exact component across many pages where you use it.\n\nAnother use case is that you simply maintain an absolutely large corporate website where you need site consistency and really cannot afford to spend time copying and pasting a new link into the menu section of a site where that same menu bar is repeated across 1000 files.\n\nSklair is for you.\n\n## How does it work?\n\n1. Sklair performs document discovery by recursively finding HTML and static files in your project.\n2. The `components` directory of your specified source is then scanned, with each file (hereunto referred to as a \"component\") being parsed - this is component discovery.\n3. On-demand caching is performed: if a component is static (i.e. there are no Lua directives in it), then it is parsed and cached immediately. Otherwise, if dynamic, its Lua blocks are kept for runtime processing per individual HTML file.\n4. For each file, non-standard HTML tags are replaced with matching components. Output is written to a mirrored `build` directory structure.\n5. Non-HTML assets are copied as-is into `build`.\n\n## Performance considerations\n\nSomewhat decent performance considerations have been put into Sklair.\nI initially thought of doing component discovery and file discovery sequentially,\nbut then I realised that we would be scanning a bunch of files multiple times and parsing their contents even if we didn't need some components.\nTherefore, there is lazy loading and whatnot.\nBelow describes it in better detail:\n\n- Lazy component caching means components are parsed only when they are actually used in your source HTML files\n- Static versus dynamic resolution is performed, where Lua components are handled separately for performance\n- Once parsed, component trees are reused so that there is no repeated parsing\n- There is no lookup cost for routing or output structuring\n\n## Example\n\n\u003e [!NOTE]  \n\u003e Component names are case-insensitive. You may choose to name a component `SomeHeader` for clarity, but Sklair treats both `someheader` and `SomeHeader` as the same.\n\u003e\n\u003e Likewise, component files are case-insensitive.\n\u003e\n\u003e You may choose to write `SomeHeader` in your HTML, and have your component saved as `someheader.html`, and it will still work.\n\n```html\n\u003c!-- src/index.html --\u003e\n\u003cbody\u003e\n    \u003cSomeHeader\u003e\u003c/SomeHeader\u003e\n    \u003cContent\u003e\u003c/Content\u003e\n\u003c/body\u003e\n```\n\n```html\n\u003c!-- components/SomeHeader.html --\u003e\n\u003cheader\u003e\n  \u003ch1\u003eWelcome to my site\u003c/h1\u003e\n\u003c/header\u003e\n```\n\n### Compiled output\n\n```html\n\u003cbody\u003e\n  \u003cheader\u003e\n    \u003ch1\u003eWelcome to my site\u003c/h1\u003e\n  \u003c/header\u003e\n  \n  \u003cp\u003e...\u003c/p\u003e\n\u003c/body\u003e\n```\n","funding_links":["https://github.com/sponsors/numelon-oss","https://github.com/sponsors/Richy-Z","https://ko-fi.com/iirzd"],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnumelon-oss%2Fsklair-cli","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnumelon-oss%2Fsklair-cli","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnumelon-oss%2Fsklair-cli/lists"}