Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
55 commits
Select commit Hold shift + click to select a range
48e28d3
docs: add gen-2 ideation campaign plan (Project Kaleidoscope)
owengregson Jul 24, 2026
5bf056c
docs: record gen-2 ideation campaign results
owengregson Jul 24, 2026
c4b547e
Merge remote-tracking branch 'origin/main' into codex/traveling-isogl…
owengregson Jul 24, 2026
e8cecb5
docs: plan full traveling isogloss replacement
owengregson Jul 24, 2026
00937be
refactor: make build entropy reproducible
owengregson Jul 24, 2026
4bd2d8e
docs: freeze legacy replacement baseline
owengregson Jul 24, 2026
dd4312b
feat: establish canonical semantic IR
owengregson Jul 24, 2026
74bf717
feat: emit canonical control-flow graphs
owengregson Jul 24, 2026
0f0a867
docs: redesign isogloss for dynamic resistance
owengregson Jul 24, 2026
9c9d88f
docs: evolve BPRF with semantic holography
owengregson Jul 24, 2026
5d9c58f
test: establish dynamic instrumentation baseline
owengregson Jul 25, 2026
129d19f
feat: delimit canonical effect regions
owengregson Jul 25, 2026
589e995
feat: add poly-ontology BPRF reference kernel
owengregson Jul 25, 2026
fa566f9
feat: spike moving-cover custodied CSH
owengregson Jul 25, 2026
0f9b376
docs: record initial BPRF CSH spike
owengregson Jul 25, 2026
1a28374
feat: specialize BPRF spike source
owengregson Jul 25, 2026
e1dfc99
feat: custody a moving-cover chart relation
owengregson Jul 25, 2026
6943ad9
test: reject weak BPRF CSH spike
owengregson Jul 25, 2026
2350fcc
feat: bind stateful masked CSH custody
owengregson Jul 25, 2026
f6af269
feat: lower bounded canonical pure regions
owengregson Jul 25, 2026
3c6759a
feat: specialize BPRF over moving covers
owengregson Jul 25, 2026
0692251
docs: record BPRF CSH no-go evidence
owengregson Jul 25, 2026
9e424bb
fix: domain-separate masked custody sessions
owengregson Jul 25, 2026
1ff8bcc
test: attack statefully masked custody
owengregson Jul 25, 2026
8f75b5c
docs: separate custody secrecy from oracle learning
owengregson Jul 25, 2026
1abba7a
feat: pad masked custody transcript epochs
owengregson Jul 25, 2026
3af0693
feat: plan pure regions and call boundaries
owengregson Jul 25, 2026
972abbd
docs: checkpoint masked custody qualification
owengregson Jul 25, 2026
b74a0f5
feat: gate Isogloss deployment boundaries
owengregson Jul 25, 2026
8397371
fix: remove masked placement epoch bias
owengregson Jul 25, 2026
9d0597f
test: score padded custody transcripts
owengregson Jul 25, 2026
2890436
feat: gate custody on proven calls and learnability
owengregson Jul 25, 2026
16eeadb
docs: qualify padded custody and oracle gates
owengregson Jul 25, 2026
8a2aa01
feat: lower guarded source regions into Isogloss
owengregson Jul 25, 2026
8d24751
fix: forbid exposed source-region fallbacks
owengregson Jul 25, 2026
de05afe
feat: discover guarded Isogloss source sites
owengregson Jul 25, 2026
f6ed7a0
feat: emit scalarized local BPRF source
owengregson Jul 25, 2026
0323f9c
feat: replace VM options with Isogloss profiles
owengregson Jul 25, 2026
bf5f62f
feat: execute guarded source regions through Isogloss
owengregson Jul 25, 2026
f628c2f
feat: freeze fail-closed Isogloss product plans
owengregson Jul 25, 2026
5beb405
feat: cut public execution over to Isogloss
owengregson Jul 25, 2026
a8e74fc
refactor: delete legacy VM runtime
owengregson Jul 25, 2026
70e8920
refactor: remove bytecode encoding backend
owengregson Jul 25, 2026
c14d45b
test: qualify public Isogloss cutover
owengregson Jul 25, 2026
59e4122
test: retire legacy VM execution suites
owengregson Jul 25, 2026
73b0508
docs: replace VM guide with Isogloss contract
owengregson Jul 25, 2026
e2ead09
refactor: make canonical compiler backend-free
owengregson Jul 25, 2026
c939001
feat: migrate web experience to Isogloss
owengregson Jul 25, 2026
d9501ab
fix: freeze source ingress before step references
owengregson Jul 25, 2026
149c231
docs: scope directory protection example
owengregson Jul 25, 2026
358dfbb
feat: replace CLI and package identity with Isogloss
owengregson Jul 25, 2026
0c44d66
build: replace legacy manifests and benchmarks
owengregson Jul 25, 2026
dddf1e8
fix: isolate product transcript classes from references
owengregson Jul 25, 2026
12e18bd
ci: retire legacy stats pipeline
owengregson Jul 25, 2026
02c481d
test: budget attacker gate for shared CI
owengregson Jul 25, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 2 additions & 14 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ concurrency:

