parkpro5

Nexacro Dom Access — Data skill for Claude Code

Data community

Read data from Nexacro-rendered (canvas-based) web pages via DOM internals instead of vision/screenshots.

How to install Nexacro Dom Access

This entry records only its repository, not the path inside it, so there is no exact command to give. Open parkpro5/nexacro-dom-access and copy the folder into ~/.claude/skills/, or the file into ~/.claude/agents/.

What Nexacro Dom Access does

Read data from Nexacro-rendered (canvas-based) web pages via DOM internals instead of vision/screenshots. A Claude Code skill + standalone technique.

Alternatives in Data

  • n8n Code JavaScript — JavaScript in n8n Code nodes with data access patterns 3.6k ★
  • Skill Content Pipeline — Extract patterns and anatomy from URLs — use to reverse-engineer content strategies from live pages 2.8k ★
  • Portaljs Architect — Recommend a data-portal architecture (storage, compute, catalog, access, hosting, metadata) from your needs, t 2.3k ★

README

nexacro-dom-access

A [Claude skill](https://code.claude.com/docs/en/skills) — and a standalone technique — for reading data out of **Nexacro**-rendered web pages via the framework's internal JS objects, instead of screenshots + vision.

Nexacro is a Korean enterprise UI framework used widely in Korean government and public-sector systems — HR/payroll portals, municipal admin systems, training/education management systems, procurement systems, and similar 행정/업무포털 sites. It draws its entire UI onto a canvas element, so standard DOM scraping (`innerText`, `querySelector`, BeautifulSoup, ...) finds nothing, and a screenshot-and-ask-a-vision-model approach — while it works — is slow (one model call per screen) and quietly unreliable: text that's visually clipped by a narrow column gets read clipped, columns scrolled off-screen can't be read at all, and re-scrolling to see more rows can invalidate what you already read.

None of that is necessary. The data was never gone — it's sitting in an ordinary JavaScript object that Nexacro's own rendering code reads before it paints anything. This repo documents how to reach that object directly.

The core idea

Nexacro attaches an internal reference — literally named `_linked_element` — to the DOM element hosting each rendered component. Follow it, and you're no longer in the DOM; you're in the framework's own private object graph, which holds the real, un-clipped, scroll-independent data:

const fw = document.getElementById('nexaIfm').contentWindow;
const doc = fw.document;

const gridEl = doc.getElementById('');
const grid = gridEl._linked_element.linkedcontrol;
const ds = grid._binddataset;

const colinfos = ds.colinfos;
const cols = Array.from({length: ds.colcount}, (_, i) => colinfos[i]?.columnid || colinfos[i]?.id || i);

const records = ds._viewRecords;
const rows = records.map(rec => {
  const row = {};
  cols.forEach((col, idx) => {
    const v = rec[idx];
    row[col] = (v !=