2026-10-07 18:40:11 +08:00
<!doctype html>
< html lang = "en" >
< head >
< meta charset = "utf-8" />
< meta name = "viewport" content = "width=device-width, initial-scale=1" />
2026-10-09 21:46:05 +08:00
< title > JavaScript and Electron Analysis — REA</ title >
2026-10-07 18:40:11 +08:00
< meta
name = "description"
content = "Trace a Notes CSV export through a renderer API, preload and IPC handler with REA. Includes downloadable example files and a verified analysis result."
/>
2026-10-10 19:56:37 +08:00
<!-- website:sharing:start -->
2026-10-10 20:12:53 +08:00
<!-- prettier-ignore -->
2026-10-09 21:46:05 +08:00
< link rel = "canonical" href = "https://rea.tools/guides/javascript/" />
2026-10-11 16:12:46 +08:00
<!-- website:languages:start -->
<!-- prettier-ignore -->
< link rel = "alternate" hreflang = "en" href = "https://rea.tools/guides/javascript/" />
<!-- prettier-ignore -->
< link rel = "alternate" hreflang = "zh-CN" href = "https://rea.tools/zh-CN/guides/javascript/" />
<!-- prettier-ignore -->
< link rel = "alternate" hreflang = "zh-TW" href = "https://rea.tools/zh-TW/guides/javascript/" />
<!-- prettier-ignore -->
< link rel = "alternate" hreflang = "ja" href = "https://rea.tools/ja/guides/javascript/" />
<!-- prettier-ignore -->
< link rel = "alternate" hreflang = "ko" href = "https://rea.tools/ko/guides/javascript/" />
<!-- prettier-ignore -->
< link rel = "alternate" hreflang = "tr" href = "https://rea.tools/tr/guides/javascript/" />
<!-- prettier-ignore -->
< link rel = "alternate" hreflang = "ru" href = "https://rea.tools/ru/guides/javascript/" />
<!-- prettier-ignore -->
< link rel = "alternate" hreflang = "vi" href = "https://rea.tools/vi/guides/javascript/" />
<!-- prettier-ignore -->
< link rel = "alternate" hreflang = "th" href = "https://rea.tools/th/guides/javascript/" />
<!-- prettier-ignore -->
< link rel = "alternate" hreflang = "de" href = "https://rea.tools/de/guides/javascript/" />
<!-- prettier-ignore -->
< link rel = "alternate" hreflang = "es" href = "https://rea.tools/es/guides/javascript/" />
<!-- prettier-ignore -->
< link rel = "alternate" hreflang = "fr" href = "https://rea.tools/fr/guides/javascript/" />
<!-- prettier-ignore -->
< link rel = "alternate" hreflang = "uk" href = "https://rea.tools/uk/guides/javascript/" />
<!-- prettier-ignore -->
< link rel = "alternate" hreflang = "pl" href = "https://rea.tools/pl/guides/javascript/" />
<!-- prettier-ignore -->
< link rel = "alternate" hreflang = "pt-BR" href = "https://rea.tools/pt-BR/guides/javascript/" />
<!-- prettier-ignore -->
< link rel = "alternate" hreflang = "ar" href = "https://rea.tools/ar/guides/javascript/" />
<!-- prettier-ignore -->
< link rel = "alternate" hreflang = "fa" href = "https://rea.tools/fa/guides/javascript/" />
<!-- prettier-ignore -->
< link rel = "alternate" hreflang = "id" href = "https://rea.tools/id/guides/javascript/" />
<!-- prettier-ignore -->
< link rel = "alternate" hreflang = "it" href = "https://rea.tools/it/guides/javascript/" />
<!-- prettier-ignore -->
2026-10-14 00:24:04 +03:00
< link rel = "alternate" hreflang = "el" href = "https://rea.tools/el/guides/javascript/" />
<!-- prettier-ignore -->
2026-10-17 23:39:40 +08:00
< link rel = "alternate" hreflang = "ml" href = "https://rea.tools/ml/guides/javascript/" />
<!-- prettier-ignore -->
2026-10-11 16:12:46 +08:00
< link rel = "alternate" hreflang = "x-default" href = "https://rea.tools/guides/javascript/" />
<!-- website:languages:end -->
2026-10-10 20:12:53 +08:00
<!-- prettier-ignore -->
2026-10-09 21:46:05 +08:00
< meta property = "og:type" content = "website" />
2026-10-10 20:12:53 +08:00
<!-- prettier-ignore -->
2026-10-09 21:46:05 +08:00
< meta property = "og:site_name" content = "REA" />
2026-10-10 20:12:53 +08:00
<!-- prettier-ignore -->
< meta property = "og:title" content = "JavaScript and Electron Analysis — REA" />
<!-- prettier-ignore -->
< meta property = "og:description" content = "Trace a Notes CSV export through a renderer API, preload and IPC handler with REA. Includes downloadable example files and a verified analysis result." />
<!-- prettier-ignore -->
2026-10-09 21:46:05 +08:00
< meta property = "og:url" content = "https://rea.tools/guides/javascript/" />
2026-10-10 20:12:53 +08:00
<!-- prettier-ignore -->
< meta property = "og:image" content = "https://rea.tools/assets/social-card.png" />
<!-- prettier-ignore -->
2026-10-09 21:46:05 +08:00
< meta property = "og:image:type" content = "image/png" />
2026-10-10 20:12:53 +08:00
<!-- prettier-ignore -->
2026-10-09 21:46:05 +08:00
< meta property = "og:image:width" content = "1200" />
2026-10-10 20:12:53 +08:00
<!-- prettier-ignore -->
2026-10-09 21:46:05 +08:00
< meta property = "og:image:height" content = "630" />
2026-10-10 20:12:53 +08:00
<!-- prettier-ignore -->
2026-10-09 21:46:05 +08:00
< meta
property = "og:image:alt"
content = "REA — Find out how software works. Reverse engineering with your coding agent."
/>
2026-10-10 20:12:53 +08:00
<!-- prettier-ignore -->
2026-10-09 21:46:05 +08:00
< meta name = "twitter:card" content = "summary_large_image" />
2026-10-10 20:12:53 +08:00
<!-- prettier-ignore -->
< meta name = "twitter:title" content = "JavaScript and Electron Analysis — REA" />
<!-- prettier-ignore -->
< meta name = "twitter:description" content = "Trace a Notes CSV export through a renderer API, preload and IPC handler with REA. Includes downloadable example files and a verified analysis result." />
<!-- prettier-ignore -->
< meta name = "twitter:image" content = "https://rea.tools/assets/social-card.png" />
<!-- prettier-ignore -->
2026-10-09 21:46:05 +08:00
< meta
name = "twitter:image:alt"
content = "REA — Find out how software works. Reverse engineering with your coding agent."
/>
2026-10-10 19:56:37 +08:00
<!-- website:sharing:end -->
2026-10-13 09:21:34 +08:00
<!-- website:theme:start -->
< meta name = "theme-color" content = "#ffffff" />
<!-- Apply the saved theme before styles load, to avoid a flash on navigation. -->
< script src = "../../assets/theme.js" ></ script >
<!-- website:theme:end -->
2026-10-07 18:40:11 +08:00
< link rel = "icon" href = "../../assets/favicon.svg" type = "image/svg+xml" />
< link rel = "stylesheet" href = "../../assets/styles.css" />
< script src = "../../assets/main.js" defer ></ script >
</ head >
2026-10-07 23:50:31 +08:00
< body id = "top" >
2026-10-07 18:40:11 +08:00
< a class = "skip-link" href = "#main" > Skip to content</ a >
2026-10-10 19:56:37 +08:00
<!-- website:header:start -->
2026-10-10 20:12:53 +08:00
<!-- prettier-ignore -->
2026-10-07 18:40:11 +08:00
< header class = "site-header" >
< div class = "container header-inner" >
< a class = "brand" href = "../../" aria-label = "REA home"
>< span class = "brand-name" > REA</ span
2026-10-11 16:12:46 +08:00
>< span class = "brand-caption" data-i18n-skip > Reverse Engineer Anything</ span ></ a
2026-10-07 18:40:11 +08:00
>
< nav class = "navigation" aria-label = "Main navigation" >
2026-10-13 00:51:42 +08:00
< a href = "../../get-started/" class = "nav-start" > Get started</ a >
2026-10-10 13:55:18 +08:00
< a href = "../../showcase/" > Showcases</ a >
2026-10-10 19:56:37 +08:00
< a href = "../../blog/" > Blog</ a >
< a href = "../../guides/" aria-current = "page" > Guides</ a >
< a href = "../../faq/" > FAQ</ a >
2026-10-15 00:21:24 +08:00
< a href = "../../contributors/" > Contributors</ a >
2026-10-07 18:40:11 +08:00
</ nav >
2026-10-09 19:54:28 +08:00
< div class = "header-social" >
2026-10-17 23:39:40 +08:00
< details class = "language-picker" data-i18n-skip >< summary >< span aria-hidden = "true" > 文 / A</ span > < span > English</ span ></ summary >< nav aria-label = "English" >< a href = "../../guides/javascript/" lang = "en" dir = "ltr" data-language = "en" aria-current = "true" > English</ a >< a href = "../../zh-CN/guides/javascript/" lang = "zh-CN" dir = "ltr" data-language = "zh-CN" > 简体中文</ a >< a href = "../../zh-TW/guides/javascript/" lang = "zh-TW" dir = "ltr" data-language = "zh-TW" > 繁體中文</ a >< a href = "../../ja/guides/javascript/" lang = "ja" dir = "ltr" data-language = "ja" > 日本語</ a >< a href = "../../ko/guides/javascript/" lang = "ko" dir = "ltr" data-language = "ko" > 한국어</ a >< a href = "../../tr/guides/javascript/" lang = "tr" dir = "ltr" data-language = "tr" > Türkçe</ a >< a href = "../../ru/guides/javascript/" lang = "ru" dir = "ltr" data-language = "ru" > Русский</ a >< a href = "../../vi/guides/javascript/" lang = "vi" dir = "ltr" data-language = "vi" > Tiếng Việt</ a >< a href = "../../th/guides/javascript/" lang = "th" dir = "ltr" data-language = "th" > ไทย</ a >< a href = "../../de/guides/javascript/" lang = "de" dir = "ltr" data-language = "de" > Deutsch</ a >< a href = "../../es/guides/javascript/" lang = "es" dir = "ltr" data-language = "es" > Español</ a >< a href = "../../fr/guides/javascript/" lang = "fr" dir = "ltr" data-language = "fr" > Français</ a >< a href = "../../uk/guides/javascript/" lang = "uk" dir = "ltr" data-language = "uk" > Українська</ a >< a href = "../../pl/guides/javascript/" lang = "pl" dir = "ltr" data-language = "pl" > Polski</ a >< a href = "../../pt-BR/guides/javascript/" lang = "pt-BR" dir = "ltr" data-language = "pt-BR" > Português (Brasil)</ a >< a href = "../../ar/guides/javascript/" lang = "ar" dir = "rtl" data-language = "ar" > العربية</ a >< a href = "../../fa/guides/javascript/" lang = "fa" dir = "rtl" data-language = "fa" > فارسی</ a >< a href = "../../id/guides/javascript/" lang = "id" dir = "ltr" data-language = "id" > Bahasa Indonesia</ a >< a href = "../../it/guides/javascript/" lang = "it" dir = "ltr" data-language = "it" > Italiano</ a >< a href = "../../el/guides/javascript/" lang = "el" dir = "ltr" data-language = "el" > Ελληνικά</ a >< a href = "../../ml/guides/javascript/" lang = "ml" dir = "ltr" data-language = "ml" > മലയാളം</ a ></ nav ></ details >
2026-10-13 09:21:34 +08:00
< button class = "theme-toggle" type = "button" data-theme-toggle hidden >
< svg class = "theme-moon" width = "20" height = "20" viewBox = "0 0 24 24" fill = "none" stroke = "currentColor" stroke-width = "1.6" stroke-linecap = "round" stroke-linejoin = "round" aria-hidden = "true" focusable = "false" >
< path d = "M20.9 13a9 9 0 0 1-9.9-9.9A9 9 0 1 0 20.9 13Z" />
</ svg >
< svg class = "theme-sun" width = "20" height = "20" viewBox = "0 0 24 24" fill = "none" stroke = "currentColor" stroke-width = "1.6" stroke-linecap = "round" aria-hidden = "true" focusable = "false" >
< circle cx = "12" cy = "12" r = "4" />
< path d = "M12 2v2m0 16v2M2 12h2m16 0h2M4.93 4.93l1.42 1.42m11.3 11.3 1.42 1.42M4.93 19.07l1.42-1.42m11.3-11.3 1.42-1.42" />
</ svg >
</ button >
2026-10-09 19:54:28 +08:00
< a
class = "nav-github"
href = "https://github.com/morluto/rea"
aria-label = "REA on GitHub"
title = "REA on GitHub"
>
< svg
width = "22"
height = "22"
viewBox = "0 0 16 16"
aria-hidden = "true"
focusable = "false"
>
< path
fill = "currentColor"
d = "M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82a7.65 7.65 0 0 1 2-.27c.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.01 8.01 0 0 0 16 8c0-4.42-3.58-8-8-8Z"
/>
</ svg >
< span class = "nav-github-count" hidden aria-hidden = "true" ></ span >
</ a >
< a
class = "nav-discord"
href = "https://discord.gg/GkcryMnJDM"
aria-label = "Join REA on Discord"
title = "Join REA on Discord"
2026-10-09 04:55:51 +08:00
>
2026-10-09 19:54:28 +08:00
< svg
width = "22"
height = "22"
viewBox = "0 0 24 24"
aria-hidden = "true"
focusable = "false"
>
< path
fill = "currentColor"
d = "M20.317 4.3698a19.7913 19.7913 0 0 0-4.8851-1.5152.0741.0741 0 0 0-.0785.0371c-.211.3753-.4447.8648-.6083 1.2495-1.8447-.2762-3.68-.2762-5.4868 0-.1636-.3933-.4058-.8742-.6177-1.2495a.077.077 0 0 0-.0785-.037 19.7363 19.7363 0 0 0-4.8852 1.515.0699.0699 0 0 0-.0321.0277C.5334 9.0458-.319 13.5799.0992 18.0578a.0824.0824 0 0 0 .0312.0561c2.0528 1.5076 4.0413 2.4228 5.9929 3.0294a.0777.0777 0 0 0 .0842-.0276c.4616-.6304.8731-1.2952 1.226-1.9942a.076.076 0 0 0-.0416-.1057c-.6528-.2476-1.2743-.5495-1.8722-.8923a.077.077 0 0 1-.0076-.1277c.1258-.0943.2517-.1923.3718-.2914a.0743.0743 0 0 1 .0776-.0105c3.9278 1.7933 8.18 1.7933 12.0614 0a.0739.0739 0 0 1 .0785.0095c.1202.099.246.1981.3728.2924a.077.077 0 0 1-.0066.1276 12.2986 12.2986 0 0 1-1.873.8914.0766.0766 0 0 0-.0407.1067c.3604.698.7719 1.3628 1.225 1.9932a.076.076 0 0 0 .0842.0286c1.961-.6067 3.9495-1.5219 6.0023-3.0294a.077.077 0 0 0 .0313-.0552c.5004-5.177-.8382-9.6739-3.5485-13.6604a.061.061 0 0 0-.0312-.0286ZM8.02 15.3312c-1.1825 0-2.1569-1.0857-2.1569-2.419 0-1.3332.9555-2.4189 2.157-2.4189 1.2108 0 2.1757 1.0952 2.1568 2.419 0 1.3332-.9555 2.4189-2.1569 2.4189Zm7.9748 0c-1.1825 0-2.1569-1.0857-2.1569-2.419 0-1.3332.9554-2.4189 2.1569-2.4189 1.2108 0 2.1757 1.0952 2.1568 2.419 0 1.3332-.946 2.4189-2.1568 2.4189Z"
/>
</ svg >
</ a >
2026-10-10 00:00:09 -07:00
< a
class = "nav-x"
href = "https://x.com/reatools"
aria-label = "Follow REA on X"
title = "Follow REA on X"
>
< svg
width = "18"
height = "18"
viewBox = "0 0 24 24"
aria-hidden = "true"
focusable = "false"
>
< path
fill = "currentColor"
d = "M18.901 1.153h3.68l-8.04 9.19L24 22.846h-7.406l-5.8-7.584-6.638 7.584H.474l8.6-9.83L0 1.154h7.594l5.243 6.932ZM17.61 20.644h2.039L6.486 3.24H4.298Z"
/>
</ svg >
</ a >
2026-10-09 19:54:28 +08:00
</ div >
2026-10-07 18:40:11 +08:00
</ div >
</ header >
2026-10-10 19:56:37 +08:00
<!-- website:header:end -->
2026-10-07 18:40:11 +08:00
< main id = "main" class = "container" >
< div class = "page-heading" >
< p class = "breadcrumb" >
< a href = "../../" > Home</ a > / < a href = "../" > Guides</ a > / JavaScript
& Electron
</ p >
2026-10-07 23:24:15 +08:00
< h1 > Trace an Electron< br /> CSV export.</ h1 >
2026-10-07 18:40:11 +08:00
< p class = "lede" >
2026-10-07 23:24:15 +08:00
Follow a button click from the page API, through Electron IPC, to the
CSV file writer.
2026-10-07 18:40:11 +08:00
</ p >
</ div >
< div class = "article-layout" >
< nav class = "contents" aria-label = "On this page" >
< p > In this guide</ p >
< ul >
< li >< a href = "#example" > The example</ a ></ li >
< li >< a href = "#ask" > Ask your agent</ a ></ li >
2026-10-07 23:24:15 +08:00
< li >< a href = "#follow" > Trace the export code</ a ></ li >
2026-10-07 18:40:11 +08:00
< li >< a href = "#try" > Try the example</ a ></ li >
2026-10-07 23:24:15 +08:00
< li >< a href = "#next" > Inspect the CSV writer</ a ></ li >
2026-10-07 18:40:11 +08:00
</ ul >
</ nav >
< article class = "article" aria-label = "JavaScript & Electron" >
< section class = "article-section" id = "example" >
< h2 > Where does “Export notes” go?</ h2 >
< p >
This guide uses a small Electron app. Clicking
< strong > Export notes</ strong > calls an API in the page, crosses
into the main process, and writes a CSV. The behavior is spread
across several files.
</ p >
< figure class = "workflow-figure" >
2026-10-07 23:24:15 +08:00
< p class = "figure-title" >
The CSV export across Electron processes
</ p >
2026-10-07 18:40:11 +08:00
< ol class = "flow-steps" >
< li >
< span class = "flow-label" > Renderer → preload</ span
>< span class = "flow-node" >< code > notes.exportCsv()</ code ></ span
>< span class = "flow-note"
>< code > renderer.js</ code > calls the API exposed by
< code > preload.js</ code > .</ span
>
</ li >
< li >
< span class = "flow-label" > Between processes</ span
>< span class = "flow-node" >< code > notes:export</ code ></ span
>< span class = "flow-note"
> The preload invokes an IPC channel: a named message to the
main process.</ span
>
</ li >
< li >
< span class = "flow-label" > Main process</ span
>< span class = "flow-node" > An export handler</ span
>< span class = "flow-note"
>< code > main.js</ code > handles that channel and calls the CSV
writer.</ span
>
</ li >
</ ol >
< p class = "flow-result" >
< code > csv.js</ code > formats the notes →
< code > main.js</ code > writes < code > downloads/notes.csv</ code > .
</ p >
< figcaption >
REA matches the literal IPC call to its handler and identifies
the exposed API. The path is inferred from code; a runtime
capture can check what executes.
</ figcaption >
</ figure >
</ section >
< section class = "article-section" id = "ask" >
2026-10-07 23:24:15 +08:00
< h2 > Ask about the CSV export</ h2 >
2026-10-07 18:40:11 +08:00
< p >
< a href = "../../get-started/#agent" > Connect your agent to REA</ a >
and give it the app directory or ASAR file:
</ p >
< div class = "agent-terminal" >
< div class = "terminal-header" >
< span class = "terminal-title"
>< span class = "terminal-dots" aria-hidden = "true"
>< i ></ i >< i ></ i >< i ></ i ></ span
> Your coding agent</ span
>< button
class = "copy-button"
type = "button"
data-copy = "javascript-prompt"
aria-label = "Copy example prompt"
>
Copy
</ button >
</ div >
< p class = "terminal-prompt" >
< span class = "prompt-symbol" aria-hidden = "true" > › </ span
>< span id = "javascript-prompt"
> Use REA to find what happens when I export notes in this app.
Where is the CSV created?</ span
>< span class = "terminal-cursor" aria-hidden = "true" ></ span >
</ p >
</ div >
< p class = "caption" >
Example prompt. Include the absolute path to the application
folder or < code > app.asar</ code > .
</ p >
< p >
REA reads the application files and builds a map of entrypoints,
modules and process boundaries. Your agent uses that map to narrow
the investigation to the export feature.
</ p >
</ section >
< section class = "article-section" id = "follow" >
2026-10-07 23:24:15 +08:00
< h2 > Trace the export code</ h2 >
2026-10-07 18:40:11 +08:00
< h3 > The page calls a small API</ h3 >
< div class = "code-block" >
< div class = "code-header" >
2026-10-11 16:12:46 +08:00
< span
>< span translate = "no" > renderer.js</ span > · example
source</ span
>
2026-10-07 18:40:11 +08:00
</ div >
< pre >< code > document.querySelector(" #export" ).addEventListener(" click" , async () => {
const destination = await window.notes.exportCsv();
document.querySelector(" #status" ).textContent = `Saved to ${destination}`;
});</ code ></ pre >
</ div >
< p >
The page knows the method name. The implementation lives in the
preload, which exposes it to the renderer.
</ p >
< div class = "code-block" >
< div class = "code-header" >
2026-10-11 16:12:46 +08:00
< span
>< span translate = "no" > preload.js</ span > · example source</ span
>
2026-10-07 18:40:11 +08:00
</ div >
< pre >< code > contextBridge.exposeInMainWorld(" notes" , {
exportCsv: () => ipcRenderer.invoke(" notes:export" ),
});</ code ></ pre >
</ div >
< p >
REA records < code > notes.exportCsv</ code > and the literal channel
< code > notes:export</ code > . It pairs that invocation with the
single matching handler in the main process.
</ p >
< div class = "code-block" >
< div class = "code-header" >
2026-10-11 16:12:46 +08:00
< span
>< span translate = "no" > main.js</ span > · example source</ span
>
2026-10-07 18:40:11 +08:00
</ div >
< pre >< code > ipcMain.handle(" notes:export" , () => {
const destination = path.join(app.getPath(" downloads" ), " notes.csv" );
writeFileSync(destination, toCsv(notes), " utf8" );
return destination;
});</ code ></ pre >
</ div >
< p >
Reading the handler answers the original question:
< code > csv.js</ code > formats the notes, and the main process writes
< code > notes.csv</ code > into the user's Downloads folder.
</ p >
< div class = "code-block" >
< div class = "code-header" >
< span > REA result · summary.ipc excerpt</ span >
</ div >
< pre >< code > {
" literal_channels" : 1,
" renderer_transmissions" : 1,
" main_handlers" : 1,
" paired_renderer_transmissions" : 1,
" ambiguous_renderer_transmissions" : 0
}</ code ></ pre >
</ div >
< p class = "caption" >
Recorded by REA 4.1.0 on the downloadable example below. Source
locations accompany the API, channel and handler findings.
</ p >
</ section >
< section class = "article-section" id = "try" >
< h2 > Analyze the example yourself</ h2 >
< p >
2026-10-07 20:59:56 +08:00
Download the example and unzip it. The archive contains the
complete < code > notes-example</ code > folder. Analyze it with
2026-10-11 16:12:46 +08:00
< span translate = "no" > Node.js</ span > and npm; Electron is not
needed for this example.
2026-10-07 18:40:11 +08:00
</ p >
2026-10-07 20:59:56 +08:00
< p >
< a
class = "button"
href = "../../examples/notes-example.zip"
download = "notes-example.zip"
> Download example ZIP</ a
>
</ p >
< details class = "evidence-details" >
< summary > Browse the six source files</ summary >
< ul class = "example-files" >
< li >
< a href = "../../examples/notes-electron/package.json" download
2026-10-11 16:12:46 +08:00
>< span translate = "no" > package.json</ span ></ a
2026-10-07 20:59:56 +08:00
>
</ li >
< li >
< a href = "../../examples/notes-electron/main.js" download
2026-10-11 16:12:46 +08:00
>< span translate = "no" > main.js</ span ></ a
2026-10-07 20:59:56 +08:00
>
</ li >
< li >
< a href = "../../examples/notes-electron/preload.js" download
2026-10-11 16:12:46 +08:00
>< span translate = "no" > preload.js</ span ></ a
2026-10-07 20:59:56 +08:00
>
</ li >
< li >
< a href = "../../examples/notes-electron/renderer.js" download
2026-10-11 16:12:46 +08:00
>< span translate = "no" > renderer.js</ span ></ a
2026-10-07 20:59:56 +08:00
>
</ li >
< li >
< a href = "../../examples/notes-electron/csv.js" download
2026-10-11 16:12:46 +08:00
>< span translate = "no" > csv.js</ span ></ a
2026-10-07 20:59:56 +08:00
>
</ li >
< li >
< a href = "../../examples/notes-electron/index.html" download
2026-10-11 16:12:46 +08:00
>< span translate = "no" > index.html</ span ></ a
2026-10-07 20:59:56 +08:00
>
</ li >
</ ul >
</ details >
2026-10-07 18:40:11 +08:00
< div class = "code-block" >
< div class = "code-header" >
< span > Static application analysis</ span
>< button
class = "copy-button"
type = "button"
data-copy = "javascript-command"
aria-label = "Copy static application analysis"
>
Copy
</ button >
</ div >
< pre >< code id = "javascript-command" > npx -y rea-agents@latest analyze-javascript-application \
/absolute/path/to/notes-example --json</ code ></ pre >
</ div >
< p >
2026-10-07 23:24:15 +08:00
Replace the path with the folder you unzipped. You should find one
IPC channel and one matching handler in
< code > normalized_result.summary.ipc</ code > . Source locations are
in < code > normalized_result.graph</ code > .
2026-10-07 18:40:11 +08:00
</ p >
< p >
For your own app, use the same command with its directory or ASAR
path. An agent can follow a literal string, API name or IPC
channel with REA's feature tracing tools.
</ p >
</ section >
< section class = "article-section" id = "next" >
2026-10-07 23:24:15 +08:00
< h2 > Inspect the CSV writer</ h2 >
2026-10-07 18:40:11 +08:00
< blockquote class = "prompt" >
< p >
Follow < code > notes:export</ code > to its handler. Which inputs
reach the CSV writer, and what happens if writing the file
fails?
</ p >
</ blockquote >
< p >
Use the source locations to inspect those details. Computed
channel names and ambiguous handlers can remain unresolved;
runtime observations give you another way to investigate them.
</ p >
< ul class = "reading-list" >
2026-10-07 20:59:56 +08:00
< li >
< a href = "../../showcase/notion/"
> Follow Notion's clipboard bridge</ a
>
< span > Apply the same approach to a packaged Electron app.</ span >
</ li >
2026-10-07 18:40:11 +08:00
< li >
< a href = "../browser/" > Observe a browser export</ a
>< span
> Capture a real click and see which request it makes.</ span
>
</ li >
< li >
< a href = "../native/" > Follow a native function</ a
>< span
> Continue into a binary when a feature depends on native
code.</ span
>
</ li >
</ ul >
</ section >
</ article >
</ div >
</ main >
2026-10-10 19:56:37 +08:00
<!-- website:footer:start -->
2026-10-10 20:12:53 +08:00
<!-- prettier-ignore -->
2026-10-07 18:40:11 +08:00
< footer class = "site-footer" >
< div class = "container footer-inner" >
< p > REA · Reverse Engineer Anything</ p >
< div class = "footer-links" >
2026-10-15 00:21:24 +08:00
< a href = "../../contributors/" > Contributors</ a
>< a href = "https://github.com/morluto/rea" > Source</ a
2026-10-10 20:12:53 +08:00
>< a href = "https://github.com/morluto/rea/blob/main/LICENSE" > MIT license</ a
2026-10-10 00:00:09 -07:00
>< a href = "https://discord.gg/GkcryMnJDM" > Join the community</ a
>< a href = "https://x.com/reatools" > Follow us on X</ a >
2026-10-07 18:40:11 +08:00
</ div >
</ div >
</ footer >
< p class = "sr-only" id = "copy-status" role = "status" aria-live = "polite" ></ p >
2026-10-07 23:50:31 +08:00
< a class = "back-to-top" href = "#top" aria-label = "Back to top" >
< span aria-hidden = "true" > ↑</ span > Top
</ a >
2026-10-10 19:56:37 +08:00
<!-- website:footer:end -->
2026-10-07 18:40:11 +08:00
</ body >
</ html >