jobs:
build-and-test:
name: Build, Test & Stats
name: Build & Test
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
Expand All @@ -42,25 +42,13 @@ jobs:
- run: bun run build:lib
- run: bun run typecheck
- run: bun run test
- run: bun run stats

- uses: actions/upload-artifact@v4
if: github.ref == 'refs/heads/main'
with:
name: stats
path: packages/ruam/stats.json

# Publish stats.json to GitHub Pages alongside the Next.js site
- name: Copy stats.json into site
if: github.ref == 'refs/heads/main'
run: cp packages/ruam/stats.json apps/web/public/stats.json

# Build browser worker bundle for the playground
- name: Build browser worker bundle
if: github.ref == 'refs/heads/main'
run: bun run build:worker

- name: Build site with stats
- name: Build site
if: github.ref == 'refs/heads/main'
run: bun run build:web

Expand Down
7 changes: 1 addition & 6 deletions .github/workflows/deploy.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,6 @@ on:
paths:
- 'apps/web/**'
- '.github/workflows/deploy.yml'
paths-ignore:
- 'packages/ruam/**'

concurrency:
group: deploy-pages
Expand Down Expand Up @@ -36,12 +34,9 @@ jobs:

- run: bun install

# Build ruam + collect stats so the site always includes stats.json
# Build and verify Ruam before bundling the playground.
- run: bun run build:lib
- run: bun run test
- run: bun run stats
- name: Copy stats.json into site
run: cp packages/ruam/stats.json apps/web/public/stats.json

# Build browser worker bundle for the playground
- name: Build browser worker bundle
Expand Down
849 changes: 307 additions & 542 deletions README.md

Large diffs are not rendered by default.

6 changes: 2 additions & 4 deletions apps/web/app/layout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,13 @@ import type { Metadata } from "next";
import { config } from "@fortawesome/fontawesome-svg-core";
import "@fortawesome/fontawesome-svg-core/styles.css";
import "./globals.css";
import SiteProtection from "@/components/SiteProtection";

config.autoAddCss = false;

