{"id":15355733,"url":"https://github.com/minivera/lander","last_synced_at":"2026-01-20T15:07:43.025Z","repository":{"id":43017102,"uuid":"139061598","full_name":"Minivera/lander","owner":"Minivera","description":"VDOM experiments","archived":false,"fork":false,"pushed_at":"2023-12-01T05:45:43.000Z","size":2145,"stargazers_count":2,"open_issues_count":4,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-04-06T13:47:17.916Z","etag":null,"topics":["framework","hacktoberfest","monorepo","testing","typescript","vdom"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","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/Minivera.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}},"created_at":"2018-06-28T19:45:26.000Z","updated_at":"2021-12-29T06:36:22.000Z","dependencies_parsed_at":"2025-02-12T19:48:34.723Z","dependency_job_id":"beaf3f97-a1c5-422e-94ca-6d1230c370bf","html_url":"https://github.com/Minivera/lander","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/Minivera/lander","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Minivera%2Flander","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Minivera%2Flander/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Minivera%2Flander/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Minivera%2Flander/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Minivera","download_url":"https://codeload.github.com/Minivera/lander/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Minivera%2Flander/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28606139,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-20T14:45:23.139Z","status":"ssl_error","status_checked_at":"2026-01-20T14:44:16.929Z","response_time":117,"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":["framework","hacktoberfest","monorepo","testing","typescript","vdom"],"created_at":"2024-10-01T12:25:23.160Z","updated_at":"2026-01-20T15:07:43.002Z","avatar_url":"https://github.com/Minivera.png","language":"TypeScript","readme":"# Lander\n\nLander is yet-another-frontend-framework aimed at exploring performance optimizations through the use of localised \ncomponents. It is currently very experimental and only provides the bare minimum to get an app going. It also has \nsome technical issues and limitations that make it very hard to recommend, even in development projects.\n\n## Docs\n\nIf you are interested to learn more, check out our docs for the individual packages. The rest of this README will \ncover the reasoning and ideas behind this framework.\n\n- [@lander/lander](./packages/lander/docs/README.md)\n- [@lander/blueprint](./packages/blueprint/docs/README.md)\n\n## Why Lander?\n\nThere are no shortages of frontend frameworks and most projects are likely to end up using one of the big ones such \nas React, Vue, Svelte, etc. Lander was not created to replace those frameworks, I could never hope to have the \ncapacity to build the kind of products these teams do. Rather, it was created for research purposes. While I do hope \nLander can one day become mature enough to be used in production projects, its main objective at the moment is to \nserve as a tool for testing and experimenting with algorithms.\n\nLander was initially created as a learning project for myself and went through, at least, 4 versions. It was shown \noff at ForwardJS 2019 and iterated over throughout the years. Since then, the repository was used for researching \nperformance and testing ways of improving the diffing algorithms for university research. The current version of the \nlibrary is an updated version of these experiments.\n\n### Features experiments\n\nThe main goal of the current version of Lander is to try to solve two challenges I had identified with the existing \nalgorithms and implementations for the modern, VDOM based, frontend frameworks. The VDOM is an added overhead and \nliterature I found on the subject suggested replacing it as a solution to its inherent drawbacks. My experiments \nwere rather exploring if we could reduce the load on a single VDOM algorithm as a way to increase performance and \nmaintain the great DX offered by these algorithms.\n\nIn addition, the versions of React, Vue, and a few others frameworks I explored at the time often suffered from a \nlack of portability. In the case of React 16, for example, the understanding is that there is only one single \n\"instance\" of React running as your application, you should not split it up. This assumption might be wrong in the \nrecent versions, but it becomes very much true in all versions when factoring it some of the global state libraries. \nIn all the React codebases I worked on, there was only a single entry point for an entire React application. You \ncouldn't render it in multiple places in the application or combine it with static HTML, React is the application.\n\nTo solve these challenges, Lander uses web component and a localized version of the (fairly slow) VDOM algorithm we \npurpose built for the needs of this library. These optimizations work in the following ways:\n\nAll components built with Lander are rendered in the actual DOM tree. They are not kept as virtual components \nonly used to render other elements, but rather as elements in the tree. Whenever a rerender is requested, only the\nclosest latest component will rerender. Updates do not cause the entire tree to diff, but rather only the closest \ntree to the update. The diffing algorithm walks the tree of the updated component and, whenever it hits another \ncomponent in its children, it requests an update for that component. Diffing is essentially isolated within a \ncomponent. The intent was to avoid diffing, even if optimized, an entire complex tree if only a few leaf elements\nchange. \n\nSince components are actual elements in the tree, we are also able to store context and state in that element's \nmemory. While this was not an optimization I ended up going for, we could technically not keep a virtual DOM tree an \nonly diff the actual DOM, since all parts of the virtual tree exists within the real DOM.\n\nFinally, using web components means that we can make components portable and render a component anywhere in an \napplication, even in an application using other frontend frameworks. There is no global memory storing the tree and \ncomponents states, which means that multiple instances of Lander can live alongside one another. One goal of the library\nthat I could not implement was to allow adding components by name in HTML files and have Lander pick them up for \nrender when the application loads. The current version still requires an index file to start any root component you \nwant to render, like with `ReactDOM.render`.\n\n## What is the future for this library?\n\nThe academic portion of Lander has been completed and is unlikely to continue as my own academic interests don't \nalign with this type of research. Ultimately, I would hope to complete the library and release it to the public in a \nstate where interested people can use it in production environments. It is not there yet, unfortunately.\n\nAt the moment, the library is pretty-much in **archive mode** and was only worked on recently to write this README and \nsolve any critical security issues. I do not plan to archive this repository, but I strongly recommend **NOT** using \nit in any kind of production environment. Pull requests are unlikely to be reviewed, though I will answer any \nquestions or comments posted as issues. If this library looks interesting to you, please reach out!\n\n## Is lander related to [go-lander](https://github.com/Minivera/go-lander)?\n\nYou may have landed here (pun totally intended) through my other library of a similar name, [go-lander](https://github.com/Minivera/go-lander).\n\nGo-Lander initially started as an implementation of an earlier version of Lander in Golang, compiled in WASM to use \nas an alternative frontend framework. The early algorithm for Go-Lander was a carbon copy of the ForwardJS 2019 version \nof lander. This older version did not work and was full of bugs. The plan of Go-Lander was to be the server side \nimplementation of Lander, which would compile to JavaScript Lander components augmented with WASM code. \n\nGo-lander has since been fully rewritten and optimized, and it has lost any link to Lander in the process. The two \nlibraries are not intended to become compatible or use one another. If anything, I would be more likely to turn \nlander into a Web Component utility for creating Go-Lander components rather than having the two work together.\n\nIf you want a better and actually finished version of Lander, please check out [go-lander](https://github.com/Minivera/go-lander).\nGo-Lander is not production ready however, WASM support in Golang is still experimental and unstable. Use at your \nown risk.\n\n## Why \"Lander\"?\n\nBecause it makes landing pages.","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fminivera%2Flander","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fminivera%2Flander","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fminivera%2Flander/lists"}