Nick — 2026-07-19 14:12:34
I would have paid a lot of money for this a decade ago:
http://xqx1.com:8080
Paste the following into the console there, to see some simple example apps run:
do http://com-pute.com/nick/demo.r3
Those are all demos from the first section of the tutorial at https://learnrebol.com/rebol3_book.html . Everything there runs correctly, including all the draw and GUI examples (the fish catch game even plays correctly), all network reads from http URLs, reads and writes to the browser based file system, etc.
The complete interpreter compiled for WASM, ready to install and run on any common OS, is available at:
https://com-pute.com/nick/r3-wasm-runtime.zip
The full build kit is available at:
https://com-pute.com/nick/r3-wasm-buildkit-v2.tar.gz
I don't have any time to support this (won't be using it for any work), but if you want to explore doing more with it, you can be sure that any help you need is available via either Fable or Kimi K3 :)
Here's an HTML transcript of the full Fable session:
https://com-pute.com/nick/fable-r3-wasm-conversation-transcript.html
And here's an HTML transcript of all the work that was attempted by Deepseek V4 Pro (lots of messy attempts), and then completed by Kimi K3:
https://com-pute.com/nick/pi-session-2026-07-19T01-52-34-303Z_019f7813-3bfe-7046-82f9-c55c38909e5f.html
That work was finished in a single session running on the http://xqx1.com VPS server.
Nick — 2026-07-19 14:16:24
My girlfriend had a day left of rate-limited Fable usage left on her $20/month Claude account, which would have otherwise gone to waste, so I uploaded the source code to my old Android version of R3 with View, and let it cook on building a version that runs entirely in the browser. Surprisingly, it mostly worked first shot, after hitting Fable's rate limit a few times.
I asked Fable for a source code package and a prompt to paste into Pi on one of my VPS accounts, to get it compiled and working. Right out of the gate, the interpreter mostly worked in the browser, but none of the GUI examples ran.
So I let Deepseek V4 Pro hack at it for a while, and it actually did get some GUIs to display partially, but Deepseek ran into lots of issues and got stuck over and over. So I switched the model in Pi to Kimi K3 before going to bed - and woke up to a fully functioning version of Rebol 3 with View running in the browser.
I tested a few scripts from https://learnrebol.com/rebol3_book.html and quickly realized that networking calls (read) weren't functioning correctly. Kimi K3 took less than a minute to get that worked out. Then I noticed alerts in the UI weren't working. K3 got them going with a prompt.
The most impressive thing about this build was how deeply Fable and Kimi K3 understood everything about R3 code, not just the compiled source code, but everything about the deep roots of the REBOL language, all the way up through not only Rebol code/data structures, but also dialects.
These LLM models are not trained on much about Rebol, so there was an enormous amount of genuine novel exploration, powerful reasoning and in-context learning going on during this process. Deepseek did an admirable job for what it costs, but it struggled and I got tired of waiting during the Fable rate limit pauses, so just sicked Kimi K3 on the remaining issues. Beyond the rate-limited use of Fable, which would have otherwise been wasted, the total cost to get this project up and running to the point where it stands now, was $3.88 - mostly for the K3 tokens on OpenRouter.
It was awesome to watch Fable and Kimi K3 work - they're absolute beasts.
ONE NOTE: 'load-gui is built into the interpreter and functioning. To run the examples at https://learnrebol.com/rebol3_book.html , run 'load-gui' at the beginning of a browser session, instead of the 'do %r3-gui.r3' line in the code demos from the tutorial. Just take a look at http://com-pute.com/nick/demo.r3 as an example.
Nick — 2026-07-19 14:30:17
Here's a console history from the browser interface for some demo examples:
**************************************************************************
** **
** REBOL 3.0 [Alpha Test] **
** **
** Copyright: 2026 REBOL Technologies **
** All rights reserved. **
** Website: www.REBOL.com **
** **
** Version: 2.101.0.4.4 **
** Platform: Linux libc6-2-11-x86 **
** Build: 19-Jul-2026/5:30:18 **
** Warning: For testing purposes only. Use at your own risk. **
** **
** Language: English **
** Locale: United States **
** Home: / **
** **
**************************************************************************
SECURE is disabled
Important notes:
* Sandbox and security are not available.
* Direct access to TCP HTTP required (no proxies).
* Default web browser must be available.
Special functions:
Chat - open DevBase developer forum/BBS
Docs - open DocBase document wiki (web)
Bugs - open CureCode bug database (web)
Demo - run demo launcher (from saphirion.com)
Help - show built-in help information
Upgrade - check for newer releases
Changes - what's new about this version (web)
>> load-gui view [text "Hello World!"]
Loading bundled R3-GUI...
Script: "R3-GUI" Version: 4988 Date: 12-Jul-2013/18:51:03.289143
== make gob! [offset: 430x289 size: 85x21 alpha: 255 text: "REBOL: untitled"]
>> load-gui view [text "Hello World!"]
Loading bundled R3-GUI...
Script: "R3-GUI" Version: 4988 Date: 12-Jul-2013/18:51:03.289143
== make gob! [offset: 430x289 size: 85x21 alpha: 255 text: "REBOL: untitled"]
>> load-gui view [ field area check radio text-list text-table drop-down button ]
Loading bundled R3-GUI...
Script: "R3-GUI" Version: 4988 Date: 12-Jul-2013/18:51:03.289143
== make gob! [offset: 259.5x6 size: 426x587 alpha: 255 text: "REBOL: untitled"]
>> view [ a: area button "Load" on-action [attempt [set-face a read/string %notes.txt]] button "Save" on-action [write %notes.txt get-face a alert "Saved"] ]
== make gob! [offset: 259.5x165.5 size: 426x268 alpha: 255 text: "REBOL: untitled"]
>> view [ a: area button "Load" on-action [attempt [set-face a read/string %notes.txt]] button "Save" on-action [write %notes.txt get-face a alert "Saved"] ]
== make gob! [offset: 259.5x165.5 size: 426x268 alpha: 255 text: "REBOL: untitled"]
>> view [ f: field "49.99" t: field ".20" on-action [ set-face x (to-decimal get-face f) * (1 + (to-decimal get-face t)) ] x: title "Total: " ]
== make gob! [offset: 402.5x255 size: 140x89 alpha: 255 text: "Total: "]
>> d: ["March" 13 "April" 9 "May" 21 "June" 29 "July" 10] g: [] foreach [m v] d [append g reduce ['button m v * 10]] view g
view [ text-table ["Text" 100 "Dates" 200 "Numbers"] [ ["abcd" 1-jan-2013 44] ["bdac" 27-may-2013 4 ] ["dcab" 13-aug-2014 5 ] ] ]
== make gob! [offset: 322.5x224.5 size: 300x150 alpha: 255 text: "REBOL: untitled"]
>> view [ text-table ["Text" 100 "Dates" 200 "Numbers"] [ ["abcd" 1-jan-2013 44] ["bdac" 27-may-2013 4 ] ["dcab" 13-aug-2014 5 ] ] ]
== make gob! [offset: 234.5x234.5 size: 476x130 alpha: 255 text: "REBOL: untitled"]
>> webdata: load to-string read http://learnrebol.com/griddata.cgi view [text-table ["Text" 100 "Dates" 200 "Numbers"] (webdata)]
** Access error: protocol error: "Server error: HTTP/1.1 500 Internal Server Error"
>> ; that was because webdata: load to-string read http://learnrebol.com/griddata.cgi view [text-table ["Text" 100 "Dates" 200 "Numbers"] (webdata)] is returning a 500 error
>> random/seed now/time print {content-type: text/html^/} data: copy {} loop 100 [ append data rejoin [ "[" mold random "abcd" " " random now/date " " random 100 "]" ] ] print data
content-type: text/html
["cabd" 15-Apr-1103 55]["cabd" 27-Feb-0392 77]["bdca" 6-Nov-1975 100]["bdac" 4-Oct-0791 62]["abdc" 2-Jul-1903 41]["abdc" 29-Dec-0507 94]["bcda" 21-Oct-0230 98]["adcb" 19-Apr-1817 27]["dcab" 10-Oct-0535 37]["abdc" 19-Jun-1501 42]["abdc" 29-Mar-0913 59]["badc" 18-Sep-0376 71]["bacd" 27-Jan-1951 53]["acdb" 5-Dec-0433 92]["dcba" 29-Mar-1976 45]["dbca" 12-Apr-1934 83]["bdac" 24-Jun-1729 61]["badc" 1-Mar-1504 1]["cdba" 17-Sep-0823 48]["dcab" 10-Nov-0295 5]["dcab" 28-Dec-0952 94]["cdab" 12-Oct-0383 5]["bdac" 24-Dec-0844 79]["adbc" 6-Oct-0874 94]["dcba" 11-Oct-1827 53]["abdc" 12-Mar-1276 30]["abdc" 21-May-0019 90]["cbad" 4-Aug-1050 38]["dcab" 20-Jul-0186 84]["dcab" 27-Jun-0316 1]["dbac" 3-Jan-0427 40]["adbc" 31-Oct-0521 2]["bacd" 9-Feb-0651 19]["cadb" 9-Feb-0468 43]["cabd" 9-May-1314 32]["badc" 25-Apr-0039 1]["cbda" 21-Feb-0605 13]["abcd" 9-Nov-1700 10]["adbc" 31-Jan-0779 39]["bcad" 9-Jul-0914 31]["acdb" 10-Oct-0498 57]["dcba" 6-Jul-1426 100]["dbac" 2-Jul-1591 52]["cadb" 12-Aug-1145 9]["acdb" 22-Mar-0231 73]["badc" 6-Nov-0730 51]["acbd" 12-Feb-0425 38]["dabc" 3-Dec-1545 42]["adbc" 6-Jan-0895 43]["bdca" 6-Mar-1740 19]["dbac" 8-Jan-0524 100]["dcab" 3-Jan-1489 37]["abcd" 23-Sep-0760 44]["cbda" 10-Apr-1371 21]["cadb" 20-Jul-1122 17]["cadb" 18-Apr-1833 73]["bcda" 18-Nov-0831 30]["bacd" 29-Sep-0167 93]["acdb" 28-Mar-0900 65]["cbda" 27-Nov-1576 37]["abdc" 9-Jan-0711 57]["adbc" 8-Jul-0957 88]["cbad" 28-Nov-0907 23]["cabd" 28-Aug-0226 59]["bdac" 25-Feb-0084 39]["cdab" 14-Sep-0853 70]["dcba" 2-Sep-0839 98]["bcad" 18-Jun-0573 37]["acbd" 2-Apr-1688 34]["cbad" 26-Dec-1528 44]["bdac" 17-Dec-0197 41]["bcad" 29-May-1740 66]["cabd" 28-Jul-0349 13]["cabd" 2-May-0417 70]["badc" 14-Sep-0460 50]["cdab" 6-Dec-0592 63]["cdab" 21-Feb-1984 55]["bacd" 30-Dec-0328 43]["acdb" 25-Sep-0210 63]["cbda" 4-Mar-0821 53]["bacd" 2-May-1299 59]["adbc" 31-Aug-0973 19]["cbda" 30-Jan-1985 51]["abdc" 29-Sep-1090 21]["bcda" 6-Jan-1201 81]["bdac" 14-May-1877 82]["adcb" 11-Apr-1457 17]["dcba" 17-Aug-0175 79]["abcd" 29-Aug-1676 33]["cbad" 7-Jan-1080 91]["bcda" 10-Nov-1034 86]["cbad" 16-May-0408 61]["dabc" 7-Jun-0531 87]["bdca" 4-Jun-0131 34]["cbad" 7-Aug-0851 97]["abcd" 6-Apr-1168 1]["dabc" 3-Aug-0509 91]["dacb" 25-Dec-1305 84]["bdca" 5-Apr-1288 69]["dcba" 19-Nov-0703 77]
>> print {content-type: text/html^/} folder: read %./ count: 0 foreach file folder [ foreach ext [".jpg" ".gif" ".png" ".bmp"] [ if find file ext [ print rejoin [{<BR><CENTER><img src="} file {"></CENTER>}] count: count + 1 ] ] ] print join {<BR>Total Images: } count
content-type: text/html
<BR>Total Images: 0
>> print {content-type: text/html^/} url: %./chat.txt submitted: parse (to string! read system/ports/input) "&=" foreach item submitted [replace/all item "+" " "] if submitted/2 <> none [ write/append url rejoin [ now " (" submitted/2 "): " submitted/4 "^/^/" ] ] notes: dehex copy read/string url print rejoin [ "<pre>" notes "</pre>" {<FORM METHOD="POST"> Name:<br> <input type=text size="65" name="username"><br> Message:<br> <textarea name=message rows=5 cols=50></textarea><br> <input type="submit" name="submit" value="Submit"> </FORM>} ]
content-type: text/html
read %chat.txt
<pre>19-Jul-2026/10:05:42-4:00 (%chat.txt): none
</pre><FORM METHOD="POST"> Name:<br> <input type=text size="65" name="username"><br> Message:<br> <textarea name=message rows=5 cols=50></textarea><br> <input type="submit" name="submit" value="Submit"> </FORM>
>> stylize [ p: button [ facets: [init-size: 60x60 max-size: 60x60] actors: [ on-action: [ t: reduce [face/gob/offset x/gob/offset] face/gob/offset: t/2 x/gob/offset: t/1 ] ] ] ] view/options [ hgroup [ p "8" p "7" p "6" return p "5" p "4" p "3" return p "2" p "1" x: box 60x60 white ] ] [bg-color: white]
bck: make image! 400x220 view/no-wait [image bck] draw bck to-draw [ fill-pen 200.100.90 polygon 20x40 200x20 380x40 200x80 fill-pen 200.130.110 polygon 20x40 200x80 200x200 20x100 fill-pen 100.80.50 polygon 200x80 380x40 380x100 200x200 ] copy [] do-events
== make gob! [offset: 369.5x196.5 size: 206x206 alpha: 255 text: "REBOL: untitled"]
>> bck: make image! 400x220 view/no-wait [image bck] draw bck to-draw [ fill-pen 200.100.90 polygon 20x40 200x20 380x40 200x80 fill-pen 200.130.110 polygon 20x40 200x80 200x200 20x100 fill-pen 100.80.50 polygon 200x80 380x40 380x100 200x200 ] copy [] do-events
== none
>> fish: load http://learnrebol.com/r3book/fish2.png s: 0 p: 3 random/seed now/time stylize [ box: box [facets: [max-size: 50x10]] img: image [facets: [max-size: 50x20 min-size: 50x20]] ] view/no-wait/options [ t: text"ARROW KEYS" y: img 50x20 (fish) pad z: box blue ] [ shortcut-keys: [ left [z/gob/offset/1: z/gob/offset/1 - 50 draw-face z] right [z/gob/offset/1: z/gob/offset/1 + 50 draw-face z] ] min-hint: 600x440 bg-color: white ] forever [ wait .02 y/gob/offset/2: y/gob/offset/2 + p draw-face y show-now y if inside? y/gob/offset (z/gob/offset - 49x0) (z/gob/offset + 49x10)[ y/gob/offset: random 550x-20 s: s + 1 set-face t form s p: p + .3 ] if y/gob/offset/2 > 425 [alert join "Score: " s unview unview break] ]
** Script error: path win-gob/data is not valid for none! type
** Where: all unview if forever
** Near: self/all [
window: win-gob/data
handler: select wind...
>> stylize [ btn: button [ facets: [init-size: 50x50] actors: [on-action:[set-face f join get-face f get-face face]] ] ] view [ hgroup [ f: field return btn "1" btn "2" btn "3" btn " + " return btn "4" btn "5" btn "6" btn " - " return btn "7" btn "8" btn "9" btn " * " return btn "0" btn "." btn " / " btn "=" on-action [ attempt [set-face f form do get-face f] ] ] ]
== make gob! [offset: 357x220.5 size: 231x158 alpha: 255 text: "REBOL: untitled"]
>> stylize [fld: field [init-size: 80]] view [ hgroup [ text "Cashier:" cashier: fld text "Item:" item: fld text "Price:" price: fld on-action [ if error? try [to-money get-face price] [ request "Error" "Price error" return none ] set-face a rejoin [ get-face a mold get-face item tab get-face price newline ] set-face item copy "" set-face price copy "" sum: 0 foreach [item price] load get-face a [ sum: sum + to-money price ] set-face subtotal form sum set-face tax form sum * .06 set-face total form sum * 1.06 focus item ] return a: area 600x300 return text "Subtotal:" subtotal: fld text "Tax:" tax: fld text "Total:" total: fld button "Save" on-action [ items: replace/all (mold load get-face a) newline " " write/append %sales.txt rejoin [ items newline get-face cashier newline now/date newline ] set-face item copy "" set-face price copy "" set-face a copy "" set-face subtotal copy "" set-face tax copy "" set-face total copy "" ] ] ] REBOL [title: "Daily Cashier Report"] do %r3-gui.r3 name: ask "Cashier: " sales: read/lines %sales.txt sum: $0 foreach [items cashier date] sales [ if ((now/date = to-date date) and (cashier = name)) [ foreach [item price] load items [ sum: sum + to-money price ] ] ] alert rejoin ["Total sales today for " name ": " sum]
** Access error: cannot open: %r3-gui.r3 reason: -3
** Where: read either read-decode case load -apply- do
** Near: read source if find system/options/file-types type [data: de...
>> ; THAT WAS JUST AN ERROR ATTEMPTING TO LOAD R3-GUI.R3, INSTEAD OF USING LOAD-GUI
>> name: ask "Cashier: " sales: read/lines %sales.txt sum: $0 foreach [items cashier date] sales [ if ((now/date = to-date date) and (cashier = name)) [ foreach [item price] load items [ sum: sum + to-money price ] ] ] alert rejoin ["Total sales today for " name ": " sum]
Cashier: Nick
== make object! [
style: 'window
facets: make object! [
border-color: none
border-size: [0x0 0x0]
bg-color: 192.192.192
margin: 0x0
padding: [0x0 0x0]
spacing: 0x0
init-size: 337x74
min-size: 337x74
max-size: 945x575
align: 'left
valign: 'top
resizes: true
box-model: 'tight
gob: make gob! [offset: 304x262.5 size: 337x74 alpha: 255 text: "Alert"]
gob-size: 337x74
sp...
>> view [ f: field 400 a: area 400x400 button "Submit" on-action [ write/append %data.csv rejoin [ mold get-face f ", " mold get-face a newline ] ] ]
== make gob! [offset: 259.5x64.5 size: 426x470 alpha: 255 text: "REBOL: untitled"]
>> read %data.csv
== #{
22736B646A666F6173646A6661222C2022220A227765666572716572222C2022
220A
}
>> sum: $0 foreach line at parse read/lines http://re-bol.com/Download.csv "^M" 2 [ attempt [sum: sum + to-money pick row: parse/all line "," 8] if find row/4 "Saoud" [print rejoin [row/1 ", Saoud Gorn: " row/8]] ] alert join "GROSS ACCOUNT TRANSACTIONS: " sum
"1/29/2012", Saoud Gorn: -110.95
"1/10/2012", Saoud Gorn: -104.13
"1/4/2012", Saoud Gorn: -97.87
== make object! [
style: 'window
facets: make object! [
border-color: none
border-size: [0x0 0x0]
bg-color: 192.192.192
margin: 0x0
padding: [0x0 0x0]
spacing: 0x0
init-size: 481x74
min-size: 481x74
max-size: 945x575
align: 'left
valign: 'top
resizes: true
box-model: 'tight
gob: make gob! [offset: 232x262.5 size: 481x74 alpha: 255 text: "Alert"]
gob-size: 481x74
sp...
>> print "hello world" cd %./sdcard/ list-dir help ? system help write source load-gui load-gui ? guie/dialect x: to-string read http://development.saphirion.com/resources/r3-gui.r3 view [area (x)]
hello world
** Script error: invalid argument: %./sdcard/
** Where: change-dir switch cd
** Near: change-dir path
>> list-dir help ? system help write
** Script error: invalid argument: %help
** Where: change-dir switch list-dir
** Near: change-dir to-file path
>> list-dir
tmp/ home/ dev/ proc/ app/
fonts/ notes.txt chat.txt sales.txt data.csv
>> help
Use HELP or ? to see built-in info:
help insert
? insert
To search within the system, use quotes:
? "insert"
To browse online web documents:
help/doc insert
To view words and values of a context or object:
? lib - the runtime library
? self - your user context
? system - the system object
? system/options - special settings
To see all words of a specific datatype:
? native!
? function!
? datatype!
Other debug functions:
docs - open browser to web documentation
?? - display a variable and its value
probe - print a value (molded)
source func - show source code of func
trace - trace evaluation steps
what - show a list of known functions
why? - explain more about last error (via web)
Other information:
chat - open DevBase developer forum/BBS
docs - open DocBase document wiki website
bugs - open CureCore bug database website
demo - run demo launcher (from saphirion.com)
about - see general product info
upgrade - check for newer versions
changes - show changes for recent version
install - install (when applicable)
license - show user license
usage - program cmd line options
>> ? system
SYSTEM is an object of value:
version tuple! 2.101.0.4.4
build date! 19-Jul-2026/5:30:18
platform block! length: 2
product word! core
license string! {Copyright 2012 REBOL Technologies REBOL is a...
catalog object! [datatypes actions natives errors reflectors ...
contexts object! [root sys lib user]
state object! [note policies last-error]
modules block! length: 21
codecs object! [text markup bmp gif png jpeg]
dialects object! [secure draw effect text rebcode]
schemes object! [system console callback file dir event dns t...
ports object! [wait-list input output echo system callback]
locale object! [language language* locale locale* months day...
options object! [boot home path flags script args do-arg impo...
script object! [title header parent path args]
standard object! [error script header scheme port port-spec-he...
view object! [screen-gob handler event-port event-types ev...
>> help write
USAGE:
WRITE destination data /part length /seek index /append /allow access /lines
DESCRIPTION:
Writes to a file, URL, or port - auto-converts text strings.
WRITE is an action value.
ARGUMENTS:
destination (port! file! url! block!)
data -- Data to write (non-binary converts to UTF-8) (binary! string! block! time! number! image!)
REFINEMENTS:
/part -- Partial write a given number of units
length (number!)
/seek -- Write at a specific position
index (number!)
/append -- Write data at end of file
/allow -- Specifies protection attributes
access (block!)
/lines -- Write each value in a block as a separate line
>>