1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
|
# Teliva - an environment for end-user programming
> “Enable all people to modify the software they use in the course of using it.”
> — https://futureofcoding.org/episodes/033.html
> “What if we, and all computer users, could reach in and modify our favorite apps?”
> — https://www.inkandswitch.com/end-user-programming
> “Software must be as easy to change as it is to use.”
> — https://malleable.systems
## What's this, then?
An extremely naïve, [brutalist](https://en.wikipedia.org/wiki/Brutalist_architecture)
environment for little text-mode [Lua](http://www.lua.org) apps that are easy
to modify.
Here's how you run one of the example apps (the [Tower of Hanoi](https://en.wikipedia.org/wiki/Tower_of_Hanoi)):
```sh
git clone https://github.com/akkartik/teliva
cd teliva
make linux # replace with 'macosx' or 'bsd' depending on your OS
src/teliva hanoi.tlv
```
<img alt='screenshot of Teliva running the Towers of Hanoi' src='doc/hanoi.png'>
No matter what app you run, you are always guaranteed access to a single
obvious, consistent way (currently the hotkey `ctrl-e`) to edit its sources.
Make a change, hit `ctrl-e` again, and the app will run with your updates.
([video](https://archive.org/details/akkartik-2021-11-14))
You will need some Unix-like platform with a C compiler and the ncurses and
openssl libraries. So far I've tested Teliva on Linux, Mac OS X and OpenBSD;
should also work on other flavors of BSD, WSL on Windows, etc. with only minor
modifications.
## Isn't this just an IDE?
There's one big difference: these apps are not intended to be runnable outside
of the Teliva environment. Editing the sources will always be a core feature
that's front and center in the UI.
A second, more subtle difference: it's primarily an environment for _running_
apps, and only secondarily for editing them. Starting up the environment puts
you in a running app by default. Creating an app from a clean slate is a
low-priority use case, as is lots of specialized support for developing
complex apps. The sweet spot for Teliva is simple apps that people will want
to edit after using for a while.
## Why Lua?
It's reputedly the fastest interpreted language per line of implementation
code.
## Will it run any Lua program?
Not quite. My priority is providing a good experience for newcomers to
comprehend and modify the programs they use. If it's not clear how to provide
that experience for some kinds of Lua programs, I'd rather disable support for
them in Teliva and let people use regular Lua. Or other platforms!
- This approach doesn't make sense for batch programs, I think. I also don't
yet have a good story for building server programs in this way.
- I don't know how to obtain a simple, shallow graphics stack, so there's no
support for graphics at the moment.
- Teliva initializes the ncurses library by default, so apps should assume
they have access to a (color, UTF-8) text-mode window for printing text to,
and a keyboard for reading unbuffered keystrokes from.
- Teliva doesn't use files for source code, so the `require` keyword no longer
makes sense. You get some libraries preloaded (see below). Beyond those,
apps should include all Lua code they want to use.
- I want to provide sandboxed access to system resources (file system,
network, etc.) which will likely create incompatibilities with the standard
library. I'm disinclined to try to ‘improve’ on Lua syntax,
however. It's not my favorite, but it's good enough.
- To create a well-behaved sandbox, Teliva doesn't support adding libraries
with C bindings beyond the few it starts up with.
Teliva is not tested much at all yet. This is my first time programming either
in Lua or within Lua. So bug reports are most appreciated if Lua programs
behave unexpectedly under Teliva.
## What's included?
* [Lua 5.1](https://www.lua.org/manual/5.1)
* The [ncurses](https://tldp.org/HOWTO/NCURSES-Programming-HOWTO) library for
building text-mode user interfaces. ([Alternative documentation](https://tldp.org/LDP/lpg-0.4.pdf))
* The [Kilo](https://github.com/antirez/kilo) text editor, modified to use
ncurses. (Read more about it in this [fantastic walk-through](https://viewsourcecode.org/snaptoken/kilo).)
* The [lcurses](https://github.com/lcurses/lcurses) binding for ncurses (as
module `curses`).
* The [luasocket](https://w3.impa.br/~diego/software/luasocket) library of
networking primitives (modules `socket`, `http`, `url`, `headers`, `mime`,
`ltn12`).
* The [luasec](https://github.com/brunoos/luasec) library for HTTPS support
(modules `https` and `ssl`).
* The [json.lua](https://github.com/rxi/json.lua) library for
serializing/deserializing to JSON (module `json`).
The modules mentioned above are always available, just like standard Lua 5.1
libraries. They're available in their entirety with one exception:
* Some functions in lcurses have [additional smarts](https://github.com/lcurses/lcurses/blob/master/lib/curses.lua).
Teliva is [consistent with the underlying ncurses](https://github.com/akkartik/teliva/blob/main/src/lcurses/curses.lua).
While most things in these modules are currently available, I expect to delete
capabilities throughout this stack as I discover features that don't fit well
with the Teliva experience. If you find Teliva of use, please [introduce yourself](http://akkartik.name/contact)
to me so that I am aware of your use cases. Anybody who is interested can gain
a say in its future direction.
## Known issues
* Colors are currently hardcoded. To obtain say a dark background, modify the
call to `assume_default_colors()` in function `main()` at the bottom of
`src/lua.c`. If you do this, you'll likely also need to tweak other colors
for legibility. Look for calls to `FG()`, `BG()` and `COLOR_PAIR()`.
* Backspace is known to not work in some configurations. As a workaround,
typing `ctrl-h` tends to work in those situations.
* Keys outside the main keyboard area are mostly not supported. This includes
the delete key when it's set away from the main keyboard area. (Macs call
the backspace key “delete”; it should behave like backspace. As
a consequence the menu sometimes mentions keys that don't work, just to
encourage people to try options.)
## What's with the name?
Teliva is the Tamil root for ‘clear’. Very much aspirational.
## Other apps to try out
* Conway's Game of Life, as an example of an animated local app.
```
src/teliva life.tlv
```
[video](https://merveilles.town/@akkartik/107277755421024772)
* A viewer for [LiChess TV](https://lichess.org/tv), as an example of
animation and accessing a remote API over a network.
```
src/teliva chesstv.tlv
```
[video](https://merveilles.town/@akkartik/107319684018301051)
## Feedback
[Most appreciated.](http://akkartik.name/contact)
|