export const metadata: Metadata = {
title: "Ruam: JavaScript VM Obfuscation",
title: "Ruam: Isogloss JavaScript Protection",
description:
"Compile JavaScript functions into encrypted custom bytecode executed by an embedded virtual machine. Open-source. Per-build unique. No deobfuscator exists.",
"Replace guarded pure JavaScript source regions with diversified scalar Isogloss realizations, with explicit local, custody, private-function, and attested deployment profiles.",
icons: {
icon: `${process.env.NEXT_PUBLIC_BASE_PATH}/ruam.svg`,
},
Expand All @@ -35,7 +34,6 @@ export default function RootLayout({
/>
</head>
<body className="noise font-body antialiased">
<SiteProtection />
{children}
</body>
</html>
Expand Down
23 changes: 1 addition & 22 deletions apps/web/app/page.tsx
Original file line number Diff line number Diff line change
@@ -1,37 +1,16 @@
import { readFileSync } from "fs";
import { join } from "path";
import Navbar from "@/components/Navbar";
import Hero from "@/components/Hero";
import CodeShowcase from "@/components/CodeShowcase";
import PipelineFlow from "@/components/PipelineFlow";
import GetStarted from "@/components/GetStarted";
import Footer from "@/components/Footer";

function loadHeroSnippet() {
try {
const statsPath = join(
process.cwd(),
"..",
"..",
"packages",
"ruam",
"stats.json"
);
const stats = JSON.parse(readFileSync(statsPath, "utf-8"));
return stats.heroSnippet ?? null;
} catch {
return null;
}
}

export default function Home() {
const heroSnippet = loadHeroSnippet();

return (
<>
<Navbar />
<main>
<Hero snippet={heroSnippet} />
<Hero />
<CodeShowcase />
<PipelineFlow />
<GetStarted />
Expand Down
2 changes: 1 addition & 1 deletion apps/web/app/playground/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import Footer from "@/components/Footer";
export const metadata: Metadata = {
title: "Playground — Ruam",
description:
"Try Ruam in your browser. Paste JavaScript, pick a preset, and see the obfuscated output instantly.",
"Define guarded input domains for a pure JavaScript source region and compile it with Ruam's complete-local Isogloss profile.",
};

export default function PlaygroundPage() {
Expand Down
89 changes: 48 additions & 41 deletions apps/web/components/CodeShowcase.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -22,25 +22,29 @@ function generateLines(): string[] {
.padStart(2, "0");
const vars = "QWXvjmpRTHkNceFd".split("");
const pick = () => vars[Math.floor(Math.random() * vars.length)];
const realization = `_${hex()}${hex()}`;
const contribution = `_${hex()}${hex()}`;
const left = pick();
const right = pick();
return [
`var _ru4m=!0;(function(${pick()},${pick()}){`,
`const ${pick()}=${pick()}();while(!!1){try{`,
`const ${pick()}=parseInt('0x${hex()}')/0x1`,
`+parseInt('0x${hex()}')*0x3;if(${pick()})`,
`break;else ${pick()}['push'](${pick()}`,
`['shift']())}})(0x${hex()}${hex()},`,
`0x${hex()}${hex()}${hex()});`,
`const ${realization}=(${left},${right})=>{`,
`const ${contribution}=(${left}*${right})`,
`+(${left}*2);`,
`return ${contribution};`,
`};`,
`// realization ${hex()} · scalar slots`,
`return ${realization}(${left},${right});`,
];
}

const PLACEHOLDER_LINES = [
"var _ru4m=!0;(function(Q,W){",
"const X=Z();while(!!1){try{",
"const v=parseInt('0xae')/0x1",
"+parseInt('0x7b')*0x3;if(v)",
"break;else Q['push'](Q",
"['shift']())}})(0xa1b2,",
"0xc3d4e5);",
"const _a7f3=(Q,W)=>{",
"const _c912=(Q*W)",
"+(Q*2);",
"return _c912;",
"};",
"// realization 3f · scalar slots",
"return _a7f3(Q,W);",
];

function CompileCard() {
Expand Down Expand Up @@ -99,7 +103,7 @@ function CompileCard() {
</div>
<div>
<h3 className="text-sm font-semibold text-snow">
Unique every time
Diversified realizations
</h3>
<p className="text-xs text-ash">Build #{buildNum}</p>
</div>
Expand All @@ -120,57 +124,58 @@ function CompileCard() {
</button>

<p className="mt-4 text-[12px] leading-relaxed text-smoke">
Same source, different output. Variable names, opcodes, and
encryption seeds all change between builds.
Each build scalarizes physical slots and fragment contributions
into opaque, artifact-derived locals across contextual
realizations.
</p>
</div>
);
}

/* ── Irreversible card ── */
function IrreversibleCard() {
/* ── Source-region replacement card ── */
function RegionReplacementCard() {
return (
<div className="flex h-full flex-col rounded-xl border border-edge bg-ink p-6">
<div className="mb-4 flex items-center gap-3 select-none">
<div className="flex h-10 w-10 items-center justify-center rounded-lg bg-accent/10 text-accent">
<FontAwesomeIcon icon={faLock} className="h-4 w-4" />
</div>
<h3 className="text-sm font-semibold text-snow">
Irreversible
Source-region replacement
</h3>
</div>

<div className="mb-4 flex-1 space-y-3">
<div className="rounded-lg border border-edge bg-void/60 p-3 select-none">
<span className="mb-1 block font-mono text-[10px] font-semibold text-ember uppercase tracking-wider">
Classic Obfuscation
Before
</span>
<code className="font-mono text-[11px] text-smoke">
{"function _0x1a(a,b){ return a*b }"}
</code>
<p className="mt-1 font-mono text-[10px] text-ash">
Flow, variables, and strings can be heavily hidden, but
the logic is inevitably traceable.
A named pure return region uses explicitly guarded
scalar inputs.
</p>
</div>
<div className="rounded-lg border border-accent/15 bg-accent/[0.03] p-3 select-none">
<span className="mb-1 block font-mono text-[10px] font-semibold text-accent uppercase tracking-wider">
Ruam
</span>
<code className="font-mono text-[11px] text-smoke">
{"_vm.call('a7f3',this,[a,b])"}
{"return _a7f3([a,b], context)[0]"}
</code>
<p className="mt-1 font-mono text-[10px] text-accent/70">
The logic is gone, and operations are called to a custom
VM instead of the JS Interpreter.
The selected relation is replaced by scalarized
realizations; no original-relation fallback is embedded.
</p>
</div>
</div>

<p className="text-[12px] leading-relaxed text-smoke">
Your code is compiled away, and the produced RuamVM bytecode
executes the same result as your JS, but in an entirely
different way.
Effectful and unsupported JavaScript stays native. Ruam fails a
configured region closed if its domain or purity proof is
incomplete.
</p>
</div>
);
Expand All @@ -179,7 +184,7 @@ function IrreversibleCard() {
/* ── Instant card ── */
function InstantCard() {
const [copied, setCopied] = useState(false);
const cmd = "npx ruam input.js -o output.js --preset max --target node";
const cmd = "npx ruam input.js -o output.js --target node";

const copy = () => {
navigator.clipboard.writeText(cmd);
Expand Down Expand Up @@ -216,11 +221,11 @@ function InstantCard() {

<div className="mt-3 space-y-2">
{[
"Works with Node.js, Deno, Bun, etc.",
"Supports MV2 & MV3 Browser Extensions",
"Compatible with any framework",
"Customizable obfuscation layers",
"Full project scope",
"Explicit source-region selection",
"Exact boolean or bounded-number domains",
"Frozen deployment profiles",
"No complete fallback in nonlocal modes",
"Native surrounding JavaScript",
].map((item) => (
<div key={item} className="flex items-center gap-2">
<FontAwesomeIcon
Expand All @@ -236,8 +241,9 @@ function InstantCard() {
</div>

<p className="text-[12px] leading-relaxed text-smoke">
One command protects your entire project. No code changes are
necessary to build with Ruam.
Use the local profile for a synchronous complete client, or plan
a custody or attestation boundary explicitly for an incomplete
client.
</p>
</div>
);
Expand All @@ -257,9 +263,10 @@ export default function CodeShowcase() {
Not another name mangler.
</h2>
<p className="mx-auto mt-4 max-w-lg text-base text-smoke">
RuamVM's encrypted bytecode is indistinguishable even to
experienced attackers. To piece together the original logic,
an intruder must first reverse-engineer the RuamVM.
Isogloss changes the representation of selected pure
relations without pretending a complete local client can
keep those relations secret from unrestricted
instrumentation.
</p>
</motion.div>

Expand All @@ -278,7 +285,7 @@ export default function CodeShowcase() {
viewport={{ once: true }}
transition={{ delay: 0.08 }}
>
<IrreversibleCard />
<RegionReplacementCard />
</motion.div>
<motion.div
initial={{ opacity: 0, y: 20 }}
Expand Down
5 changes: 3 additions & 2 deletions apps/web/components/GetStarted.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -145,11 +145,12 @@ export default function GetStarted() {
Your code,
<br />
<span className="text-accent italic">
World Class Protection.
Explicit Protection Boundaries.
</span>
</h2>
<p className="mx-auto mt-4 max-w-md text-base text-smoke">
What are you waiting for?
Start with a guarded pure source region and choose the
Isogloss profile your deployment can actually enforce.
</p>

{/* Install command */}
Expand Down
Loading
Loading