Welcome 👋
Some of Neo's grid columns render a small component in every cell: a progress bar, a country flag, a GitHub avatar. Each column has one method, applyRecordConfigs(config, record), that turns a row's data into that component's configs. The mapping is tiny and untested. It is also exactly what you would change to build your own column.
This is a good first issue for Hacktoberfest 2026. It needs Node.js and a clone of this repository: no Docker, no AI setup.
[!IMPORTANT]
Reserved for first-time Neo.mjs contributors. The maintainer team will not claim, edit, or implement this issue through 2026-10-31. Comment here to claim it, and ask anything on this issue.
Set up once: follow Set up the engine from a clone, including npm run bundle-browser-deps: without it the unit suite selects zero tests.
Where things live
- Sources:
src/grid/column/Progress.mjs, CountryFlag.mjs, GitHubUser.mjs
- New test file:
test/playwright/unit/grid/column/RecordConfigs.spec.mjs
- Pattern to copy:
test/playwright/unit/grid/column/Component.spec.mjs (creating a column with Neo.create() and giving it a dataField). A plain object works as the record for these methods.
What to cover
| Column |
applyRecordConfigs(config, record) returns |
Progress |
{value: record[dataField]} |
CountryFlag |
{countryCode: record[dataField], location: record[contentField]}, where contentField defaults to 'location' |
GitHubUser |
{avatarUrl: record.avatarUrl, username: record.login, fullName}: fullName is record.name, or '' when the name is missing or equals the login |
| all three |
a key passed in config wins over the record-derived one (it is spread last) |
Done when
Out of scope
Rendering inside a real grid, and the components themselves (src/component/Progress.mjs and friends).
While you wait for review
You just pinned one small piece of a multi-threaded application engine: in Neo.mjs your app's code runs inside a web worker, and the main thread only paints. Two things worth ten minutes:
- See the part nobody expects. Run
npm run build-themes -- -n -e dev -t all and npm run server-start, open apps/workstation/, and drag a tab out of the browser window. It becomes its own OS window, still running, with the same component instances and the same worker. Benefits: Introduction explains why that is possible.
- Your coding agent can go much further here. The skills this repository's AI maintainers work with are published on npm as
neo-agent-skills, and they need no Knowledge Base and no Memory Core. With Claude or GPT beside you, the help wanted issues are within reach after this one.
Maintainer notes
Curated under #18985 (Hacktoberfest 2026). Found work: no unit or component spec names these three modules on dev (2026-09-23); the rows follow the three methods line by line.
Live latest-open sweep: the latest 20 open issues at 2026-09-23T14:24Z; no equivalent (applyRecordConfigs: none). A2A: no claim on this scope. Memory Core: no prior decision.
Origin Session ID: 3be453e4-8b04-4865-be62-4cff34f4e0c6
Welcome 👋
Some of Neo's grid columns render a small component in every cell: a progress bar, a country flag, a GitHub avatar. Each column has one method,
applyRecordConfigs(config, record), that turns a row's data into that component's configs. The mapping is tiny and untested. It is also exactly what you would change to build your own column.This is a good first issue for Hacktoberfest 2026. It needs Node.js and a clone of this repository: no Docker, no AI setup.
Set up once: follow Set up the engine from a clone, including
npm run bundle-browser-deps: without it the unit suite selects zero tests.Where things live
src/grid/column/Progress.mjs,CountryFlag.mjs,GitHubUser.mjstest/playwright/unit/grid/column/RecordConfigs.spec.mjstest/playwright/unit/grid/column/Component.spec.mjs(creating a column withNeo.create()and giving it adataField). A plain object works as the record for these methods.What to cover
applyRecordConfigs(config, record)returnsProgress{value: record[dataField]}CountryFlag{countryCode: record[dataField], location: record[contentField]}, wherecontentFielddefaults to'location'GitHubUser{avatarUrl: record.avatarUrl, username: record.login, fullName}:fullNameisrecord.name, or''when the name is missing or equals the loginconfigwins over the record-derived one (it is spread last)Done when
test/playwright/unit/grid/column/RecordConfigs.spec.mjsexists, following the pattern file's setup.test(...)per column, plus the "configwins" row for each.src/.npm run test-unit -- test/playwright/unit/grid/column/RecordConfigs.spec.mjspasses.npm run test-unitpasses.Out of scope
Rendering inside a real grid, and the components themselves (
src/component/Progress.mjsand friends).While you wait for review
You just pinned one small piece of a multi-threaded application engine: in Neo.mjs your app's code runs inside a web worker, and the main thread only paints. Two things worth ten minutes:
npm run build-themes -- -n -e dev -t allandnpm run server-start, openapps/workstation/, and drag a tab out of the browser window. It becomes its own OS window, still running, with the same component instances and the same worker. Benefits: Introduction explains why that is possible.neo-agent-skills, and they need no Knowledge Base and no Memory Core. With Claude or GPT beside you, thehelp wantedissues are within reach after this one.Maintainer notes
Curated under #18985 (Hacktoberfest 2026). Found work: no unit or component spec names these three modules on
dev(2026-09-23); the rows follow the three methods line by line. Live latest-open sweep: the latest 20 open issues at 2026-09-23T14:24Z; no equivalent (applyRecordConfigs: none). A2A: no claim on this scope. Memory Core: no prior decision.Origin Session ID: 3be453e4-8b04-4865-be62-4cff34f4e0c6