<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.glasstty.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=John</id>
	<title>Telstar Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.glasstty.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=John"/>
	<link rel="alternate" type="text/html" href="https://wiki.glasstty.com/index.php/Special:Contributions/John"/>
	<updated>2026-05-05T12:14:39Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.37.1</generator>
	<entry>
		<id>https://wiki.glasstty.com/index.php?title=1970s_Home_Computing_in_the_UK&amp;diff=432</id>
		<title>1970s Home Computing in the UK</title>
		<link rel="alternate" type="text/html" href="https://wiki.glasstty.com/index.php?title=1970s_Home_Computing_in_the_UK&amp;diff=432"/>
		<updated>2025-10-04T10:00:17Z</updated>

		<summary type="html">&lt;p&gt;John: Created page with &amp;quot;Just a starting point, many of these could not realistically be classified as home or personal computers, despite many of them being used in a single user mode.  === 1970 ===  *Datapoint (CTC) 2200 - TTL Computer *ICL 1900 series — British mainframes, widely deployed.    *Data General Nova — imported 16-bit minicomputer.    *DEC PDP-11/20 — first PDP-11 systems reached UK universities/labs.     === 1971 ===  *HP 2100A minicomputer — available via HP UK offices....&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Just a starting point, many of these could not realistically be classified as home or personal computers, despite many of them being used in a single user mode.&lt;br /&gt;
&lt;br /&gt;
=== 1970 ===&lt;br /&gt;
&lt;br /&gt;
*Datapoint (CTC) 2200 - TTL Computer&lt;br /&gt;
*ICL 1900 series — British mainframes, widely deployed.   &lt;br /&gt;
*Data General Nova — imported 16-bit minicomputer.   &lt;br /&gt;
*DEC PDP-11/20 — first PDP-11 systems reached UK universities/labs.   &lt;br /&gt;
&lt;br /&gt;
=== 1971 ===&lt;br /&gt;
&lt;br /&gt;
*HP 2100A minicomputer — available via HP UK offices.  &lt;br /&gt;
*Interdata 7/16 — 16-bit minicomputer, sold in UK.  &lt;br /&gt;
*Kenbak 1 - First Personal Computer ?&lt;br /&gt;
*Intel SIM4-01&lt;br /&gt;
*Intel SIM4-02&lt;br /&gt;
&lt;br /&gt;
=== 1972 ===&lt;br /&gt;
&lt;br /&gt;
*DEC PDP-11/40 — expanded PDP-11 family in UK use.  &lt;br /&gt;
*IBM System/3 — midrange systems shipped to UK businesses.   &lt;br /&gt;
*QI Corporation Q1&lt;br /&gt;
*IBM SCAMP (1972/1973)&lt;br /&gt;
*Intel SIM8-01&lt;br /&gt;
&lt;br /&gt;
=== 1973 ===&lt;br /&gt;
&lt;br /&gt;
*Wang 2200 — BASIC desktop computer, imported to UK.  &lt;br /&gt;
*ICL 2900 series — launched as successor to 1900 series.   &lt;br /&gt;
*R2E MicralN - French computer&lt;br /&gt;
*Intel Intellec&lt;br /&gt;
*Xerox Alto&lt;br /&gt;
*Xerox Star&lt;br /&gt;
&lt;br /&gt;
=== 1974 ===&lt;br /&gt;
&lt;br /&gt;
*Mark-8 (kit, Intel 8008) — hobbyist kit plans; some built in UK by enthusiasts.  &lt;br /&gt;
*DEC PDP-11/34 — later PDP-11s became standard in UK universities.  &lt;br /&gt;
*RCA Fred/Cosmac&lt;br /&gt;
*Mark 8 - Radio and Electronics&lt;br /&gt;
*QI Corporation Q1/Lite&lt;br /&gt;
*QI Corporation Q1/MicroLite&lt;br /&gt;
&lt;br /&gt;
=== 1975 ===&lt;br /&gt;
&lt;br /&gt;
*MITS Altair 8800 (kit) — available via import/mail order in UK.   &lt;br /&gt;
*IMSAI 8080 (kit) — Altair-compatible S-100 system, imported.   &lt;br /&gt;
*Sphere 1 — limited UK import.  &lt;br /&gt;
*SWTPC 6800 (kit) — Motorola-based system available through UK distributors.&lt;br /&gt;
*IBM 5100&lt;br /&gt;
&lt;br /&gt;
=== 1976 ===&lt;br /&gt;
&lt;br /&gt;
*Processor Technology SOL-20 — first pre-assembled micro, imported to UK.  &lt;br /&gt;
*MOS Technology KIM-1 (single board) — popular among UK hobbyists.   &lt;br /&gt;
*Polymorphic Systems Poly-88 — some UK availability via specialist dealers.  &lt;br /&gt;
*Digital Group machines — imported modular kits.  &lt;br /&gt;
*Bywood Scrumpy - The first single-board computer kit made in the UK.&lt;br /&gt;
*Apple 1&lt;br /&gt;
*Cosmac Elf - Magazine/Kit&lt;br /&gt;
*Motorola MEK6800D2 - Development board.&lt;br /&gt;
*MPT 8080 Microtutor&lt;br /&gt;
&lt;br /&gt;
=== 1977 ===&lt;br /&gt;
&lt;br /&gt;
*Apple II — began UK distribution.   &lt;br /&gt;
*Commodore PET 2001 — available in UK education/business.   &lt;br /&gt;
*TRS-80 Model I — sold by Tandy in UK stores.   &lt;br /&gt;
*Heathkit H8 (kit) — obtainable in UK.   &lt;br /&gt;
*Science of Cambridge MK14 (kit) — UK-only.   &lt;br /&gt;
*Nascom-1 (kit) — British single-board kit, launched late 1977.&lt;br /&gt;
*System 68 - ETI Magazine&lt;br /&gt;
&lt;br /&gt;
=== 1978 ===&lt;br /&gt;
&lt;br /&gt;
*Nascom-2 (kit) — enhanced British micro.  &lt;br /&gt;
*Ohio Scientific Superboard II — imported; inspired the UK101.  &lt;br /&gt;
*Exidy Sorcerer — some units imported to UK.  &lt;br /&gt;
*Cromemco Z-2 — S-100 business micro, UK dealer support.  &lt;br /&gt;
*NorthStar Horizon — floppy-based micro, sold in UK.  &lt;br /&gt;
*Vector Graphic 1 — CP/M micro, available through importers.&lt;br /&gt;
*MZ-80K — An all-in-one unit with keyboard.&lt;br /&gt;
*Transam Triton - ETI&lt;br /&gt;
*Rockwell Aim-65&lt;br /&gt;
*Synertek Sym-1&lt;br /&gt;
*Intel SDK-85&lt;br /&gt;
*IBM 5110&lt;br /&gt;
&lt;br /&gt;
=== 1979 ===&lt;br /&gt;
&lt;br /&gt;
*Acorn System 1 (kit/assembled) — first Acorn computer, UK.   &lt;br /&gt;
*Tangerine Microtan-65 (kit) — 6502 kit, UK release.   &lt;br /&gt;
*Compukit UK101 (kit) — UK clone of OSI Superboard II.   &lt;br /&gt;
*Atari 400 / 800 — home micros, UK launch late 1979.  &lt;br /&gt;
*Texas Instruments TI-99/4 — imported to UK in 1979.  &lt;br /&gt;
*Intertec Superbrain — business-oriented CP/M micro, available in UK.  &lt;br /&gt;
*Compucolor II — colour micro, limited UK availability.&lt;br /&gt;
*MZ-80C- Featured an improved keyboard and 48KB of memory.&lt;br /&gt;
*Powertran PSI Comp 80 - Wireless World Z80&lt;br /&gt;
&lt;br /&gt;
=== Considerations ===&lt;br /&gt;
&lt;br /&gt;
*VAX&lt;br /&gt;
*DEC&lt;br /&gt;
*Prime Computers&lt;br /&gt;
*Cromemco systems (late 1970s) — S-100 family machines, imported to the UK.  &lt;br /&gt;
*Zenith assembled systems (via dealers).   &lt;br /&gt;
*Sord&lt;br /&gt;
*Toshiba — available in UK through niche distributors.&lt;br /&gt;
*Data General — popular 16-bit minicomputer, sold in UK.   &lt;br /&gt;
*Honeywell&lt;br /&gt;
*Burroughs&lt;br /&gt;
*Univac&lt;/div&gt;</summary>
		<author><name>John</name></author>
	</entry>
	<entry>
		<id>https://wiki.glasstty.com/index.php?title=Main_Page&amp;diff=431</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://wiki.glasstty.com/index.php?title=Main_Page&amp;diff=431"/>
		<updated>2025-10-04T09:57:40Z</updated>

		<summary type="html">&lt;p&gt;John: Changed redirect target from Pre-1980 Personal and Home Computers to 1970s Home Computing in the UK&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[1970s Home Computing in the UK]]&lt;/div&gt;</summary>
		<author><name>John</name></author>
	</entry>
	<entry>
		<id>https://wiki.glasstty.com/index.php?title=Pre-1980_Personal_and_Home_Computers&amp;diff=430</id>
		<title>Pre-1980 Personal and Home Computers</title>
		<link rel="alternate" type="text/html" href="https://wiki.glasstty.com/index.php?title=Pre-1980_Personal_and_Home_Computers&amp;diff=430"/>
		<updated>2025-10-02T15:51:45Z</updated>

		<summary type="html">&lt;p&gt;John: /* 1961 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
&lt;br /&gt;
What follows is a list of personal computers available to the public in one form or another to members of the public. The term Personal Computer in this context refers to a general purpose computer that was designed to be used by a single person typically in their home or place of work or study.&lt;br /&gt;
&lt;br /&gt;
=== 1958 ===&lt;br /&gt;
&lt;br /&gt;
*Elliot 801&lt;br /&gt;
&lt;br /&gt;
=== 1959 ===&lt;br /&gt;
&lt;br /&gt;
==== DEC PDP 1 ====&lt;br /&gt;
&lt;br /&gt;
The company’s first Programmed Data Processor, the PDP-1 computer used DIGITAL’s own system modules, which came from the existing range of 1OMC logic released in late 1959. The first PDP-1, delivered in December 1959, was a high speed, 18.bit, small computer capable of addressing 32K of core memoy. An average configuration cost $120,000 in an era when most computer systems were sold for a million dollars or more. [1]&lt;br /&gt;
&lt;br /&gt;
Standard peripherals included a paper tape reader and punch, and a terminal. Optional peripherals included graphics displays, a light pen, line printer, punched card reader and punch, and magnetic tape controller and drives. [2]&lt;br /&gt;
&lt;br /&gt;
A PDP-1 at MIT's RLE served as the nucleus for early hacker culture at MIT, including for the first video game, Spacewar!. The PDP-1/D at BBN was much used in the early ARPANET work; both for software development, and as the Network Control Center's first machine. [2]&lt;br /&gt;
&lt;br /&gt;
[1] &amp;quot;DEC 1957 to the Present&amp;quot; p.3&lt;br /&gt;
[2] https://gunkies.org/wiki/PDP-1&lt;br /&gt;
&lt;br /&gt;
=== 1960 ===&lt;br /&gt;
&lt;br /&gt;
*Elliott 803A&lt;br /&gt;
&lt;br /&gt;
=== 1961 ===&lt;br /&gt;
&lt;br /&gt;
*Elliot 803B&lt;br /&gt;
&lt;br /&gt;
=== 1962 ===&lt;br /&gt;
&lt;br /&gt;
*Linc - Personal Minicomputer&lt;br /&gt;
&lt;br /&gt;
=== 1967 ===&lt;br /&gt;
&lt;br /&gt;
*Wireless World Computer = Transistor based Computer from Wireless World Magazine (August 1967)&lt;br /&gt;
&lt;br /&gt;
=== 1970 ===&lt;br /&gt;
&lt;br /&gt;
*Datapoint (CTC) 2200 - TTL Computer&lt;br /&gt;
*ICL 1900 series — British mainframes, widely deployed.   &lt;br /&gt;
*Data General Nova — imported 16-bit minicomputer.   &lt;br /&gt;
*DEC PDP-11/20 — first PDP-11 systems reached UK universities/labs.   &lt;br /&gt;
&lt;br /&gt;
=== 1971 ===&lt;br /&gt;
&lt;br /&gt;
*HP 2100A minicomputer — available via HP UK offices.  &lt;br /&gt;
*Interdata 7/16 — 16-bit minicomputer, sold in UK.  &lt;br /&gt;
*Kenbak 1 - First Personal Computer ?&lt;br /&gt;
*Intel SIM4-01&lt;br /&gt;
*Intel SIM4-02&lt;br /&gt;
&lt;br /&gt;
=== 1972 ===&lt;br /&gt;
&lt;br /&gt;
*DEC PDP-11/40 — expanded PDP-11 family in UK use.  &lt;br /&gt;
*IBM System/3 — midrange systems shipped to UK businesses.   &lt;br /&gt;
*QI Corporation Q1&lt;br /&gt;
*IBM SCAMP (1972/1973)&lt;br /&gt;
*Intel SIM8-01&lt;br /&gt;
&lt;br /&gt;
=== 1973 ===&lt;br /&gt;
&lt;br /&gt;
*Wang 2200 — BASIC desktop computer, imported to UK.  &lt;br /&gt;
*ICL 2900 series — launched as successor to 1900 series.   &lt;br /&gt;
*R2E MicralN - French computer&lt;br /&gt;
*Intel Intellec&lt;br /&gt;
*Xerox Alto&lt;br /&gt;
*Xerox Star&lt;br /&gt;
&lt;br /&gt;
=== 1974 ===&lt;br /&gt;
&lt;br /&gt;
*Mark-8 (kit, Intel 8008) — hobbyist kit plans; some built in UK by enthusiasts.  &lt;br /&gt;
*DEC PDP-11/34 — later PDP-11s became standard in UK universities.  &lt;br /&gt;
*RCA Fred/Cosmac&lt;br /&gt;
*Mark 8 - Radio and Electronics&lt;br /&gt;
*QI Corporation Q1/Lite&lt;br /&gt;
*QI Corporation Q1/MicroLite&lt;br /&gt;
&lt;br /&gt;
=== 1975 ===&lt;br /&gt;
&lt;br /&gt;
*MITS Altair 8800 (kit) — available via import/mail order in UK.   &lt;br /&gt;
*IMSAI 8080 (kit) — Altair-compatible S-100 system, imported.   &lt;br /&gt;
*Sphere 1 — limited UK import.  &lt;br /&gt;
*SWTPC 6800 (kit) — Motorola-based system available through UK distributors.&lt;br /&gt;
*IBM 5100&lt;br /&gt;
&lt;br /&gt;
=== 1976 ===&lt;br /&gt;
&lt;br /&gt;
*Processor Technology SOL-20 — first pre-assembled micro, imported to UK.  &lt;br /&gt;
*MOS Technology KIM-1 (single board) — popular among UK hobbyists.   &lt;br /&gt;
*Polymorphic Systems Poly-88 — some UK availability via specialist dealers.  &lt;br /&gt;
*Digital Group machines — imported modular kits.  &lt;br /&gt;
*Bywood Scrumpy - The first single-board computer kit made in the UK.&lt;br /&gt;
*Apple 1&lt;br /&gt;
*Cosmac Elf - Magazine/Kit&lt;br /&gt;
*Motorola MEK6800D2 - Development board.&lt;br /&gt;
*MPT 8080 Microtutor&lt;br /&gt;
&lt;br /&gt;
=== 1977 ===&lt;br /&gt;
&lt;br /&gt;
*Apple II — began UK distribution.   &lt;br /&gt;
*Commodore PET 2001 — available in UK education/business.   &lt;br /&gt;
*TRS-80 Model I — sold by Tandy in UK stores.   &lt;br /&gt;
*Heathkit H8 (kit) — obtainable in UK.   &lt;br /&gt;
*Science of Cambridge MK14 (kit) — UK-only.   &lt;br /&gt;
*Nascom-1 (kit) — British single-board kit, launched late 1977.&lt;br /&gt;
*System 68 - ETI Magazine&lt;br /&gt;
&lt;br /&gt;
=== 1978 ===&lt;br /&gt;
&lt;br /&gt;
*Nascom-2 (kit) — enhanced British micro.  &lt;br /&gt;
*Ohio Scientific Superboard II — imported; inspired the UK101.  &lt;br /&gt;
*Exidy Sorcerer — some units imported to UK.  &lt;br /&gt;
*Cromemco Z-2 — S-100 business micro, UK dealer support.  &lt;br /&gt;
*NorthStar Horizon — floppy-based micro, sold in UK.  &lt;br /&gt;
*Vector Graphic 1 — CP/M micro, available through importers.&lt;br /&gt;
*MZ-80K — An all-in-one unit with keyboard.&lt;br /&gt;
*Transam Triton - ETI&lt;br /&gt;
*Rockwell Aim-65&lt;br /&gt;
*Synertek Sym-1&lt;br /&gt;
*Intel SDK-85&lt;br /&gt;
*IBM 5110&lt;br /&gt;
&lt;br /&gt;
=== 1979 ===&lt;br /&gt;
&lt;br /&gt;
*Acorn System 1 (kit/assembled) — first Acorn computer, UK.   &lt;br /&gt;
*Tangerine Microtan-65 (kit) — 6502 kit, UK release.   &lt;br /&gt;
*Compukit UK101 (kit) — UK clone of OSI Superboard II.   &lt;br /&gt;
*Atari 400 / 800 — home micros, UK launch late 1979.  &lt;br /&gt;
*Texas Instruments TI-99/4 — imported to UK in 1979.  &lt;br /&gt;
*Intertec Superbrain — business-oriented CP/M micro, available in UK.  &lt;br /&gt;
*Compucolor II — colour micro, limited UK availability.&lt;br /&gt;
*MZ-80C- Featured an improved keyboard and 48KB of memory.&lt;br /&gt;
*Powertran PSI Comp 80 - Wireless World Z80&lt;br /&gt;
&lt;br /&gt;
=== Considerations ===&lt;br /&gt;
&lt;br /&gt;
*VAX&lt;br /&gt;
*DEC&lt;br /&gt;
*Prime Computers&lt;br /&gt;
*Cromemco systems (late 1970s) — S-100 family machines, imported to the UK.  &lt;br /&gt;
*Zenith assembled systems (via dealers).   &lt;br /&gt;
*Sord&lt;br /&gt;
*Toshiba — available in UK through niche distributors.&lt;br /&gt;
*Data General — popular 16-bit minicomputer, sold in UK.   &lt;br /&gt;
*Honeywell&lt;br /&gt;
*Burroughs&lt;br /&gt;
*Univac&lt;br /&gt;
&lt;br /&gt;
== Sources ==&lt;br /&gt;
&lt;br /&gt;
* Centre for Computing History (UK)   &lt;br /&gt;
* Science Museum Group (UK) — Nascom and other UK machines   &lt;br /&gt;
* Contemporary records: MK14, Acorn System 1, Nascom, Microtan-65, Compukit UK101   &lt;br /&gt;
* DEC PDP-11 and other minicomputers in UK use   &lt;br /&gt;
* ICL in UK&lt;/div&gt;</summary>
		<author><name>John</name></author>
	</entry>
	<entry>
		<id>https://wiki.glasstty.com/index.php?title=Pre-1980_Personal_and_Home_Computers&amp;diff=429</id>
		<title>Pre-1980 Personal and Home Computers</title>
		<link rel="alternate" type="text/html" href="https://wiki.glasstty.com/index.php?title=Pre-1980_Personal_and_Home_Computers&amp;diff=429"/>
		<updated>2025-10-02T15:51:38Z</updated>

		<summary type="html">&lt;p&gt;John: /* 1960 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
&lt;br /&gt;
What follows is a list of personal computers available to the public in one form or another to members of the public. The term Personal Computer in this context refers to a general purpose computer that was designed to be used by a single person typically in their home or place of work or study.&lt;br /&gt;
&lt;br /&gt;
=== 1958 ===&lt;br /&gt;
&lt;br /&gt;
*Elliot 801&lt;br /&gt;
&lt;br /&gt;
=== 1959 ===&lt;br /&gt;
&lt;br /&gt;
==== DEC PDP 1 ====&lt;br /&gt;
&lt;br /&gt;
The company’s first Programmed Data Processor, the PDP-1 computer used DIGITAL’s own system modules, which came from the existing range of 1OMC logic released in late 1959. The first PDP-1, delivered in December 1959, was a high speed, 18.bit, small computer capable of addressing 32K of core memoy. An average configuration cost $120,000 in an era when most computer systems were sold for a million dollars or more. [1]&lt;br /&gt;
&lt;br /&gt;
Standard peripherals included a paper tape reader and punch, and a terminal. Optional peripherals included graphics displays, a light pen, line printer, punched card reader and punch, and magnetic tape controller and drives. [2]&lt;br /&gt;
&lt;br /&gt;
A PDP-1 at MIT's RLE served as the nucleus for early hacker culture at MIT, including for the first video game, Spacewar!. The PDP-1/D at BBN was much used in the early ARPANET work; both for software development, and as the Network Control Center's first machine. [2]&lt;br /&gt;
&lt;br /&gt;
[1] &amp;quot;DEC 1957 to the Present&amp;quot; p.3&lt;br /&gt;
[2] https://gunkies.org/wiki/PDP-1&lt;br /&gt;
&lt;br /&gt;
=== 1960 ===&lt;br /&gt;
&lt;br /&gt;
*Elliott 803A&lt;br /&gt;
&lt;br /&gt;
=== 1961 ===&lt;br /&gt;
&lt;br /&gt;
Elliot 803B&lt;br /&gt;
&lt;br /&gt;
=== 1962 ===&lt;br /&gt;
&lt;br /&gt;
*Linc - Personal Minicomputer&lt;br /&gt;
&lt;br /&gt;
=== 1967 ===&lt;br /&gt;
&lt;br /&gt;
*Wireless World Computer = Transistor based Computer from Wireless World Magazine (August 1967)&lt;br /&gt;
&lt;br /&gt;
=== 1970 ===&lt;br /&gt;
&lt;br /&gt;
*Datapoint (CTC) 2200 - TTL Computer&lt;br /&gt;
*ICL 1900 series — British mainframes, widely deployed.   &lt;br /&gt;
*Data General Nova — imported 16-bit minicomputer.   &lt;br /&gt;
*DEC PDP-11/20 — first PDP-11 systems reached UK universities/labs.   &lt;br /&gt;
&lt;br /&gt;
=== 1971 ===&lt;br /&gt;
&lt;br /&gt;
*HP 2100A minicomputer — available via HP UK offices.  &lt;br /&gt;
*Interdata 7/16 — 16-bit minicomputer, sold in UK.  &lt;br /&gt;
*Kenbak 1 - First Personal Computer ?&lt;br /&gt;
*Intel SIM4-01&lt;br /&gt;
*Intel SIM4-02&lt;br /&gt;
&lt;br /&gt;
=== 1972 ===&lt;br /&gt;
&lt;br /&gt;
*DEC PDP-11/40 — expanded PDP-11 family in UK use.  &lt;br /&gt;
*IBM System/3 — midrange systems shipped to UK businesses.   &lt;br /&gt;
*QI Corporation Q1&lt;br /&gt;
*IBM SCAMP (1972/1973)&lt;br /&gt;
*Intel SIM8-01&lt;br /&gt;
&lt;br /&gt;
=== 1973 ===&lt;br /&gt;
&lt;br /&gt;
*Wang 2200 — BASIC desktop computer, imported to UK.  &lt;br /&gt;
*ICL 2900 series — launched as successor to 1900 series.   &lt;br /&gt;
*R2E MicralN - French computer&lt;br /&gt;
*Intel Intellec&lt;br /&gt;
*Xerox Alto&lt;br /&gt;
*Xerox Star&lt;br /&gt;
&lt;br /&gt;
=== 1974 ===&lt;br /&gt;
&lt;br /&gt;
*Mark-8 (kit, Intel 8008) — hobbyist kit plans; some built in UK by enthusiasts.  &lt;br /&gt;
*DEC PDP-11/34 — later PDP-11s became standard in UK universities.  &lt;br /&gt;
*RCA Fred/Cosmac&lt;br /&gt;
*Mark 8 - Radio and Electronics&lt;br /&gt;
*QI Corporation Q1/Lite&lt;br /&gt;
*QI Corporation Q1/MicroLite&lt;br /&gt;
&lt;br /&gt;
=== 1975 ===&lt;br /&gt;
&lt;br /&gt;
*MITS Altair 8800 (kit) — available via import/mail order in UK.   &lt;br /&gt;
*IMSAI 8080 (kit) — Altair-compatible S-100 system, imported.   &lt;br /&gt;
*Sphere 1 — limited UK import.  &lt;br /&gt;
*SWTPC 6800 (kit) — Motorola-based system available through UK distributors.&lt;br /&gt;
*IBM 5100&lt;br /&gt;
&lt;br /&gt;
=== 1976 ===&lt;br /&gt;
&lt;br /&gt;
*Processor Technology SOL-20 — first pre-assembled micro, imported to UK.  &lt;br /&gt;
*MOS Technology KIM-1 (single board) — popular among UK hobbyists.   &lt;br /&gt;
*Polymorphic Systems Poly-88 — some UK availability via specialist dealers.  &lt;br /&gt;
*Digital Group machines — imported modular kits.  &lt;br /&gt;
*Bywood Scrumpy - The first single-board computer kit made in the UK.&lt;br /&gt;
*Apple 1&lt;br /&gt;
*Cosmac Elf - Magazine/Kit&lt;br /&gt;
*Motorola MEK6800D2 - Development board.&lt;br /&gt;
*MPT 8080 Microtutor&lt;br /&gt;
&lt;br /&gt;
=== 1977 ===&lt;br /&gt;
&lt;br /&gt;
*Apple II — began UK distribution.   &lt;br /&gt;
*Commodore PET 2001 — available in UK education/business.   &lt;br /&gt;
*TRS-80 Model I — sold by Tandy in UK stores.   &lt;br /&gt;
*Heathkit H8 (kit) — obtainable in UK.   &lt;br /&gt;
*Science of Cambridge MK14 (kit) — UK-only.   &lt;br /&gt;
*Nascom-1 (kit) — British single-board kit, launched late 1977.&lt;br /&gt;
*System 68 - ETI Magazine&lt;br /&gt;
&lt;br /&gt;
=== 1978 ===&lt;br /&gt;
&lt;br /&gt;
*Nascom-2 (kit) — enhanced British micro.  &lt;br /&gt;
*Ohio Scientific Superboard II — imported; inspired the UK101.  &lt;br /&gt;
*Exidy Sorcerer — some units imported to UK.  &lt;br /&gt;
*Cromemco Z-2 — S-100 business micro, UK dealer support.  &lt;br /&gt;
*NorthStar Horizon — floppy-based micro, sold in UK.  &lt;br /&gt;
*Vector Graphic 1 — CP/M micro, available through importers.&lt;br /&gt;
*MZ-80K — An all-in-one unit with keyboard.&lt;br /&gt;
*Transam Triton - ETI&lt;br /&gt;
*Rockwell Aim-65&lt;br /&gt;
*Synertek Sym-1&lt;br /&gt;
*Intel SDK-85&lt;br /&gt;
*IBM 5110&lt;br /&gt;
&lt;br /&gt;
=== 1979 ===&lt;br /&gt;
&lt;br /&gt;
*Acorn System 1 (kit/assembled) — first Acorn computer, UK.   &lt;br /&gt;
*Tangerine Microtan-65 (kit) — 6502 kit, UK release.   &lt;br /&gt;
*Compukit UK101 (kit) — UK clone of OSI Superboard II.   &lt;br /&gt;
*Atari 400 / 800 — home micros, UK launch late 1979.  &lt;br /&gt;
*Texas Instruments TI-99/4 — imported to UK in 1979.  &lt;br /&gt;
*Intertec Superbrain — business-oriented CP/M micro, available in UK.  &lt;br /&gt;
*Compucolor II — colour micro, limited UK availability.&lt;br /&gt;
*MZ-80C- Featured an improved keyboard and 48KB of memory.&lt;br /&gt;
*Powertran PSI Comp 80 - Wireless World Z80&lt;br /&gt;
&lt;br /&gt;
=== Considerations ===&lt;br /&gt;
&lt;br /&gt;
*VAX&lt;br /&gt;
*DEC&lt;br /&gt;
*Prime Computers&lt;br /&gt;
*Cromemco systems (late 1970s) — S-100 family machines, imported to the UK.  &lt;br /&gt;
*Zenith assembled systems (via dealers).   &lt;br /&gt;
*Sord&lt;br /&gt;
*Toshiba — available in UK through niche distributors.&lt;br /&gt;
*Data General — popular 16-bit minicomputer, sold in UK.   &lt;br /&gt;
*Honeywell&lt;br /&gt;
*Burroughs&lt;br /&gt;
*Univac&lt;br /&gt;
&lt;br /&gt;
== Sources ==&lt;br /&gt;
&lt;br /&gt;
* Centre for Computing History (UK)   &lt;br /&gt;
* Science Museum Group (UK) — Nascom and other UK machines   &lt;br /&gt;
* Contemporary records: MK14, Acorn System 1, Nascom, Microtan-65, Compukit UK101   &lt;br /&gt;
* DEC PDP-11 and other minicomputers in UK use   &lt;br /&gt;
* ICL in UK&lt;/div&gt;</summary>
		<author><name>John</name></author>
	</entry>
	<entry>
		<id>https://wiki.glasstty.com/index.php?title=Pre-1980_Personal_and_Home_Computers&amp;diff=428</id>
		<title>Pre-1980 Personal and Home Computers</title>
		<link rel="alternate" type="text/html" href="https://wiki.glasstty.com/index.php?title=Pre-1980_Personal_and_Home_Computers&amp;diff=428"/>
		<updated>2025-10-02T15:51:25Z</updated>

		<summary type="html">&lt;p&gt;John: /* 1960 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
&lt;br /&gt;
What follows is a list of personal computers available to the public in one form or another to members of the public. The term Personal Computer in this context refers to a general purpose computer that was designed to be used by a single person typically in their home or place of work or study.&lt;br /&gt;
&lt;br /&gt;
=== 1958 ===&lt;br /&gt;
&lt;br /&gt;
*Elliot 801&lt;br /&gt;
&lt;br /&gt;
=== 1959 ===&lt;br /&gt;
&lt;br /&gt;
==== DEC PDP 1 ====&lt;br /&gt;
&lt;br /&gt;
The company’s first Programmed Data Processor, the PDP-1 computer used DIGITAL’s own system modules, which came from the existing range of 1OMC logic released in late 1959. The first PDP-1, delivered in December 1959, was a high speed, 18.bit, small computer capable of addressing 32K of core memoy. An average configuration cost $120,000 in an era when most computer systems were sold for a million dollars or more. [1]&lt;br /&gt;
&lt;br /&gt;
Standard peripherals included a paper tape reader and punch, and a terminal. Optional peripherals included graphics displays, a light pen, line printer, punched card reader and punch, and magnetic tape controller and drives. [2]&lt;br /&gt;
&lt;br /&gt;
A PDP-1 at MIT's RLE served as the nucleus for early hacker culture at MIT, including for the first video game, Spacewar!. The PDP-1/D at BBN was much used in the early ARPANET work; both for software development, and as the Network Control Center's first machine. [2]&lt;br /&gt;
&lt;br /&gt;
[1] &amp;quot;DEC 1957 to the Present&amp;quot; p.3&lt;br /&gt;
[2] https://gunkies.org/wiki/PDP-1&lt;br /&gt;
&lt;br /&gt;
=== 1960 ===&lt;br /&gt;
&lt;br /&gt;
Elliott 803A&lt;br /&gt;
&lt;br /&gt;
=== 1961 ===&lt;br /&gt;
&lt;br /&gt;
Elliot 803B&lt;br /&gt;
&lt;br /&gt;
=== 1962 ===&lt;br /&gt;
&lt;br /&gt;
*Linc - Personal Minicomputer&lt;br /&gt;
&lt;br /&gt;
=== 1967 ===&lt;br /&gt;
&lt;br /&gt;
*Wireless World Computer = Transistor based Computer from Wireless World Magazine (August 1967)&lt;br /&gt;
&lt;br /&gt;
=== 1970 ===&lt;br /&gt;
&lt;br /&gt;
*Datapoint (CTC) 2200 - TTL Computer&lt;br /&gt;
*ICL 1900 series — British mainframes, widely deployed.   &lt;br /&gt;
*Data General Nova — imported 16-bit minicomputer.   &lt;br /&gt;
*DEC PDP-11/20 — first PDP-11 systems reached UK universities/labs.   &lt;br /&gt;
&lt;br /&gt;
=== 1971 ===&lt;br /&gt;
&lt;br /&gt;
*HP 2100A minicomputer — available via HP UK offices.  &lt;br /&gt;
*Interdata 7/16 — 16-bit minicomputer, sold in UK.  &lt;br /&gt;
*Kenbak 1 - First Personal Computer ?&lt;br /&gt;
*Intel SIM4-01&lt;br /&gt;
*Intel SIM4-02&lt;br /&gt;
&lt;br /&gt;
=== 1972 ===&lt;br /&gt;
&lt;br /&gt;
*DEC PDP-11/40 — expanded PDP-11 family in UK use.  &lt;br /&gt;
*IBM System/3 — midrange systems shipped to UK businesses.   &lt;br /&gt;
*QI Corporation Q1&lt;br /&gt;
*IBM SCAMP (1972/1973)&lt;br /&gt;
*Intel SIM8-01&lt;br /&gt;
&lt;br /&gt;
=== 1973 ===&lt;br /&gt;
&lt;br /&gt;
*Wang 2200 — BASIC desktop computer, imported to UK.  &lt;br /&gt;
*ICL 2900 series — launched as successor to 1900 series.   &lt;br /&gt;
*R2E MicralN - French computer&lt;br /&gt;
*Intel Intellec&lt;br /&gt;
*Xerox Alto&lt;br /&gt;
*Xerox Star&lt;br /&gt;
&lt;br /&gt;
=== 1974 ===&lt;br /&gt;
&lt;br /&gt;
*Mark-8 (kit, Intel 8008) — hobbyist kit plans; some built in UK by enthusiasts.  &lt;br /&gt;
*DEC PDP-11/34 — later PDP-11s became standard in UK universities.  &lt;br /&gt;
*RCA Fred/Cosmac&lt;br /&gt;
*Mark 8 - Radio and Electronics&lt;br /&gt;
*QI Corporation Q1/Lite&lt;br /&gt;
*QI Corporation Q1/MicroLite&lt;br /&gt;
&lt;br /&gt;
=== 1975 ===&lt;br /&gt;
&lt;br /&gt;
*MITS Altair 8800 (kit) — available via import/mail order in UK.   &lt;br /&gt;
*IMSAI 8080 (kit) — Altair-compatible S-100 system, imported.   &lt;br /&gt;
*Sphere 1 — limited UK import.  &lt;br /&gt;
*SWTPC 6800 (kit) — Motorola-based system available through UK distributors.&lt;br /&gt;
*IBM 5100&lt;br /&gt;
&lt;br /&gt;
=== 1976 ===&lt;br /&gt;
&lt;br /&gt;
*Processor Technology SOL-20 — first pre-assembled micro, imported to UK.  &lt;br /&gt;
*MOS Technology KIM-1 (single board) — popular among UK hobbyists.   &lt;br /&gt;
*Polymorphic Systems Poly-88 — some UK availability via specialist dealers.  &lt;br /&gt;
*Digital Group machines — imported modular kits.  &lt;br /&gt;
*Bywood Scrumpy - The first single-board computer kit made in the UK.&lt;br /&gt;
*Apple 1&lt;br /&gt;
*Cosmac Elf - Magazine/Kit&lt;br /&gt;
*Motorola MEK6800D2 - Development board.&lt;br /&gt;
*MPT 8080 Microtutor&lt;br /&gt;
&lt;br /&gt;
=== 1977 ===&lt;br /&gt;
&lt;br /&gt;
*Apple II — began UK distribution.   &lt;br /&gt;
*Commodore PET 2001 — available in UK education/business.   &lt;br /&gt;
*TRS-80 Model I — sold by Tandy in UK stores.   &lt;br /&gt;
*Heathkit H8 (kit) — obtainable in UK.   &lt;br /&gt;
*Science of Cambridge MK14 (kit) — UK-only.   &lt;br /&gt;
*Nascom-1 (kit) — British single-board kit, launched late 1977.&lt;br /&gt;
*System 68 - ETI Magazine&lt;br /&gt;
&lt;br /&gt;
=== 1978 ===&lt;br /&gt;
&lt;br /&gt;
*Nascom-2 (kit) — enhanced British micro.  &lt;br /&gt;
*Ohio Scientific Superboard II — imported; inspired the UK101.  &lt;br /&gt;
*Exidy Sorcerer — some units imported to UK.  &lt;br /&gt;
*Cromemco Z-2 — S-100 business micro, UK dealer support.  &lt;br /&gt;
*NorthStar Horizon — floppy-based micro, sold in UK.  &lt;br /&gt;
*Vector Graphic 1 — CP/M micro, available through importers.&lt;br /&gt;
*MZ-80K — An all-in-one unit with keyboard.&lt;br /&gt;
*Transam Triton - ETI&lt;br /&gt;
*Rockwell Aim-65&lt;br /&gt;
*Synertek Sym-1&lt;br /&gt;
*Intel SDK-85&lt;br /&gt;
*IBM 5110&lt;br /&gt;
&lt;br /&gt;
=== 1979 ===&lt;br /&gt;
&lt;br /&gt;
*Acorn System 1 (kit/assembled) — first Acorn computer, UK.   &lt;br /&gt;
*Tangerine Microtan-65 (kit) — 6502 kit, UK release.   &lt;br /&gt;
*Compukit UK101 (kit) — UK clone of OSI Superboard II.   &lt;br /&gt;
*Atari 400 / 800 — home micros, UK launch late 1979.  &lt;br /&gt;
*Texas Instruments TI-99/4 — imported to UK in 1979.  &lt;br /&gt;
*Intertec Superbrain — business-oriented CP/M micro, available in UK.  &lt;br /&gt;
*Compucolor II — colour micro, limited UK availability.&lt;br /&gt;
*MZ-80C- Featured an improved keyboard and 48KB of memory.&lt;br /&gt;
*Powertran PSI Comp 80 - Wireless World Z80&lt;br /&gt;
&lt;br /&gt;
=== Considerations ===&lt;br /&gt;
&lt;br /&gt;
*VAX&lt;br /&gt;
*DEC&lt;br /&gt;
*Prime Computers&lt;br /&gt;
*Cromemco systems (late 1970s) — S-100 family machines, imported to the UK.  &lt;br /&gt;
*Zenith assembled systems (via dealers).   &lt;br /&gt;
*Sord&lt;br /&gt;
*Toshiba — available in UK through niche distributors.&lt;br /&gt;
*Data General — popular 16-bit minicomputer, sold in UK.   &lt;br /&gt;
*Honeywell&lt;br /&gt;
*Burroughs&lt;br /&gt;
*Univac&lt;br /&gt;
&lt;br /&gt;
== Sources ==&lt;br /&gt;
&lt;br /&gt;
* Centre for Computing History (UK)   &lt;br /&gt;
* Science Museum Group (UK) — Nascom and other UK machines   &lt;br /&gt;
* Contemporary records: MK14, Acorn System 1, Nascom, Microtan-65, Compukit UK101   &lt;br /&gt;
* DEC PDP-11 and other minicomputers in UK use   &lt;br /&gt;
* ICL in UK&lt;/div&gt;</summary>
		<author><name>John</name></author>
	</entry>
	<entry>
		<id>https://wiki.glasstty.com/index.php?title=Pre-1980_Personal_and_Home_Computers&amp;diff=427</id>
		<title>Pre-1980 Personal and Home Computers</title>
		<link rel="alternate" type="text/html" href="https://wiki.glasstty.com/index.php?title=Pre-1980_Personal_and_Home_Computers&amp;diff=427"/>
		<updated>2025-10-02T15:50:38Z</updated>

		<summary type="html">&lt;p&gt;John: /* 1961 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
&lt;br /&gt;
What follows is a list of personal computers available to the public in one form or another to members of the public. The term Personal Computer in this context refers to a general purpose computer that was designed to be used by a single person typically in their home or place of work or study.&lt;br /&gt;
&lt;br /&gt;
=== 1958 ===&lt;br /&gt;
&lt;br /&gt;
*Elliot 801&lt;br /&gt;
&lt;br /&gt;
=== 1959 ===&lt;br /&gt;
&lt;br /&gt;
==== DEC PDP 1 ====&lt;br /&gt;
&lt;br /&gt;
The company’s first Programmed Data Processor, the PDP-1 computer used DIGITAL’s own system modules, which came from the existing range of 1OMC logic released in late 1959. The first PDP-1, delivered in December 1959, was a high speed, 18.bit, small computer capable of addressing 32K of core memoy. An average configuration cost $120,000 in an era when most computer systems were sold for a million dollars or more. [1]&lt;br /&gt;
&lt;br /&gt;
Standard peripherals included a paper tape reader and punch, and a terminal. Optional peripherals included graphics displays, a light pen, line printer, punched card reader and punch, and magnetic tape controller and drives. [2]&lt;br /&gt;
&lt;br /&gt;
A PDP-1 at MIT's RLE served as the nucleus for early hacker culture at MIT, including for the first video game, Spacewar!. The PDP-1/D at BBN was much used in the early ARPANET work; both for software development, and as the Network Control Center's first machine. [2]&lt;br /&gt;
&lt;br /&gt;
[1] &amp;quot;DEC 1957 to the Present&amp;quot; p.3&lt;br /&gt;
[2] https://gunkies.org/wiki/PDP-1&lt;br /&gt;
&lt;br /&gt;
=== 1960 ===&lt;br /&gt;
&lt;br /&gt;
Elliott 803&lt;br /&gt;
&lt;br /&gt;
=== 1962 ===&lt;br /&gt;
&lt;br /&gt;
*Linc - Personal Minicomputer&lt;br /&gt;
&lt;br /&gt;
=== 1967 ===&lt;br /&gt;
&lt;br /&gt;
*Wireless World Computer = Transistor based Computer from Wireless World Magazine (August 1967)&lt;br /&gt;
&lt;br /&gt;
=== 1970 ===&lt;br /&gt;
&lt;br /&gt;
*Datapoint (CTC) 2200 - TTL Computer&lt;br /&gt;
*ICL 1900 series — British mainframes, widely deployed.   &lt;br /&gt;
*Data General Nova — imported 16-bit minicomputer.   &lt;br /&gt;
*DEC PDP-11/20 — first PDP-11 systems reached UK universities/labs.   &lt;br /&gt;
&lt;br /&gt;
=== 1971 ===&lt;br /&gt;
&lt;br /&gt;
*HP 2100A minicomputer — available via HP UK offices.  &lt;br /&gt;
*Interdata 7/16 — 16-bit minicomputer, sold in UK.  &lt;br /&gt;
*Kenbak 1 - First Personal Computer ?&lt;br /&gt;
*Intel SIM4-01&lt;br /&gt;
*Intel SIM4-02&lt;br /&gt;
&lt;br /&gt;
=== 1972 ===&lt;br /&gt;
&lt;br /&gt;
*DEC PDP-11/40 — expanded PDP-11 family in UK use.  &lt;br /&gt;
*IBM System/3 — midrange systems shipped to UK businesses.   &lt;br /&gt;
*QI Corporation Q1&lt;br /&gt;
*IBM SCAMP (1972/1973)&lt;br /&gt;
*Intel SIM8-01&lt;br /&gt;
&lt;br /&gt;
=== 1973 ===&lt;br /&gt;
&lt;br /&gt;
*Wang 2200 — BASIC desktop computer, imported to UK.  &lt;br /&gt;
*ICL 2900 series — launched as successor to 1900 series.   &lt;br /&gt;
*R2E MicralN - French computer&lt;br /&gt;
*Intel Intellec&lt;br /&gt;
*Xerox Alto&lt;br /&gt;
*Xerox Star&lt;br /&gt;
&lt;br /&gt;
=== 1974 ===&lt;br /&gt;
&lt;br /&gt;
*Mark-8 (kit, Intel 8008) — hobbyist kit plans; some built in UK by enthusiasts.  &lt;br /&gt;
*DEC PDP-11/34 — later PDP-11s became standard in UK universities.  &lt;br /&gt;
*RCA Fred/Cosmac&lt;br /&gt;
*Mark 8 - Radio and Electronics&lt;br /&gt;
*QI Corporation Q1/Lite&lt;br /&gt;
*QI Corporation Q1/MicroLite&lt;br /&gt;
&lt;br /&gt;
=== 1975 ===&lt;br /&gt;
&lt;br /&gt;
*MITS Altair 8800 (kit) — available via import/mail order in UK.   &lt;br /&gt;
*IMSAI 8080 (kit) — Altair-compatible S-100 system, imported.   &lt;br /&gt;
*Sphere 1 — limited UK import.  &lt;br /&gt;
*SWTPC 6800 (kit) — Motorola-based system available through UK distributors.&lt;br /&gt;
*IBM 5100&lt;br /&gt;
&lt;br /&gt;
=== 1976 ===&lt;br /&gt;
&lt;br /&gt;
*Processor Technology SOL-20 — first pre-assembled micro, imported to UK.  &lt;br /&gt;
*MOS Technology KIM-1 (single board) — popular among UK hobbyists.   &lt;br /&gt;
*Polymorphic Systems Poly-88 — some UK availability via specialist dealers.  &lt;br /&gt;
*Digital Group machines — imported modular kits.  &lt;br /&gt;
*Bywood Scrumpy - The first single-board computer kit made in the UK.&lt;br /&gt;
*Apple 1&lt;br /&gt;
*Cosmac Elf - Magazine/Kit&lt;br /&gt;
*Motorola MEK6800D2 - Development board.&lt;br /&gt;
*MPT 8080 Microtutor&lt;br /&gt;
&lt;br /&gt;
=== 1977 ===&lt;br /&gt;
&lt;br /&gt;
*Apple II — began UK distribution.   &lt;br /&gt;
*Commodore PET 2001 — available in UK education/business.   &lt;br /&gt;
*TRS-80 Model I — sold by Tandy in UK stores.   &lt;br /&gt;
*Heathkit H8 (kit) — obtainable in UK.   &lt;br /&gt;
*Science of Cambridge MK14 (kit) — UK-only.   &lt;br /&gt;
*Nascom-1 (kit) — British single-board kit, launched late 1977.&lt;br /&gt;
*System 68 - ETI Magazine&lt;br /&gt;
&lt;br /&gt;
=== 1978 ===&lt;br /&gt;
&lt;br /&gt;
*Nascom-2 (kit) — enhanced British micro.  &lt;br /&gt;
*Ohio Scientific Superboard II — imported; inspired the UK101.  &lt;br /&gt;
*Exidy Sorcerer — some units imported to UK.  &lt;br /&gt;
*Cromemco Z-2 — S-100 business micro, UK dealer support.  &lt;br /&gt;
*NorthStar Horizon — floppy-based micro, sold in UK.  &lt;br /&gt;
*Vector Graphic 1 — CP/M micro, available through importers.&lt;br /&gt;
*MZ-80K — An all-in-one unit with keyboard.&lt;br /&gt;
*Transam Triton - ETI&lt;br /&gt;
*Rockwell Aim-65&lt;br /&gt;
*Synertek Sym-1&lt;br /&gt;
*Intel SDK-85&lt;br /&gt;
*IBM 5110&lt;br /&gt;
&lt;br /&gt;
=== 1979 ===&lt;br /&gt;
&lt;br /&gt;
*Acorn System 1 (kit/assembled) — first Acorn computer, UK.   &lt;br /&gt;
*Tangerine Microtan-65 (kit) — 6502 kit, UK release.   &lt;br /&gt;
*Compukit UK101 (kit) — UK clone of OSI Superboard II.   &lt;br /&gt;
*Atari 400 / 800 — home micros, UK launch late 1979.  &lt;br /&gt;
*Texas Instruments TI-99/4 — imported to UK in 1979.  &lt;br /&gt;
*Intertec Superbrain — business-oriented CP/M micro, available in UK.  &lt;br /&gt;
*Compucolor II — colour micro, limited UK availability.&lt;br /&gt;
*MZ-80C- Featured an improved keyboard and 48KB of memory.&lt;br /&gt;
*Powertran PSI Comp 80 - Wireless World Z80&lt;br /&gt;
&lt;br /&gt;
=== Considerations ===&lt;br /&gt;
&lt;br /&gt;
*VAX&lt;br /&gt;
*DEC&lt;br /&gt;
*Prime Computers&lt;br /&gt;
*Cromemco systems (late 1970s) — S-100 family machines, imported to the UK.  &lt;br /&gt;
*Zenith assembled systems (via dealers).   &lt;br /&gt;
*Sord&lt;br /&gt;
*Toshiba — available in UK through niche distributors.&lt;br /&gt;
*Data General — popular 16-bit minicomputer, sold in UK.   &lt;br /&gt;
*Honeywell&lt;br /&gt;
*Burroughs&lt;br /&gt;
*Univac&lt;br /&gt;
&lt;br /&gt;
== Sources ==&lt;br /&gt;
&lt;br /&gt;
* Centre for Computing History (UK)   &lt;br /&gt;
* Science Museum Group (UK) — Nascom and other UK machines   &lt;br /&gt;
* Contemporary records: MK14, Acorn System 1, Nascom, Microtan-65, Compukit UK101   &lt;br /&gt;
* DEC PDP-11 and other minicomputers in UK use   &lt;br /&gt;
* ICL in UK&lt;/div&gt;</summary>
		<author><name>John</name></author>
	</entry>
	<entry>
		<id>https://wiki.glasstty.com/index.php?title=Pre-1980_Personal_and_Home_Computers&amp;diff=426</id>
		<title>Pre-1980 Personal and Home Computers</title>
		<link rel="alternate" type="text/html" href="https://wiki.glasstty.com/index.php?title=Pre-1980_Personal_and_Home_Computers&amp;diff=426"/>
		<updated>2025-10-02T15:50:15Z</updated>

		<summary type="html">&lt;p&gt;John: /* Introduction */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
&lt;br /&gt;
What follows is a list of personal computers available to the public in one form or another to members of the public. The term Personal Computer in this context refers to a general purpose computer that was designed to be used by a single person typically in their home or place of work or study.&lt;br /&gt;
&lt;br /&gt;
=== 1958 ===&lt;br /&gt;
&lt;br /&gt;
*Elliot 801&lt;br /&gt;
&lt;br /&gt;
=== 1959 ===&lt;br /&gt;
&lt;br /&gt;
==== DEC PDP 1 ====&lt;br /&gt;
&lt;br /&gt;
The company’s first Programmed Data Processor, the PDP-1 computer used DIGITAL’s own system modules, which came from the existing range of 1OMC logic released in late 1959. The first PDP-1, delivered in December 1959, was a high speed, 18.bit, small computer capable of addressing 32K of core memoy. An average configuration cost $120,000 in an era when most computer systems were sold for a million dollars or more. [1]&lt;br /&gt;
&lt;br /&gt;
Standard peripherals included a paper tape reader and punch, and a terminal. Optional peripherals included graphics displays, a light pen, line printer, punched card reader and punch, and magnetic tape controller and drives. [2]&lt;br /&gt;
&lt;br /&gt;
A PDP-1 at MIT's RLE served as the nucleus for early hacker culture at MIT, including for the first video game, Spacewar!. The PDP-1/D at BBN was much used in the early ARPANET work; both for software development, and as the Network Control Center's first machine. [2]&lt;br /&gt;
&lt;br /&gt;
[1] &amp;quot;DEC 1957 to the Present&amp;quot; p.3&lt;br /&gt;
[2] https://gunkies.org/wiki/PDP-1&lt;br /&gt;
&lt;br /&gt;
=== 1961 ===&lt;br /&gt;
&lt;br /&gt;
Elliott 803&lt;br /&gt;
&lt;br /&gt;
=== 1962 ===&lt;br /&gt;
&lt;br /&gt;
*Linc - Personal Minicomputer&lt;br /&gt;
&lt;br /&gt;
=== 1967 ===&lt;br /&gt;
&lt;br /&gt;
*Wireless World Computer = Transistor based Computer from Wireless World Magazine (August 1967)&lt;br /&gt;
&lt;br /&gt;
=== 1970 ===&lt;br /&gt;
&lt;br /&gt;
*Datapoint (CTC) 2200 - TTL Computer&lt;br /&gt;
*ICL 1900 series — British mainframes, widely deployed.   &lt;br /&gt;
*Data General Nova — imported 16-bit minicomputer.   &lt;br /&gt;
*DEC PDP-11/20 — first PDP-11 systems reached UK universities/labs.   &lt;br /&gt;
&lt;br /&gt;
=== 1971 ===&lt;br /&gt;
&lt;br /&gt;
*HP 2100A minicomputer — available via HP UK offices.  &lt;br /&gt;
*Interdata 7/16 — 16-bit minicomputer, sold in UK.  &lt;br /&gt;
*Kenbak 1 - First Personal Computer ?&lt;br /&gt;
*Intel SIM4-01&lt;br /&gt;
*Intel SIM4-02&lt;br /&gt;
&lt;br /&gt;
=== 1972 ===&lt;br /&gt;
&lt;br /&gt;
*DEC PDP-11/40 — expanded PDP-11 family in UK use.  &lt;br /&gt;
*IBM System/3 — midrange systems shipped to UK businesses.   &lt;br /&gt;
*QI Corporation Q1&lt;br /&gt;
*IBM SCAMP (1972/1973)&lt;br /&gt;
*Intel SIM8-01&lt;br /&gt;
&lt;br /&gt;
=== 1973 ===&lt;br /&gt;
&lt;br /&gt;
*Wang 2200 — BASIC desktop computer, imported to UK.  &lt;br /&gt;
*ICL 2900 series — launched as successor to 1900 series.   &lt;br /&gt;
*R2E MicralN - French computer&lt;br /&gt;
*Intel Intellec&lt;br /&gt;
*Xerox Alto&lt;br /&gt;
*Xerox Star&lt;br /&gt;
&lt;br /&gt;
=== 1974 ===&lt;br /&gt;
&lt;br /&gt;
*Mark-8 (kit, Intel 8008) — hobbyist kit plans; some built in UK by enthusiasts.  &lt;br /&gt;
*DEC PDP-11/34 — later PDP-11s became standard in UK universities.  &lt;br /&gt;
*RCA Fred/Cosmac&lt;br /&gt;
*Mark 8 - Radio and Electronics&lt;br /&gt;
*QI Corporation Q1/Lite&lt;br /&gt;
*QI Corporation Q1/MicroLite&lt;br /&gt;
&lt;br /&gt;
=== 1975 ===&lt;br /&gt;
&lt;br /&gt;
*MITS Altair 8800 (kit) — available via import/mail order in UK.   &lt;br /&gt;
*IMSAI 8080 (kit) — Altair-compatible S-100 system, imported.   &lt;br /&gt;
*Sphere 1 — limited UK import.  &lt;br /&gt;
*SWTPC 6800 (kit) — Motorola-based system available through UK distributors.&lt;br /&gt;
*IBM 5100&lt;br /&gt;
&lt;br /&gt;
=== 1976 ===&lt;br /&gt;
&lt;br /&gt;
*Processor Technology SOL-20 — first pre-assembled micro, imported to UK.  &lt;br /&gt;
*MOS Technology KIM-1 (single board) — popular among UK hobbyists.   &lt;br /&gt;
*Polymorphic Systems Poly-88 — some UK availability via specialist dealers.  &lt;br /&gt;
*Digital Group machines — imported modular kits.  &lt;br /&gt;
*Bywood Scrumpy - The first single-board computer kit made in the UK.&lt;br /&gt;
*Apple 1&lt;br /&gt;
*Cosmac Elf - Magazine/Kit&lt;br /&gt;
*Motorola MEK6800D2 - Development board.&lt;br /&gt;
*MPT 8080 Microtutor&lt;br /&gt;
&lt;br /&gt;
=== 1977 ===&lt;br /&gt;
&lt;br /&gt;
*Apple II — began UK distribution.   &lt;br /&gt;
*Commodore PET 2001 — available in UK education/business.   &lt;br /&gt;
*TRS-80 Model I — sold by Tandy in UK stores.   &lt;br /&gt;
*Heathkit H8 (kit) — obtainable in UK.   &lt;br /&gt;
*Science of Cambridge MK14 (kit) — UK-only.   &lt;br /&gt;
*Nascom-1 (kit) — British single-board kit, launched late 1977.&lt;br /&gt;
*System 68 - ETI Magazine&lt;br /&gt;
&lt;br /&gt;
=== 1978 ===&lt;br /&gt;
&lt;br /&gt;
*Nascom-2 (kit) — enhanced British micro.  &lt;br /&gt;
*Ohio Scientific Superboard II — imported; inspired the UK101.  &lt;br /&gt;
*Exidy Sorcerer — some units imported to UK.  &lt;br /&gt;
*Cromemco Z-2 — S-100 business micro, UK dealer support.  &lt;br /&gt;
*NorthStar Horizon — floppy-based micro, sold in UK.  &lt;br /&gt;
*Vector Graphic 1 — CP/M micro, available through importers.&lt;br /&gt;
*MZ-80K — An all-in-one unit with keyboard.&lt;br /&gt;
*Transam Triton - ETI&lt;br /&gt;
*Rockwell Aim-65&lt;br /&gt;
*Synertek Sym-1&lt;br /&gt;
*Intel SDK-85&lt;br /&gt;
*IBM 5110&lt;br /&gt;
&lt;br /&gt;
=== 1979 ===&lt;br /&gt;
&lt;br /&gt;
*Acorn System 1 (kit/assembled) — first Acorn computer, UK.   &lt;br /&gt;
*Tangerine Microtan-65 (kit) — 6502 kit, UK release.   &lt;br /&gt;
*Compukit UK101 (kit) — UK clone of OSI Superboard II.   &lt;br /&gt;
*Atari 400 / 800 — home micros, UK launch late 1979.  &lt;br /&gt;
*Texas Instruments TI-99/4 — imported to UK in 1979.  &lt;br /&gt;
*Intertec Superbrain — business-oriented CP/M micro, available in UK.  &lt;br /&gt;
*Compucolor II — colour micro, limited UK availability.&lt;br /&gt;
*MZ-80C- Featured an improved keyboard and 48KB of memory.&lt;br /&gt;
*Powertran PSI Comp 80 - Wireless World Z80&lt;br /&gt;
&lt;br /&gt;
=== Considerations ===&lt;br /&gt;
&lt;br /&gt;
*VAX&lt;br /&gt;
*DEC&lt;br /&gt;
*Prime Computers&lt;br /&gt;
*Cromemco systems (late 1970s) — S-100 family machines, imported to the UK.  &lt;br /&gt;
*Zenith assembled systems (via dealers).   &lt;br /&gt;
*Sord&lt;br /&gt;
*Toshiba — available in UK through niche distributors.&lt;br /&gt;
*Data General — popular 16-bit minicomputer, sold in UK.   &lt;br /&gt;
*Honeywell&lt;br /&gt;
*Burroughs&lt;br /&gt;
*Univac&lt;br /&gt;
&lt;br /&gt;
== Sources ==&lt;br /&gt;
&lt;br /&gt;
* Centre for Computing History (UK)   &lt;br /&gt;
* Science Museum Group (UK) — Nascom and other UK machines   &lt;br /&gt;
* Contemporary records: MK14, Acorn System 1, Nascom, Microtan-65, Compukit UK101   &lt;br /&gt;
* DEC PDP-11 and other minicomputers in UK use   &lt;br /&gt;
* ICL in UK&lt;/div&gt;</summary>
		<author><name>John</name></author>
	</entry>
	<entry>
		<id>https://wiki.glasstty.com/index.php?title=Pre-1980_Personal_and_Home_Computers&amp;diff=425</id>
		<title>Pre-1980 Personal and Home Computers</title>
		<link rel="alternate" type="text/html" href="https://wiki.glasstty.com/index.php?title=Pre-1980_Personal_and_Home_Computers&amp;diff=425"/>
		<updated>2025-10-02T15:49:32Z</updated>

		<summary type="html">&lt;p&gt;John: /* 1962 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
&lt;br /&gt;
What follows is a list of personal computers available to the public in one form or another to members of the public. The term Personal Computer in this context refers to a general purpose computer that was designed to be used by a single person typically in their home or place of work or study.&lt;br /&gt;
&lt;br /&gt;
=== 1959 ===&lt;br /&gt;
&lt;br /&gt;
==== DEC PDP 1 ====&lt;br /&gt;
&lt;br /&gt;
The company’s first Programmed Data Processor, the PDP-1 computer used DIGITAL’s own system modules, which came from the existing range of 1OMC logic released in late 1959. The first PDP-1, delivered in December 1959, was a high speed, 18.bit, small computer capable of addressing 32K of core memoy. An average configuration cost $120,000 in an era when most computer systems were sold for a million dollars or more. [1]&lt;br /&gt;
&lt;br /&gt;
Standard peripherals included a paper tape reader and punch, and a terminal. Optional peripherals included graphics displays, a light pen, line printer, punched card reader and punch, and magnetic tape controller and drives. [2]&lt;br /&gt;
&lt;br /&gt;
A PDP-1 at MIT's RLE served as the nucleus for early hacker culture at MIT, including for the first video game, Spacewar!. The PDP-1/D at BBN was much used in the early ARPANET work; both for software development, and as the Network Control Center's first machine. [2]&lt;br /&gt;
&lt;br /&gt;
[1] &amp;quot;DEC 1957 to the Present&amp;quot; p.3&lt;br /&gt;
[2] https://gunkies.org/wiki/PDP-1&lt;br /&gt;
&lt;br /&gt;
=== 1961 ===&lt;br /&gt;
&lt;br /&gt;
Elliott 803&lt;br /&gt;
&lt;br /&gt;
=== 1962 ===&lt;br /&gt;
&lt;br /&gt;
*Linc - Personal Minicomputer&lt;br /&gt;
&lt;br /&gt;
=== 1967 ===&lt;br /&gt;
&lt;br /&gt;
*Wireless World Computer = Transistor based Computer from Wireless World Magazine (August 1967)&lt;br /&gt;
&lt;br /&gt;
=== 1970 ===&lt;br /&gt;
&lt;br /&gt;
*Datapoint (CTC) 2200 - TTL Computer&lt;br /&gt;
*ICL 1900 series — British mainframes, widely deployed.   &lt;br /&gt;
*Data General Nova — imported 16-bit minicomputer.   &lt;br /&gt;
*DEC PDP-11/20 — first PDP-11 systems reached UK universities/labs.   &lt;br /&gt;
&lt;br /&gt;
=== 1971 ===&lt;br /&gt;
&lt;br /&gt;
*HP 2100A minicomputer — available via HP UK offices.  &lt;br /&gt;
*Interdata 7/16 — 16-bit minicomputer, sold in UK.  &lt;br /&gt;
*Kenbak 1 - First Personal Computer ?&lt;br /&gt;
*Intel SIM4-01&lt;br /&gt;
*Intel SIM4-02&lt;br /&gt;
&lt;br /&gt;
=== 1972 ===&lt;br /&gt;
&lt;br /&gt;
*DEC PDP-11/40 — expanded PDP-11 family in UK use.  &lt;br /&gt;
*IBM System/3 — midrange systems shipped to UK businesses.   &lt;br /&gt;
*QI Corporation Q1&lt;br /&gt;
*IBM SCAMP (1972/1973)&lt;br /&gt;
*Intel SIM8-01&lt;br /&gt;
&lt;br /&gt;
=== 1973 ===&lt;br /&gt;
&lt;br /&gt;
*Wang 2200 — BASIC desktop computer, imported to UK.  &lt;br /&gt;
*ICL 2900 series — launched as successor to 1900 series.   &lt;br /&gt;
*R2E MicralN - French computer&lt;br /&gt;
*Intel Intellec&lt;br /&gt;
*Xerox Alto&lt;br /&gt;
*Xerox Star&lt;br /&gt;
&lt;br /&gt;
=== 1974 ===&lt;br /&gt;
&lt;br /&gt;
*Mark-8 (kit, Intel 8008) — hobbyist kit plans; some built in UK by enthusiasts.  &lt;br /&gt;
*DEC PDP-11/34 — later PDP-11s became standard in UK universities.  &lt;br /&gt;
*RCA Fred/Cosmac&lt;br /&gt;
*Mark 8 - Radio and Electronics&lt;br /&gt;
*QI Corporation Q1/Lite&lt;br /&gt;
*QI Corporation Q1/MicroLite&lt;br /&gt;
&lt;br /&gt;
=== 1975 ===&lt;br /&gt;
&lt;br /&gt;
*MITS Altair 8800 (kit) — available via import/mail order in UK.   &lt;br /&gt;
*IMSAI 8080 (kit) — Altair-compatible S-100 system, imported.   &lt;br /&gt;
*Sphere 1 — limited UK import.  &lt;br /&gt;
*SWTPC 6800 (kit) — Motorola-based system available through UK distributors.&lt;br /&gt;
*IBM 5100&lt;br /&gt;
&lt;br /&gt;
=== 1976 ===&lt;br /&gt;
&lt;br /&gt;
*Processor Technology SOL-20 — first pre-assembled micro, imported to UK.  &lt;br /&gt;
*MOS Technology KIM-1 (single board) — popular among UK hobbyists.   &lt;br /&gt;
*Polymorphic Systems Poly-88 — some UK availability via specialist dealers.  &lt;br /&gt;
*Digital Group machines — imported modular kits.  &lt;br /&gt;
*Bywood Scrumpy - The first single-board computer kit made in the UK.&lt;br /&gt;
*Apple 1&lt;br /&gt;
*Cosmac Elf - Magazine/Kit&lt;br /&gt;
*Motorola MEK6800D2 - Development board.&lt;br /&gt;
*MPT 8080 Microtutor&lt;br /&gt;
&lt;br /&gt;
=== 1977 ===&lt;br /&gt;
&lt;br /&gt;
*Apple II — began UK distribution.   &lt;br /&gt;
*Commodore PET 2001 — available in UK education/business.   &lt;br /&gt;
*TRS-80 Model I — sold by Tandy in UK stores.   &lt;br /&gt;
*Heathkit H8 (kit) — obtainable in UK.   &lt;br /&gt;
*Science of Cambridge MK14 (kit) — UK-only.   &lt;br /&gt;
*Nascom-1 (kit) — British single-board kit, launched late 1977.&lt;br /&gt;
*System 68 - ETI Magazine&lt;br /&gt;
&lt;br /&gt;
=== 1978 ===&lt;br /&gt;
&lt;br /&gt;
*Nascom-2 (kit) — enhanced British micro.  &lt;br /&gt;
*Ohio Scientific Superboard II — imported; inspired the UK101.  &lt;br /&gt;
*Exidy Sorcerer — some units imported to UK.  &lt;br /&gt;
*Cromemco Z-2 — S-100 business micro, UK dealer support.  &lt;br /&gt;
*NorthStar Horizon — floppy-based micro, sold in UK.  &lt;br /&gt;
*Vector Graphic 1 — CP/M micro, available through importers.&lt;br /&gt;
*MZ-80K — An all-in-one unit with keyboard.&lt;br /&gt;
*Transam Triton - ETI&lt;br /&gt;
*Rockwell Aim-65&lt;br /&gt;
*Synertek Sym-1&lt;br /&gt;
*Intel SDK-85&lt;br /&gt;
*IBM 5110&lt;br /&gt;
&lt;br /&gt;
=== 1979 ===&lt;br /&gt;
&lt;br /&gt;
*Acorn System 1 (kit/assembled) — first Acorn computer, UK.   &lt;br /&gt;
*Tangerine Microtan-65 (kit) — 6502 kit, UK release.   &lt;br /&gt;
*Compukit UK101 (kit) — UK clone of OSI Superboard II.   &lt;br /&gt;
*Atari 400 / 800 — home micros, UK launch late 1979.  &lt;br /&gt;
*Texas Instruments TI-99/4 — imported to UK in 1979.  &lt;br /&gt;
*Intertec Superbrain — business-oriented CP/M micro, available in UK.  &lt;br /&gt;
*Compucolor II — colour micro, limited UK availability.&lt;br /&gt;
*MZ-80C- Featured an improved keyboard and 48KB of memory.&lt;br /&gt;
*Powertran PSI Comp 80 - Wireless World Z80&lt;br /&gt;
&lt;br /&gt;
=== Considerations ===&lt;br /&gt;
&lt;br /&gt;
*VAX&lt;br /&gt;
*DEC&lt;br /&gt;
*Prime Computers&lt;br /&gt;
*Cromemco systems (late 1970s) — S-100 family machines, imported to the UK.  &lt;br /&gt;
*Zenith assembled systems (via dealers).   &lt;br /&gt;
*Sord&lt;br /&gt;
*Toshiba — available in UK through niche distributors.&lt;br /&gt;
*Data General — popular 16-bit minicomputer, sold in UK.   &lt;br /&gt;
*Honeywell&lt;br /&gt;
*Burroughs&lt;br /&gt;
*Univac&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Sources ==&lt;br /&gt;
&lt;br /&gt;
* Centre for Computing History (UK)   &lt;br /&gt;
* Science Museum Group (UK) — Nascom and other UK machines   &lt;br /&gt;
* Contemporary records: MK14, Acorn System 1, Nascom, Microtan-65, Compukit UK101   &lt;br /&gt;
* DEC PDP-11 and other minicomputers in UK use   &lt;br /&gt;
* ICL in UK&lt;/div&gt;</summary>
		<author><name>John</name></author>
	</entry>
	<entry>
		<id>https://wiki.glasstty.com/index.php?title=Pre-1980_Personal_and_Home_Computers&amp;diff=424</id>
		<title>Pre-1980 Personal and Home Computers</title>
		<link rel="alternate" type="text/html" href="https://wiki.glasstty.com/index.php?title=Pre-1980_Personal_and_Home_Computers&amp;diff=424"/>
		<updated>2025-09-29T22:02:47Z</updated>

		<summary type="html">&lt;p&gt;John: Created page with &amp;quot;==Introduction==  What follows is a list of personal computers available to the public in one form or another to members of the public. The term Personal Computer in this context refers to a general purpose computer that was designed to be used by a single person typically in their home or place of work or study.  === 1959 ===  ==== DEC PDP 1 ====  The company’s first Programmed Data Processor, the PDP-1 computer used DIGITAL’s own system modules, which came from the...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
&lt;br /&gt;
What follows is a list of personal computers available to the public in one form or another to members of the public. The term Personal Computer in this context refers to a general purpose computer that was designed to be used by a single person typically in their home or place of work or study.&lt;br /&gt;
&lt;br /&gt;
=== 1959 ===&lt;br /&gt;
&lt;br /&gt;
==== DEC PDP 1 ====&lt;br /&gt;
&lt;br /&gt;
The company’s first Programmed Data Processor, the PDP-1 computer used DIGITAL’s own system modules, which came from the existing range of 1OMC logic released in late 1959. The first PDP-1, delivered in December 1959, was a high speed, 18.bit, small computer capable of addressing 32K of core memoy. An average configuration cost $120,000 in an era when most computer systems were sold for a million dollars or more. [1]&lt;br /&gt;
&lt;br /&gt;
Standard peripherals included a paper tape reader and punch, and a terminal. Optional peripherals included graphics displays, a light pen, line printer, punched card reader and punch, and magnetic tape controller and drives. [2]&lt;br /&gt;
&lt;br /&gt;
A PDP-1 at MIT's RLE served as the nucleus for early hacker culture at MIT, including for the first video game, Spacewar!. The PDP-1/D at BBN was much used in the early ARPANET work; both for software development, and as the Network Control Center's first machine. [2]&lt;br /&gt;
&lt;br /&gt;
[1] &amp;quot;DEC 1957 to the Present&amp;quot; p.3&lt;br /&gt;
[2] https://gunkies.org/wiki/PDP-1&lt;br /&gt;
&lt;br /&gt;
=== 1962 ===&lt;br /&gt;
&lt;br /&gt;
*Linc - Personal Minicomputer&lt;br /&gt;
&lt;br /&gt;
=== 1967 ===&lt;br /&gt;
&lt;br /&gt;
*Wireless World Computer = Transistor based Computer from Wireless World Magazine (August 1967)&lt;br /&gt;
&lt;br /&gt;
=== 1970 ===&lt;br /&gt;
&lt;br /&gt;
*Datapoint (CTC) 2200 - TTL Computer&lt;br /&gt;
*ICL 1900 series — British mainframes, widely deployed.   &lt;br /&gt;
*Data General Nova — imported 16-bit minicomputer.   &lt;br /&gt;
*DEC PDP-11/20 — first PDP-11 systems reached UK universities/labs.   &lt;br /&gt;
&lt;br /&gt;
=== 1971 ===&lt;br /&gt;
&lt;br /&gt;
*HP 2100A minicomputer — available via HP UK offices.  &lt;br /&gt;
*Interdata 7/16 — 16-bit minicomputer, sold in UK.  &lt;br /&gt;
*Kenbak 1 - First Personal Computer ?&lt;br /&gt;
*Intel SIM4-01&lt;br /&gt;
*Intel SIM4-02&lt;br /&gt;
&lt;br /&gt;
=== 1972 ===&lt;br /&gt;
&lt;br /&gt;
*DEC PDP-11/40 — expanded PDP-11 family in UK use.  &lt;br /&gt;
*IBM System/3 — midrange systems shipped to UK businesses.   &lt;br /&gt;
*QI Corporation Q1&lt;br /&gt;
*IBM SCAMP (1972/1973)&lt;br /&gt;
*Intel SIM8-01&lt;br /&gt;
&lt;br /&gt;
=== 1973 ===&lt;br /&gt;
&lt;br /&gt;
*Wang 2200 — BASIC desktop computer, imported to UK.  &lt;br /&gt;
*ICL 2900 series — launched as successor to 1900 series.   &lt;br /&gt;
*R2E MicralN - French computer&lt;br /&gt;
*Intel Intellec&lt;br /&gt;
*Xerox Alto&lt;br /&gt;
*Xerox Star&lt;br /&gt;
&lt;br /&gt;
=== 1974 ===&lt;br /&gt;
&lt;br /&gt;
*Mark-8 (kit, Intel 8008) — hobbyist kit plans; some built in UK by enthusiasts.  &lt;br /&gt;
*DEC PDP-11/34 — later PDP-11s became standard in UK universities.  &lt;br /&gt;
*RCA Fred/Cosmac&lt;br /&gt;
*Mark 8 - Radio and Electronics&lt;br /&gt;
*QI Corporation Q1/Lite&lt;br /&gt;
*QI Corporation Q1/MicroLite&lt;br /&gt;
&lt;br /&gt;
=== 1975 ===&lt;br /&gt;
&lt;br /&gt;
*MITS Altair 8800 (kit) — available via import/mail order in UK.   &lt;br /&gt;
*IMSAI 8080 (kit) — Altair-compatible S-100 system, imported.   &lt;br /&gt;
*Sphere 1 — limited UK import.  &lt;br /&gt;
*SWTPC 6800 (kit) — Motorola-based system available through UK distributors.&lt;br /&gt;
*IBM 5100&lt;br /&gt;
&lt;br /&gt;
=== 1976 ===&lt;br /&gt;
&lt;br /&gt;
*Processor Technology SOL-20 — first pre-assembled micro, imported to UK.  &lt;br /&gt;
*MOS Technology KIM-1 (single board) — popular among UK hobbyists.   &lt;br /&gt;
*Polymorphic Systems Poly-88 — some UK availability via specialist dealers.  &lt;br /&gt;
*Digital Group machines — imported modular kits.  &lt;br /&gt;
*Bywood Scrumpy - The first single-board computer kit made in the UK.&lt;br /&gt;
*Apple 1&lt;br /&gt;
*Cosmac Elf - Magazine/Kit&lt;br /&gt;
*Motorola MEK6800D2 - Development board.&lt;br /&gt;
*MPT 8080 Microtutor&lt;br /&gt;
&lt;br /&gt;
=== 1977 ===&lt;br /&gt;
&lt;br /&gt;
*Apple II — began UK distribution.   &lt;br /&gt;
*Commodore PET 2001 — available in UK education/business.   &lt;br /&gt;
*TRS-80 Model I — sold by Tandy in UK stores.   &lt;br /&gt;
*Heathkit H8 (kit) — obtainable in UK.   &lt;br /&gt;
*Science of Cambridge MK14 (kit) — UK-only.   &lt;br /&gt;
*Nascom-1 (kit) — British single-board kit, launched late 1977.&lt;br /&gt;
*System 68 - ETI Magazine&lt;br /&gt;
&lt;br /&gt;
=== 1978 ===&lt;br /&gt;
&lt;br /&gt;
*Nascom-2 (kit) — enhanced British micro.  &lt;br /&gt;
*Ohio Scientific Superboard II — imported; inspired the UK101.  &lt;br /&gt;
*Exidy Sorcerer — some units imported to UK.  &lt;br /&gt;
*Cromemco Z-2 — S-100 business micro, UK dealer support.  &lt;br /&gt;
*NorthStar Horizon — floppy-based micro, sold in UK.  &lt;br /&gt;
*Vector Graphic 1 — CP/M micro, available through importers.&lt;br /&gt;
*MZ-80K — An all-in-one unit with keyboard.&lt;br /&gt;
*Transam Triton - ETI&lt;br /&gt;
*Rockwell Aim-65&lt;br /&gt;
*Synertek Sym-1&lt;br /&gt;
*Intel SDK-85&lt;br /&gt;
*IBM 5110&lt;br /&gt;
&lt;br /&gt;
=== 1979 ===&lt;br /&gt;
&lt;br /&gt;
*Acorn System 1 (kit/assembled) — first Acorn computer, UK.   &lt;br /&gt;
*Tangerine Microtan-65 (kit) — 6502 kit, UK release.   &lt;br /&gt;
*Compukit UK101 (kit) — UK clone of OSI Superboard II.   &lt;br /&gt;
*Atari 400 / 800 — home micros, UK launch late 1979.  &lt;br /&gt;
*Texas Instruments TI-99/4 — imported to UK in 1979.  &lt;br /&gt;
*Intertec Superbrain — business-oriented CP/M micro, available in UK.  &lt;br /&gt;
*Compucolor II — colour micro, limited UK availability.&lt;br /&gt;
*MZ-80C- Featured an improved keyboard and 48KB of memory.&lt;br /&gt;
*Powertran PSI Comp 80 - Wireless World Z80&lt;br /&gt;
&lt;br /&gt;
=== Considerations ===&lt;br /&gt;
&lt;br /&gt;
*VAX&lt;br /&gt;
*DEC&lt;br /&gt;
*Prime Computers&lt;br /&gt;
*Cromemco systems (late 1970s) — S-100 family machines, imported to the UK.  &lt;br /&gt;
*Zenith assembled systems (via dealers).   &lt;br /&gt;
*Sord&lt;br /&gt;
*Toshiba — available in UK through niche distributors.&lt;br /&gt;
*Data General — popular 16-bit minicomputer, sold in UK.   &lt;br /&gt;
*Honeywell&lt;br /&gt;
*Burroughs&lt;br /&gt;
*Univac&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Sources ==&lt;br /&gt;
&lt;br /&gt;
* Centre for Computing History (UK)   &lt;br /&gt;
* Science Museum Group (UK) — Nascom and other UK machines   &lt;br /&gt;
* Contemporary records: MK14, Acorn System 1, Nascom, Microtan-65, Compukit UK101   &lt;br /&gt;
* DEC PDP-11 and other minicomputers in UK use   &lt;br /&gt;
* ICL in UK&lt;/div&gt;</summary>
		<author><name>John</name></author>
	</entry>
	<entry>
		<id>https://wiki.glasstty.com/index.php?title=Main_Page&amp;diff=423</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://wiki.glasstty.com/index.php?title=Main_Page&amp;diff=423"/>
		<updated>2025-09-29T22:02:19Z</updated>

		<summary type="html">&lt;p&gt;John: Changed redirect target from Pre-1980 Personal and home Computers to Pre-1980 Personal and Home Computers&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Pre-1980 Personal and Home Computers]]&lt;/div&gt;</summary>
		<author><name>John</name></author>
	</entry>
	<entry>
		<id>https://wiki.glasstty.com/index.php?title=Main_Page&amp;diff=419</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://wiki.glasstty.com/index.php?title=Main_Page&amp;diff=419"/>
		<updated>2025-09-29T17:39:32Z</updated>

		<summary type="html">&lt;p&gt;John: Changed redirect target from Computers Available to the Public in the UK during the 1970s to Pre-1980 Personal and home Computers&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Pre-1980 Personal and home Computers]]&lt;/div&gt;</summary>
		<author><name>John</name></author>
	</entry>
	<entry>
		<id>https://wiki.glasstty.com/index.php?title=Main_Page&amp;diff=361</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://wiki.glasstty.com/index.php?title=Main_Page&amp;diff=361"/>
		<updated>2025-09-20T09:59:41Z</updated>

		<summary type="html">&lt;p&gt;John: Changed redirect target from Telstar Viewdata System to Computers Available to the Public in the UK during the 1970s&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Computers Available to the Public in the UK during the 1970s]]&lt;/div&gt;</summary>
		<author><name>John</name></author>
	</entry>
	<entry>
		<id>https://wiki.glasstty.com/index.php?title=Routing&amp;diff=355</id>
		<title>Routing</title>
		<link rel="alternate" type="text/html" href="https://wiki.glasstty.com/index.php?title=Routing&amp;diff=355"/>
		<updated>2022-05-19T20:24:25Z</updated>

		<summary type="html">&lt;p&gt;John: /* Default Page Routing */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Navigation ==&lt;br /&gt;
&lt;br /&gt;
Routing in Telstar is handled by an asynchromous process that allows for routing to occur whilst pages are being rendered. This means that is a user of the system can navigate quickly to a desired page by simply entering the page number one character after another. Each successive key press will start the rendering of a page but as each subsequent key is pressed, the rendering is cancelled and the following page is rendered and so on until the desired page is rendered.&lt;br /&gt;
&lt;br /&gt;
For example simply pressing ''2 2 2'' from the main index page (Page 0a) of the Telstar service will result in the Guardians UK News being displayed. For this to work correctly, all intermediary pages must be present. Creating routes through the system such as the one described above, should be the aim when designing a videotex system.&lt;br /&gt;
&lt;br /&gt;
Users can jump directly to a known page by entering the page number using the format ''*page#'', for example, entering ''*92#'' into the current Telstar system will direct you to page 92.&lt;br /&gt;
&lt;br /&gt;
== Page Numbering ==&lt;br /&gt;
&lt;br /&gt;
Pages are defined by a single integer number between ''0'' and ''999999999''. Each page can have upto 26 frames denoted by the suffix ''a-z''. Therefore a frame denoted by for example ''222b'' would be the second frame of page ''222''.  The maximum page number length is 9 digits plus the frame suffix.&lt;br /&gt;
&lt;br /&gt;
== Zero Page Routing ==&lt;br /&gt;
&lt;br /&gt;
In cases where a page needs more than 26 frames such as a large Telesoftware program or where a large number of news articles extends beyond frame ''z'', a process of ''Zero Page Routing'' takes place. For example if a Guradian news article starting on frame ''222z'' needed a continuation frame, the frame ''2220a'' should be used. If articles continued to frame ''2220z'' and needed further continuation frames, frame ''22200a'' should be used and so on to the maximum page number length (see above).&lt;br /&gt;
&lt;br /&gt;
== Default Page Routing ==&lt;br /&gt;
&lt;br /&gt;
When frames are created an optional routing table can be assigned to the frame, (see [[Frames]]) this routing table defines what page is selected when a user enters a digit into their videotex client software.&lt;br /&gt;
&lt;br /&gt;
If a routing table is not defined within the frame, the default routing will be used, for example, pressing ''6'' whilst on page ''222'' will try and navigate to page ''2226'', if this page does not exist, this will return a ''Page Not Found'' message, similarly pressing ''7'' will try and navigate to ''2227'' and so on. In most cases the default routing will work well, however, when that isn't the case, the table can be created or updated manually as required.&lt;br /&gt;
&lt;br /&gt;
For example, the default routing table for page 222 would effectively be:&lt;br /&gt;
&lt;br /&gt;
    [2220, 2221, 2222, 2223, 2224, 2225, 2226, 2227, 2228, 2229, 222]&lt;br /&gt;
&lt;br /&gt;
Each entry represents a key press for example if the user presses a ''0'' then element zero is used and the user is routed to page 2220, entering a ''1'' would route the user to page 2221 etc. The last element, element 10, represents the routing when the *#* (Return Key) is entered.&lt;br /&gt;
&lt;br /&gt;
In most cases the default routing will work quite well, however, when that isn't the case, the table can be created or updated manually as required. Note that when a # is entered, the priority is that a follow on frame will always be selected if one exists.&lt;br /&gt;
&lt;br /&gt;
For example lets assume you have only 2 menu items, 1 and 2, and you want these to go to pages 1001 and 1002 instead of 2221 and 2222. The manually created routing table should look like this...&lt;br /&gt;
&lt;br /&gt;
    [1001, 1002, 2222, 2223, 2224, 2225, 2226, 2227, 2228, 2229, 222]&lt;br /&gt;
&lt;br /&gt;
If a use presses 3 the system will try and navigate to page 2223 which presumably will not exist (otherwise there would be a menu item for it) and return ''Page Not Found'' which is the correct behaviour. In other words simply define the standard routing table with any changes that are required.&lt;br /&gt;
&lt;br /&gt;
== Redirection ==&lt;br /&gt;
&lt;br /&gt;
There exists a special frame type that will allow a frame to redirect to another frame, for example the following frame redirects from page ''0a'' to ''9a'.&lt;br /&gt;
&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;pid&amp;quot;: {&lt;br /&gt;
        &amp;quot;page-no&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;frame-id&amp;quot;: &amp;quot;a&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;redirect&amp;quot;: {&lt;br /&gt;
        &amp;quot;page-no&amp;quot;: 9,&lt;br /&gt;
        &amp;quot;frame-id&amp;quot;: &amp;quot;a&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;visible&amp;quot;: true&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
See [[Frames]] for more information on frame redirects.&lt;/div&gt;</summary>
		<author><name>John</name></author>
	</entry>
	<entry>
		<id>https://wiki.glasstty.com/index.php?title=Frames&amp;diff=354</id>
		<title>Frames</title>
		<link rel="alternate" type="text/html" href="https://wiki.glasstty.com/index.php?title=Frames&amp;diff=354"/>
		<updated>2022-05-17T14:51:04Z</updated>

		<summary type="html">&lt;p&gt;John: /* Adding Frames to the System */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;As is typical with interactive videotex systems, pages are numbered from 0 to 999999999 and consist of one or more frames with the suffix a-z, for example the first frame for page 200 would be 200a, the second 200b and so on (see [[Routing]]) for more details). These frames are stored within TELSTAR's database as ''JSON'' objects (see https://www.json.org/) and uploaded to Telstar using a simple command line utility.&lt;br /&gt;
&lt;br /&gt;
The Telstar utility program simply interacts with the Telstar API which is a restful API. This can be used directly by any software making it simple to programitically manage pages and routing information.&lt;br /&gt;
&lt;br /&gt;
Frames are defined in JSON. The simplest frame that can be viewed on TELSTAR would be as follows. This would create a simple information frame with some flashing content. In this example [[Markup]] has been used within the content, however, other content types can be used including edi.tf urls, see below.&lt;br /&gt;
&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;pid&amp;quot;: {&lt;br /&gt;
        &amp;quot;page-no&amp;quot;: 101,&lt;br /&gt;
        &amp;quot;frame-id&amp;quot;: &amp;quot;a&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;visible&amp;quot;: true,&lt;br /&gt;
      &amp;quot;content&amp;quot;: {&lt;br /&gt;
        &amp;quot;data&amp;quot;: &amp;quot;[D]This is page[F]101a&amp;quot;,&lt;br /&gt;
         &amp;quot;type&amp;quot;: &amp;quot;markup&amp;quot;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Shown below is a more complete example of a JSON defined frame. With this particular frame, the actual viewdata content has been created using the editor at http://edit.tf, this can be seen in the ''content.data'' and ''content.type'' keys. Both the edit.tf and zxnet (https://zxnet.co.uk/teletext/editor/) editors are supported. The example below is a simple information page with some simple routing (see [[Routing]]). Clicking the ''content.data'' link, or pasteing the value into a browser will show the page and allow it to be edited. It is not necessary to use the http://edit.tf editor, this is just one possible option.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;pid&amp;quot;: {&lt;br /&gt;
        &amp;quot;page-no&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;frame-id&amp;quot;: &amp;quot;a&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;visible&amp;quot;: true,&lt;br /&gt;
      &amp;quot;frame-type&amp;quot;: &amp;quot;information&amp;quot;,&lt;br /&gt;
      &amp;quot;content&amp;quot;: {&lt;br /&gt;
        &amp;quot;data&amp;quot;: &amp;quot;http://edit.tf/#0:QIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQMMKAbNw6dyCTuyZfCBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgKJEiRIkSJEiRIkSJEiRIkSJEiRIkSJEiRIkSJEiRIkSJEiRAxQR4s6LSgzEEmdUi0otOogkzo0-lNg1JM-cCg8unNYgQIASBBj67OnXllWIMu7pl5dMOndty7uixBoy4dnTQsQIECBAgBIEHfLh2dNCDDuyINmnNl59POzKuQIECBAgQIECBAgQIECBAyQTotemggzoiCvFg1JEWkCnYemnfuw7EGHdkQIECBAgQIASBBp3dMvLdh6ad-7DsQbsvfmgw7siDvlw9NGXkuQIECBAgQM0EKrTkzotOmgkzo0-lNg1JM-cCh79vDDu8oMO7IgQIECAEgQYuvPTuy8-aDdl781wM6EjVKcVBMw9MvPogoctOPLzQIEDRBHn1otKdNizqiCTOjT6U2DUkz5wKlvw5OaxByw6dixAgBIEGHdkQUMPLZpw7cu7ouQIECBAgQIECBAgQIECBAgQIECBA2QR4NSLXg2UFOLSrSYcWmCnWKkWYsQVIsWNBsLEEOHMaIASBBh3ZEHTRlQQ9-zfz54diCHh7ZUGHJ2y7unXllXIECBAgQN0EifMkxINmmCqcsPbLsQYd2RBI37NOTD5QbsvfmuQIECBA4CHQc2TDpT50WogcMGCAScgoOnLTi69MqDpvQdNGnmgQIAaBBzy8u2nHlQd9PTQgqZdmXnvzdO-HllQYd2RBt38sq5AgQOQ0yfHQT40ZYgp2adSLNQSZ0aegTIKkWnUQUIMeLTQIECAokSJEiRIkSJEiRIkSJEiRIkSJEiRIkSJEiRIkSJEiRIkSJEFeLBqSItJBGn0osODTqIBIM6EQIEFDDnyoFTJywvoECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECA&amp;quot;,&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;edit.tf&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;routing-table&amp;quot;: [0,1,11,3,400,5,6,7,800,9,0],&lt;br /&gt;
      &amp;quot;cursor&amp;quot;: false,&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
== Adding Frames to the System ==&lt;br /&gt;
&lt;br /&gt;
Frames can be added to the system using the [[the Telstar API]].&lt;br /&gt;
&lt;br /&gt;
The Telstar API, in conjunction with the cross platform Telstar Util software, provides a simple method of creating and managing pages.&lt;br /&gt;
&lt;br /&gt;
The API can be used to retrieve and update frames and configuring routing. The API is a restful API that uses the GET, PUT, POST and DELETE HTTP methods and as such can be used from any application.&lt;br /&gt;
&lt;br /&gt;
Data is passed to and from the API in JSON format, making the system very simple to use in any programming language. The whole API could be used without any programming at all by using a command line utility such as CURL.&lt;br /&gt;
&lt;br /&gt;
''Further details of the Telstar API can be found in the section [[The Telstar API]].''&lt;br /&gt;
&lt;br /&gt;
== Adding Content with the Edit.tf editor ==&lt;br /&gt;
&lt;br /&gt;
There are several ways to add content to a page. One of the easiest is to create the page in an editor such as http://edit.tf.&lt;br /&gt;
&lt;br /&gt;
The JSON file would look something like the one showm below. Note that the content type is set to editf and the content data contains the edit.tf url.&lt;br /&gt;
&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;pid&amp;quot;: {&lt;br /&gt;
            &amp;quot;page-no&amp;quot;: 101,&lt;br /&gt;
            &amp;quot;frame-id&amp;quot;: &amp;quot;a&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;visible&amp;quot;: true,&lt;br /&gt;
        &amp;quot;frame-type&amp;quot;: &amp;quot;information&amp;quot;,&lt;br /&gt;
        &amp;quot;content&amp;quot;: {&lt;br /&gt;
            &amp;quot;data&amp;quot;: &amp;quot;http://edit.tf/#0:QIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQICn_OmTJkSJApUqVKlSpUlcHApiTJkyZEiRIkyZMmTIkSJFmKf3JX58____RBg-fPnzog__2iBBo-fNX9qgQcOHDh8-fGiAp_zFf______2v7_____7X___oEGr__Qa0ur_________QoCn9ywK__6D__a__7dH__tf___1QIv_9AiQIkaPX_bo0aMpiKf_-Yr__oP_9r__tUH_-1____9og__yjnz5cldX9qUc-fPkp__uSv_-g__2v_-1Qf_7X__aIv____KZv_dIV__2pTN___yn__mK___z__a____5__tf_9qgVf__8o5_vWJX__alHP___Kf_7kr____6dBr_____-h__2qBBr__ymbPnSFf69CUzf__8pnz5iq9ejRoECBWvXr0KBGjQYOHBHz4cECBAgwcCily7__yqDhw4ePnzogQeP7RAg0fPiBB___9X___QYPH___-sCmb__KoP________3B__tUCDV__tUH___1f36XB-_______KOf_8qgRo__9B__v9X___QINX___Qav__B8-NNX_-jR___8pm__ymYrq______h_odX9qg1f___7q__9X_-h1f_5TBgwYM37__KOSur-_Ro0Pr_8_f_qDV_b___r__1f_6D___lFKlSpUu__8pmK_v7VAgwf______tNX9r______V__oP__-gQaPnwpm__yqDB__tUCD__QIEG___1f2qL____9X_-g____z5-__ymb__KoNX_-lQKl6VAgQav6_V__oNf___1f2qBX_____9-hKOf_8qgVJ0JRw4cOPLkqiQoESNGgVL0aFEjQoECJGjRoymDNm__ymTJkzZv3_____-3bt27du3Thw8efPnz58-fPnz58-fP___QIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECA&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;edit.tf&amp;quot;&lt;br /&gt;
        }    &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
== Adding Content using Markup ==&lt;br /&gt;
&lt;br /&gt;
Content can be added directly to the JSON file using a very simple markup. For example consider the following frame definition.&lt;br /&gt;
&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;pid&amp;quot;: {&lt;br /&gt;
            &amp;quot;page-no&amp;quot;: 101,&lt;br /&gt;
            &amp;quot;frame-id&amp;quot;: &amp;quot;a&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;visible&amp;quot;: true,&lt;br /&gt;
        &amp;quot;frame-type&amp;quot;: &amp;quot;information&amp;quot;,&lt;br /&gt;
        &amp;quot;title&amp;quot;: {&lt;br /&gt;
            &amp;quot;data&amp;quot;: &amp;quot;[D]Welcome\r\n\r\n&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;markup&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;content&amp;quot;: {&lt;br /&gt;
            &amp;quot;data&amp;quot;: &amp;quot;[Y]Hello[C]Telstar[M]World&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;markup&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
This frame uses markup in the title and the content, The title is specified as [D]ouble height and the three words used in the content are coloured yellow, cyan and magenta respectively.&lt;br /&gt;
&lt;br /&gt;
Full details of markup can be found in the [[Markup]] section.&lt;br /&gt;
&lt;br /&gt;
== Complete Frame Description ==&lt;br /&gt;
&lt;br /&gt;
The frame below is a standard information page from the TELSTAR system shown in its JSON format. It represents the first frame of page 9. Taking this frame as an example, a description of the fields and their meaning is decribed below.&lt;br /&gt;
&lt;br /&gt;
''The full json schema can be found [[Frame Schema|here]].''&lt;br /&gt;
&lt;br /&gt;
     {&lt;br /&gt;
    	&amp;quot;pid&amp;quot;: {&lt;br /&gt;
    		&amp;quot;page-no&amp;quot;: 9,&lt;br /&gt;
    		&amp;quot;frame-id&amp;quot;: &amp;quot;a&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;visible&amp;quot;: true,&lt;br /&gt;
        &amp;quot;header-text&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;cost&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;frame-type&amp;quot;: &amp;quot;information&amp;quot;,&lt;br /&gt;
        &amp;quot;redirect&amp;quot;: {&lt;br /&gt;
            &amp;quot;page-no&amp;quot;: 0,&lt;br /&gt;
            &amp;quot;frame-id&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;content&amp;quot;: {&lt;br /&gt;
            &amp;quot;data&amp;quot;: &amp;quot;https://edit.tf/#0:QIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgc4UCBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQICixYsWLFixYsWLFixYsWLFixYsWLFixYsWLFixYsWLFixYgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAxQIIs6PJnRYtKTOjoKkWnUQUIMeLTQIECBAgQIECBAgQIEDRAgp2adSLNQSZ0aegQIECBAgQIECBAgQIECBAgQIECBAgQNkCCPBqRa8GygpxaVaTDi00CBAgQIECBAgQIECBAgQIECBA4QIIc-dUgw6iCJFqQZMymgQIECBAgQIECBAgQIECBAgQIEDlAgmT46CfOQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQMECCZPjoJ8aMgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQICixYsWLFixYsWLFixYsWLFixYsWLFixYsWLFixYsWLFixYgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECAFUQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgBVAMUNMQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIAVQDFDTAlMPUQIECBAgQIECBAgQIECBAgQIECBAgQIECAFUAxQ0wJTD1A0EHSQIECBAgQIECBAgQIECBAgQIECBAgQIECANMCUw9QNBB0kCBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECAPUDQQdJAgQIECBAgQIECBAgQIECAosWLFixYsWLFixYsQIECAHSQIECAosWLFixYsWLFixYsWIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECA&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;edit.tf'&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;title&amp;quot;: {&lt;br /&gt;
            &amp;quot;data&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
            &amp;quot;merge-data&amp;quot;: []&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;routing-table&amp;quot;: [&lt;br /&gt;
            90,&lt;br /&gt;
            91,&lt;br /&gt;
            92,&lt;br /&gt;
            93,&lt;br /&gt;
            94,&lt;br /&gt;
            95,&lt;br /&gt;
            96,&lt;br /&gt;
            97,&lt;br /&gt;
            98,&lt;br /&gt;
            990,&lt;br /&gt;
            0&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;cursor&amp;quot;: false,&lt;br /&gt;
        &amp;quot;connection&amp;quot;: {&lt;br /&gt;
            &amp;quot;address&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
            &amp;quot;mode&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
            &amp;quot;port&amp;quot;: 0&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;author-id&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;response-data&amp;quot;: {&lt;br /&gt;
            &amp;quot;responses&amp;quot;: null,&lt;br /&gt;
            &amp;quot;response-action&amp;quot;: {&lt;br /&gt;
                &amp;quot;exec&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
                &amp;quot;args&amp;quot;: null,&lt;br /&gt;
                &amp;quot;post-action-frame&amp;quot;: {&lt;br /&gt;
                    &amp;quot;page-no&amp;quot;: 0,&lt;br /&gt;
                    &amp;quot;frame-id&amp;quot;: ''&lt;br /&gt;
                },&lt;br /&gt;
                &amp;quot;post-cancel-frame&amp;quot;: {&lt;br /&gt;
                    &amp;quot;page-no&amp;quot;: 0,&lt;br /&gt;
                    &amp;quot;frame-id&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;navmessage-select&amp;quot;: &amp;quot;[B][n][Y]Select item or[W]*page# : [_+]&amp;quot;,&lt;br /&gt;
        &amp;quot;navmessage-notfound&amp;quot;: &amp;quot;[B][n][Y]Page not Found :[W]&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
=== pid ===&lt;br /&gt;
&lt;br /&gt;
Specifies the page number and frame id for the frame.&lt;br /&gt;
&lt;br /&gt;
    	&amp;quot;pid&amp;quot;: {&lt;br /&gt;
    		&amp;quot;page-no&amp;quot;: 9,&lt;br /&gt;
    		&amp;quot;frame-id&amp;quot;: &amp;quot;a&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
&lt;br /&gt;
=== visible ===&lt;br /&gt;
&lt;br /&gt;
When set to false, the frame will not be accessible and will return the ''not found'' system message to the user if an attempt is made to access it.&lt;br /&gt;
&lt;br /&gt;
      &amp;quot;visible&amp;quot;: true,&lt;br /&gt;
&lt;br /&gt;
=== header-text ===&lt;br /&gt;
&lt;br /&gt;
Allows the default header text to be ovwerridden at frame level. If this is left blank the default header will be used, see configuration.&lt;br /&gt;
&lt;br /&gt;
      &amp;quot;header-text&amp;quot;: &amp;quot;[Y]MICRONETn 800 (C)&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
=== cost ===&lt;br /&gt;
&lt;br /&gt;
      &amp;quot;cost&amp;quot;: 0,&lt;br /&gt;
&lt;br /&gt;
=== frame-type ===&lt;br /&gt;
&lt;br /&gt;
The API supports the following frame types ''initial'', ''mainindex'', ''information'', ''exit'', ''gateway'', ''test'' and ''response''.&lt;br /&gt;
&lt;br /&gt;
      &amp;quot;frame-type&amp;quot;: &amp;quot;information&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
* '''initial''': This frame type is used on the start page, see [[Configuration Options]]. Typically only one of these frames would exist within a system.&lt;br /&gt;
* '''mainindex''': This frame type is used on the main index page. , see [[Configuration Options]]. Only one of these frames should exist within a system.&lt;br /&gt;
* '''information''': This frame type is used for all normal content frames.&lt;br /&gt;
* '''exit''': This frame type is used for an exit page, any number of exit pages can be defined. When an exit page is rendered it will close the connection.&lt;br /&gt;
* '''gateway''': This page type is used to define a gateway page and is used in conjunction with the connection element (see below).&lt;br /&gt;
* '''test''': This page type indicates a test page and prevents navigation and system messages from being shown. this is typically used for frames that need to use the whole display such as 'test cards' etc.&lt;br /&gt;
* '''telesoftware''': Telesoftware frames (see [[Telesoftware]]).&lt;br /&gt;
* '''response''': This frame type is used for response frames. See [[Implementing Response Frames]].&lt;br /&gt;
* '''system''': Reserved for use internally.&lt;br /&gt;
* '''exception''': Reserved for use internally.&lt;br /&gt;
&lt;br /&gt;
=== redirect ===&lt;br /&gt;
 &lt;br /&gt;
If set it simply means that the user is redirected to the specified frame. This can be a useful alternative form of navigation to the routing table.&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;redirect&amp;quot;: {&lt;br /&gt;
            &amp;quot;page-no&amp;quot;: 9,&lt;br /&gt;
            &amp;quot;frame-id&amp;quot;: &amp;quot;a&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
&lt;br /&gt;
The following is an example of a complete redirect page.&lt;br /&gt;
&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;PID&amp;quot;: {&lt;br /&gt;
            &amp;quot;page-no&amp;quot;: 2,&lt;br /&gt;
            &amp;quot;frame-id&amp;quot;: &amp;quot;a&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;redirect&amp;quot;: {&lt;br /&gt;
            &amp;quot;page-no&amp;quot;: 11,&lt;br /&gt;
            &amp;quot;frame-id&amp;quot;: &amp;quot;a&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;visible&amp;quot;: true&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
=== content ===&lt;br /&gt;
&lt;br /&gt;
These elements define the content. The example below shows the content.type to be an edit.tf url. The available types are shown below.&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;content&amp;quot;: {&lt;br /&gt;
            &amp;quot;data&amp;quot;: &amp;quot;https://edit.tf/#0:QIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgc4UCBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQICixYsWLFixYsWLFixYsWLFixYsWLFixYsWLFixYsWLFixYgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAxQIIs6PJnRYtKTOjoKkWnUQUIMeLTQIECBAgQIECBAgQIEDRAgp2adSLNQSZ0aegQIECBAgQIECBAgQIECBAgQIECBAgQNkCCPBqRa8GygpxaVaTDi00CBAgQIECBAgQIECBAgQIECBA4QIIc-dUgw6iCJFqQZMymgQIECBAgQIECBAgQIECBAgQIEDlAgmT46CfOQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQMECCZPjoJ8aMgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQICixYsWLFixYsWLFixYsWLFixYsWLFixYsWLFixYsWLFixYgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECAFUQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgBVAMUNMQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIAVQDFDTAlMPUQIECBAgQIECBAgQIECBAgQIECBAgQIECAFUAxQ0wJTD1A0EHSQIECBAgQIECBAgQIECBAgQIECBAgQIECANMCUw9QNBB0kCBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECAPUDQQdJAgQIECBAgQIECBAgQIECAosWLFixYsWLFixYsQIECAHSQIECAosWLFixYsWLFixYsWIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECA&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;edit.tf'&lt;br /&gt;
        },&lt;br /&gt;
&lt;br /&gt;
Content types:&lt;br /&gt;
&lt;br /&gt;
* '''zxnet''': If set, then the content will be treated as an zxnet editor url. This is converted to RawV before being rendered.&lt;br /&gt;
* '''edit.tf''': If set, then the content will be treated as an edit.tf url. This is converted to RawV before being rendered.&lt;br /&gt;
* '''markup''': If set, then the content will be treated as ''markup'' content. Full details of ''markup'' can be found in the section [[Markup]]&lt;br /&gt;
* '''rawV''': If set, then the content will be treated as raw videotex data. This is 7bit (00-7F) videotex format with control chars between 00-1F and escaped codes for alpha and graphic attributes. Ideally rows should have any trailing spaces removed and replaced with with a CR/LF combination. This will be rendered as is.&lt;br /&gt;
* '''rawT''': If set, then the content will be treated as raw teletex data. This is a 24 x 40 block of 7 bits chars (960 chars) in Teletext format (range 00-7F). This format is used internally when manipulating page data. It will be converted to RawV before being rendered.&lt;br /&gt;
&lt;br /&gt;
=== title ===&lt;br /&gt;
&lt;br /&gt;
This sets the title of the page. In many cases this may be left blank with all of the content specified in the ''content'' section (see above) however, the ''title'' section gives additional flexibility when creating frames.&lt;br /&gt;
&lt;br /&gt;
Values for ''title-type'' are the same as defined for the content section, however, if the type ''edit-tf'' is used then only the first four (default) lines of the edit.tf defined page are used. &lt;br /&gt;
&lt;br /&gt;
Separating title from content in this way allows logos and header sections to be created for the title whilst using markup for the main content or visa-versa. &lt;br /&gt;
&lt;br /&gt;
==== Example 1 ====&lt;br /&gt;
&lt;br /&gt;
In thi example the fields are blank meaning that only the data in the ''content'' section is displayed.&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;title&amp;quot;: {&lt;br /&gt;
            &amp;quot;data&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
            &amp;quot;merge-data&amp;quot;: []&lt;br /&gt;
        },&lt;br /&gt;
&lt;br /&gt;
==== Example 2 ====&lt;br /&gt;
&lt;br /&gt;
In this example, the top 4 lines of the edit.tf content is displayed at the top of the page.&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;title&amp;quot;: {&lt;br /&gt;
            &amp;quot;data&amp;quot;: &amp;quot;https://edit.tf/#0:QIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECAvobotqBX__oECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIC_9AgQIEGv-gQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgL_0Cj4kQav6BAgQIECBAgQIECBAgQIECBAgQIECBAgQIECAuq64P6Dx__oECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECA&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;edit.tf&amp;quot;,&lt;br /&gt;
            &amp;quot;merge-data&amp;quot;: []&lt;br /&gt;
        },&lt;br /&gt;
&lt;br /&gt;
To take the top 5 lines, the ''type'' field can be extended as follows.&lt;br /&gt;
&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;edit.tf,5&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Note that this extended form of ''type'' only applies to edit.tf types.&lt;br /&gt;
&lt;br /&gt;
==== Example 3 ====&lt;br /&gt;
&lt;br /&gt;
The merge data field can be used to add ''layers'' of markup data to the title area. For example the example above shows the Guardian logo. To add some alphagraphics text to this, an additional layer could be used e.g.&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;title&amp;quot;: {&lt;br /&gt;
            &amp;quot;data&amp;quot;: &amp;quot;https://edit.tf/#0:QIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECAvobotqBX__oECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIC_9AgQIEGv-gQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgL_0Cj4kQav6BAgQIECBAgQIECBAgQIECBAgQIECBAgQIECAuq64P6Dx__oECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECA&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;edit.tf,5&amp;quot;,&lt;br /&gt;
            &amp;quot;merge-data&amp;quot;: [&lt;br /&gt;
                &amp;quot;[w[             UK News]]&amp;quot;&lt;br /&gt;
            ]&lt;br /&gt;
        },&lt;br /&gt;
&lt;br /&gt;
Note that any number of layers can be added, however, the merge layer must be defined as markup.&lt;br /&gt;
&lt;br /&gt;
=== routing table ===&lt;br /&gt;
&lt;br /&gt;
The routing table defines which pages are navigated to when a user presses a key whilst viewing the frame. The table has 11 entries with the first 10 representing the keys 0-9, the final entry refers to the ''hash'' (return) key.&lt;br /&gt;
&lt;br /&gt;
The example below shows the default routing table for frame 9a. If the user is viewing this frame and presses 1 the frame 91a will be loaded, assuming it exists. Pressing the ''hash'' (return) key will take the user back to frame 0a, the main index.&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;routing-table&amp;quot;: [&lt;br /&gt;
            90,&lt;br /&gt;
            91,&lt;br /&gt;
            92,&lt;br /&gt;
            93,&lt;br /&gt;
            94,&lt;br /&gt;
            95,&lt;br /&gt;
            96,&lt;br /&gt;
            97,&lt;br /&gt;
            98,&lt;br /&gt;
            99,&lt;br /&gt;
            0&lt;br /&gt;
        ],&lt;br /&gt;
&lt;br /&gt;
=== cursor ===&lt;br /&gt;
&lt;br /&gt;
This element determines whether a cursor is shown on the page. Typically a cursor would only be shown on response frames.&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;cursor&amp;quot;: false,&lt;br /&gt;
        &lt;br /&gt;
=== connection ===&lt;br /&gt;
&lt;br /&gt;
This elements specifies the connection object used for gateway pages.&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;connection&amp;quot;: {&lt;br /&gt;
            &amp;quot;address&amp;quot;: &amp;quot;fish.ccl4.org&amp;quot;,&lt;br /&gt;
            &amp;quot;mode&amp;quot;: &amp;quot;viewdata&amp;quot;,&lt;br /&gt;
            &amp;quot;port&amp;quot;: 23&lt;br /&gt;
        },&lt;br /&gt;
&lt;br /&gt;
The values for ''address and port'' represent the endpoint of the system being accessed and the value for ''mode'' determines how the system is accessed, the options are:&lt;br /&gt;
&lt;br /&gt;
    viewdata&lt;br /&gt;
    full_duplex&lt;br /&gt;
    full_duplex_no_echo&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== author-id ===&lt;br /&gt;
&lt;br /&gt;
This is an optional field that can be used to indicate the author of the page or other source.&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;author-id&amp;quot;: &amp;quot;john&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
=== response-data ===&lt;br /&gt;
&lt;br /&gt;
These fields should be used when the frame type is set to be a ''response-frame''. &lt;br /&gt;
&lt;br /&gt;
There are two main sections, ''response-data'' and ''response-action''. Below is an example of a response frame used for the Telstar weather page. The frame is created in the normal way using ''markup'' or ''edit.tf''. In this example the text ''Town/Cty'' has been positioned near the centre of the page. Immediately to the right of this is a field for the user to enter either a Town or City, the ''response-data'' section defines that field. Once the user submits the frame the section ''response-action'' determines what happens. In the example here a binary file (''telstar-openweather-linux-amd64''), stored in the containers volume directory is executed with a single argument (''myopenweatherapikey''). Note that the ''post-action-frame'' is set to 290b, in this example frame 290b is dynamically generated by the binary file ''telstar-openweather-linux-amd64'' and contains the weather forecast.&lt;br /&gt;
&lt;br /&gt;
Full details of how to implement response frames are detailed in the section [[Implementing Response Frames]].&lt;br /&gt;
    &amp;quot;response-data&amp;quot;: {&lt;br /&gt;
        &amp;quot;response-fields&amp;quot;: [&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;vpos&amp;quot;: 8,&lt;br /&gt;
                &amp;quot;hpos&amp;quot;: 4,&lt;br /&gt;
                &amp;quot;required&amp;quot;: true,&lt;br /&gt;
                &amp;quot;length&amp;quot;: 16,&lt;br /&gt;
                &amp;quot;type&amp;quot;: &amp;quot;alphanumeric&amp;quot;,&lt;br /&gt;
                &amp;quot;auto-submit&amp;quot;: false,&lt;br /&gt;
                &amp;quot;password&amp;quot;: false&lt;br /&gt;
            }&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;response-action&amp;quot;: {&lt;br /&gt;
            &amp;quot;exec&amp;quot;: &amp;quot;/opt/telstar/volume/telstar-openweather-linux-amd64&amp;quot;,&lt;br /&gt;
            &amp;quot;args&amp;quot;: [&lt;br /&gt;
                &amp;quot;myopenweatherapikey&amp;quot;&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;post-action-frame&amp;quot;: {&lt;br /&gt;
                &amp;quot;page-no&amp;quot;: 290,&lt;br /&gt;
                &amp;quot;frame-id&amp;quot;: &amp;quot;c&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
=== navmessage-select ===&lt;br /&gt;
&lt;br /&gt;
Allows the ''navigation'' system message to be customised at frame level. In most cases this can be left blank in order that the system default is used instead, see [[Configuration Options]].&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;navmessage-select&amp;quot;: &amp;quot;[B][n][Y]Select item or[W]*page# : [_+]&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
=== navmessage-notfound ===&lt;br /&gt;
&lt;br /&gt;
Allows the ''not found'' system message to be customised at frame level. In most cases this can be left blank in order that the system default is used instead, see [[Configuration Options]].&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;navmessage-notfound&amp;quot;: &amp;quot;[B][n][Y]Page not Found :[W]&amp;quot;&lt;/div&gt;</summary>
		<author><name>John</name></author>
	</entry>
	<entry>
		<id>https://wiki.glasstty.com/index.php?title=Frames&amp;diff=353</id>
		<title>Frames</title>
		<link rel="alternate" type="text/html" href="https://wiki.glasstty.com/index.php?title=Frames&amp;diff=353"/>
		<updated>2022-05-17T14:49:37Z</updated>

		<summary type="html">&lt;p&gt;John: /* Adding Frames to the System */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;As is typical with interactive videotex systems, pages are numbered from 0 to 999999999 and consist of one or more frames with the suffix a-z, for example the first frame for page 200 would be 200a, the second 200b and so on (see [[Routing]]) for more details). These frames are stored within TELSTAR's database as ''JSON'' objects (see https://www.json.org/) and uploaded to Telstar using a simple command line utility.&lt;br /&gt;
&lt;br /&gt;
The Telstar utility program simply interacts with the Telstar API which is a restful API. This can be used directly by any software making it simple to programitically manage pages and routing information.&lt;br /&gt;
&lt;br /&gt;
Frames are defined in JSON. The simplest frame that can be viewed on TELSTAR would be as follows. This would create a simple information frame with some flashing content. In this example [[Markup]] has been used within the content, however, other content types can be used including edi.tf urls, see below.&lt;br /&gt;
&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;pid&amp;quot;: {&lt;br /&gt;
        &amp;quot;page-no&amp;quot;: 101,&lt;br /&gt;
        &amp;quot;frame-id&amp;quot;: &amp;quot;a&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;visible&amp;quot;: true,&lt;br /&gt;
      &amp;quot;content&amp;quot;: {&lt;br /&gt;
        &amp;quot;data&amp;quot;: &amp;quot;[D]This is page[F]101a&amp;quot;,&lt;br /&gt;
         &amp;quot;type&amp;quot;: &amp;quot;markup&amp;quot;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Shown below is a more complete example of a JSON defined frame. With this particular frame, the actual viewdata content has been created using the editor at http://edit.tf, this can be seen in the ''content.data'' and ''content.type'' keys. Both the edit.tf and zxnet (https://zxnet.co.uk/teletext/editor/) editors are supported. The example below is a simple information page with some simple routing (see [[Routing]]). Clicking the ''content.data'' link, or pasteing the value into a browser will show the page and allow it to be edited. It is not necessary to use the http://edit.tf editor, this is just one possible option.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;pid&amp;quot;: {&lt;br /&gt;
        &amp;quot;page-no&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;frame-id&amp;quot;: &amp;quot;a&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;visible&amp;quot;: true,&lt;br /&gt;
      &amp;quot;frame-type&amp;quot;: &amp;quot;information&amp;quot;,&lt;br /&gt;
      &amp;quot;content&amp;quot;: {&lt;br /&gt;
        &amp;quot;data&amp;quot;: &amp;quot;http://edit.tf/#0:QIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQMMKAbNw6dyCTuyZfCBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgKJEiRIkSJEiRIkSJEiRIkSJEiRIkSJEiRIkSJEiRIkSJEiRAxQR4s6LSgzEEmdUi0otOogkzo0-lNg1JM-cCg8unNYgQIASBBj67OnXllWIMu7pl5dMOndty7uixBoy4dnTQsQIECBAgBIEHfLh2dNCDDuyINmnNl59POzKuQIECBAgQIECBAgQIECBAyQTotemggzoiCvFg1JEWkCnYemnfuw7EGHdkQIECBAgQIASBBp3dMvLdh6ad-7DsQbsvfmgw7siDvlw9NGXkuQIECBAgQM0EKrTkzotOmgkzo0-lNg1JM-cCh79vDDu8oMO7IgQIECAEgQYuvPTuy8-aDdl781wM6EjVKcVBMw9MvPogoctOPLzQIEDRBHn1otKdNizqiCTOjT6U2DUkz5wKlvw5OaxByw6dixAgBIEGHdkQUMPLZpw7cu7ouQIECBAgQIECBAgQIECBAgQIECBA2QR4NSLXg2UFOLSrSYcWmCnWKkWYsQVIsWNBsLEEOHMaIASBBh3ZEHTRlQQ9-zfz54diCHh7ZUGHJ2y7unXllXIECBAgQN0EifMkxINmmCqcsPbLsQYd2RBI37NOTD5QbsvfmuQIECBA4CHQc2TDpT50WogcMGCAScgoOnLTi69MqDpvQdNGnmgQIAaBBzy8u2nHlQd9PTQgqZdmXnvzdO-HllQYd2RBt38sq5AgQOQ0yfHQT40ZYgp2adSLNQSZ0aegTIKkWnUQUIMeLTQIECAokSJEiRIkSJEiRIkSJEiRIkSJEiRIkSJEiRIkSJEiRIkSJEFeLBqSItJBGn0osODTqIBIM6EQIEFDDnyoFTJywvoECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECA&amp;quot;,&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;edit.tf&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;routing-table&amp;quot;: [0,1,11,3,400,5,6,7,800,9,0],&lt;br /&gt;
      &amp;quot;cursor&amp;quot;: false,&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
== Adding Frames to the System ==&lt;br /&gt;
&lt;br /&gt;
Frames can be added to the system using the Telstar API.&lt;br /&gt;
&lt;br /&gt;
The Telstar API, in conjunction with the cross platform Telstar Util software, provides a simple method of creating and managing pages.&lt;br /&gt;
&lt;br /&gt;
The API can be used to retrieve and update frames and configuring routing. The API is a restful API that uses the GET, PUT, POST and DELETE HTTP methods and as such can be used from any application.&lt;br /&gt;
&lt;br /&gt;
Data is passed to and from the API in JSON format, making the system very simple to use in any programming language. The whole API could be used without any programming at all by using a command line utility such as CURL.&lt;br /&gt;
&lt;br /&gt;
''Further details of the Telstar API can be found in the section [[The Telstar API]].''&lt;br /&gt;
&lt;br /&gt;
== Adding Content with the Edit.tf editor ==&lt;br /&gt;
&lt;br /&gt;
There are several ways to add content to a page. One of the easiest is to create the page in an editor such as http://edit.tf.&lt;br /&gt;
&lt;br /&gt;
The JSON file would look something like the one showm below. Note that the content type is set to editf and the content data contains the edit.tf url.&lt;br /&gt;
&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;pid&amp;quot;: {&lt;br /&gt;
            &amp;quot;page-no&amp;quot;: 101,&lt;br /&gt;
            &amp;quot;frame-id&amp;quot;: &amp;quot;a&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;visible&amp;quot;: true,&lt;br /&gt;
        &amp;quot;frame-type&amp;quot;: &amp;quot;information&amp;quot;,&lt;br /&gt;
        &amp;quot;content&amp;quot;: {&lt;br /&gt;
            &amp;quot;data&amp;quot;: &amp;quot;http://edit.tf/#0:QIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQICn_OmTJkSJApUqVKlSpUlcHApiTJkyZEiRIkyZMmTIkSJFmKf3JX58____RBg-fPnzog__2iBBo-fNX9qgQcOHDh8-fGiAp_zFf______2v7_____7X___oEGr__Qa0ur_________QoCn9ywK__6D__a__7dH__tf___1QIv_9AiQIkaPX_bo0aMpiKf_-Yr__oP_9r__tUH_-1____9og__yjnz5cldX9qUc-fPkp__uSv_-g__2v_-1Qf_7X__aIv____KZv_dIV__2pTN___yn__mK___z__a____5__tf_9qgVf__8o5_vWJX__alHP___Kf_7kr____6dBr_____-h__2qBBr__ymbPnSFf69CUzf__8pnz5iq9ejRoECBWvXr0KBGjQYOHBHz4cECBAgwcCily7__yqDhw4ePnzogQeP7RAg0fPiBB___9X___QYPH___-sCmb__KoP________3B__tUCDV__tUH___1f36XB-_______KOf_8qgRo__9B__v9X___QINX___Qav__B8-NNX_-jR___8pm__ymYrq______h_odX9qg1f___7q__9X_-h1f_5TBgwYM37__KOSur-_Ro0Pr_8_f_qDV_b___r__1f_6D___lFKlSpUu__8pmK_v7VAgwf______tNX9r______V__oP__-gQaPnwpm__yqDB__tUCD__QIEG___1f2qL____9X_-g____z5-__ymb__KoNX_-lQKl6VAgQav6_V__oNf___1f2qBX_____9-hKOf_8qgVJ0JRw4cOPLkqiQoESNGgVL0aFEjQoECJGjRoymDNm__ymTJkzZv3_____-3bt27du3Thw8efPnz58-fPnz58-fP___QIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECA&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;edit.tf&amp;quot;&lt;br /&gt;
        }    &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
== Adding Content using Markup ==&lt;br /&gt;
&lt;br /&gt;
Content can be added directly to the JSON file using a very simple markup. For example consider the following frame definition.&lt;br /&gt;
&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;pid&amp;quot;: {&lt;br /&gt;
            &amp;quot;page-no&amp;quot;: 101,&lt;br /&gt;
            &amp;quot;frame-id&amp;quot;: &amp;quot;a&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;visible&amp;quot;: true,&lt;br /&gt;
        &amp;quot;frame-type&amp;quot;: &amp;quot;information&amp;quot;,&lt;br /&gt;
        &amp;quot;title&amp;quot;: {&lt;br /&gt;
            &amp;quot;data&amp;quot;: &amp;quot;[D]Welcome\r\n\r\n&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;markup&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;content&amp;quot;: {&lt;br /&gt;
            &amp;quot;data&amp;quot;: &amp;quot;[Y]Hello[C]Telstar[M]World&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;markup&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
This frame uses markup in the title and the content, The title is specified as [D]ouble height and the three words used in the content are coloured yellow, cyan and magenta respectively.&lt;br /&gt;
&lt;br /&gt;
Full details of markup can be found in the [[Markup]] section.&lt;br /&gt;
&lt;br /&gt;
== Complete Frame Description ==&lt;br /&gt;
&lt;br /&gt;
The frame below is a standard information page from the TELSTAR system shown in its JSON format. It represents the first frame of page 9. Taking this frame as an example, a description of the fields and their meaning is decribed below.&lt;br /&gt;
&lt;br /&gt;
''The full json schema can be found [[Frame Schema|here]].''&lt;br /&gt;
&lt;br /&gt;
     {&lt;br /&gt;
    	&amp;quot;pid&amp;quot;: {&lt;br /&gt;
    		&amp;quot;page-no&amp;quot;: 9,&lt;br /&gt;
    		&amp;quot;frame-id&amp;quot;: &amp;quot;a&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;visible&amp;quot;: true,&lt;br /&gt;
        &amp;quot;header-text&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;cost&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;frame-type&amp;quot;: &amp;quot;information&amp;quot;,&lt;br /&gt;
        &amp;quot;redirect&amp;quot;: {&lt;br /&gt;
            &amp;quot;page-no&amp;quot;: 0,&lt;br /&gt;
            &amp;quot;frame-id&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;content&amp;quot;: {&lt;br /&gt;
            &amp;quot;data&amp;quot;: &amp;quot;https://edit.tf/#0:QIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgc4UCBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQICixYsWLFixYsWLFixYsWLFixYsWLFixYsWLFixYsWLFixYgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAxQIIs6PJnRYtKTOjoKkWnUQUIMeLTQIECBAgQIECBAgQIEDRAgp2adSLNQSZ0aegQIECBAgQIECBAgQIECBAgQIECBAgQNkCCPBqRa8GygpxaVaTDi00CBAgQIECBAgQIECBAgQIECBA4QIIc-dUgw6iCJFqQZMymgQIECBAgQIECBAgQIECBAgQIEDlAgmT46CfOQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQMECCZPjoJ8aMgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQICixYsWLFixYsWLFixYsWLFixYsWLFixYsWLFixYsWLFixYgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECAFUQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgBVAMUNMQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIAVQDFDTAlMPUQIECBAgQIECBAgQIECBAgQIECBAgQIECAFUAxQ0wJTD1A0EHSQIECBAgQIECBAgQIECBAgQIECBAgQIECANMCUw9QNBB0kCBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECAPUDQQdJAgQIECBAgQIECBAgQIECAosWLFixYsWLFixYsQIECAHSQIECAosWLFixYsWLFixYsWIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECA&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;edit.tf'&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;title&amp;quot;: {&lt;br /&gt;
            &amp;quot;data&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
            &amp;quot;merge-data&amp;quot;: []&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;routing-table&amp;quot;: [&lt;br /&gt;
            90,&lt;br /&gt;
            91,&lt;br /&gt;
            92,&lt;br /&gt;
            93,&lt;br /&gt;
            94,&lt;br /&gt;
            95,&lt;br /&gt;
            96,&lt;br /&gt;
            97,&lt;br /&gt;
            98,&lt;br /&gt;
            990,&lt;br /&gt;
            0&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;cursor&amp;quot;: false,&lt;br /&gt;
        &amp;quot;connection&amp;quot;: {&lt;br /&gt;
            &amp;quot;address&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
            &amp;quot;mode&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
            &amp;quot;port&amp;quot;: 0&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;author-id&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;response-data&amp;quot;: {&lt;br /&gt;
            &amp;quot;responses&amp;quot;: null,&lt;br /&gt;
            &amp;quot;response-action&amp;quot;: {&lt;br /&gt;
                &amp;quot;exec&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
                &amp;quot;args&amp;quot;: null,&lt;br /&gt;
                &amp;quot;post-action-frame&amp;quot;: {&lt;br /&gt;
                    &amp;quot;page-no&amp;quot;: 0,&lt;br /&gt;
                    &amp;quot;frame-id&amp;quot;: ''&lt;br /&gt;
                },&lt;br /&gt;
                &amp;quot;post-cancel-frame&amp;quot;: {&lt;br /&gt;
                    &amp;quot;page-no&amp;quot;: 0,&lt;br /&gt;
                    &amp;quot;frame-id&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;navmessage-select&amp;quot;: &amp;quot;[B][n][Y]Select item or[W]*page# : [_+]&amp;quot;,&lt;br /&gt;
        &amp;quot;navmessage-notfound&amp;quot;: &amp;quot;[B][n][Y]Page not Found :[W]&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
=== pid ===&lt;br /&gt;
&lt;br /&gt;
Specifies the page number and frame id for the frame.&lt;br /&gt;
&lt;br /&gt;
    	&amp;quot;pid&amp;quot;: {&lt;br /&gt;
    		&amp;quot;page-no&amp;quot;: 9,&lt;br /&gt;
    		&amp;quot;frame-id&amp;quot;: &amp;quot;a&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
&lt;br /&gt;
=== visible ===&lt;br /&gt;
&lt;br /&gt;
When set to false, the frame will not be accessible and will return the ''not found'' system message to the user if an attempt is made to access it.&lt;br /&gt;
&lt;br /&gt;
      &amp;quot;visible&amp;quot;: true,&lt;br /&gt;
&lt;br /&gt;
=== header-text ===&lt;br /&gt;
&lt;br /&gt;
Allows the default header text to be ovwerridden at frame level. If this is left blank the default header will be used, see configuration.&lt;br /&gt;
&lt;br /&gt;
      &amp;quot;header-text&amp;quot;: &amp;quot;[Y]MICRONETn 800 (C)&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
=== cost ===&lt;br /&gt;
&lt;br /&gt;
      &amp;quot;cost&amp;quot;: 0,&lt;br /&gt;
&lt;br /&gt;
=== frame-type ===&lt;br /&gt;
&lt;br /&gt;
The API supports the following frame types ''initial'', ''mainindex'', ''information'', ''exit'', ''gateway'', ''test'' and ''response''.&lt;br /&gt;
&lt;br /&gt;
      &amp;quot;frame-type&amp;quot;: &amp;quot;information&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
* '''initial''': This frame type is used on the start page, see [[Configuration Options]]. Typically only one of these frames would exist within a system.&lt;br /&gt;
* '''mainindex''': This frame type is used on the main index page. , see [[Configuration Options]]. Only one of these frames should exist within a system.&lt;br /&gt;
* '''information''': This frame type is used for all normal content frames.&lt;br /&gt;
* '''exit''': This frame type is used for an exit page, any number of exit pages can be defined. When an exit page is rendered it will close the connection.&lt;br /&gt;
* '''gateway''': This page type is used to define a gateway page and is used in conjunction with the connection element (see below).&lt;br /&gt;
* '''test''': This page type indicates a test page and prevents navigation and system messages from being shown. this is typically used for frames that need to use the whole display such as 'test cards' etc.&lt;br /&gt;
* '''telesoftware''': Telesoftware frames (see [[Telesoftware]]).&lt;br /&gt;
* '''response''': This frame type is used for response frames. See [[Implementing Response Frames]].&lt;br /&gt;
* '''system''': Reserved for use internally.&lt;br /&gt;
* '''exception''': Reserved for use internally.&lt;br /&gt;
&lt;br /&gt;
=== redirect ===&lt;br /&gt;
 &lt;br /&gt;
If set it simply means that the user is redirected to the specified frame. This can be a useful alternative form of navigation to the routing table.&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;redirect&amp;quot;: {&lt;br /&gt;
            &amp;quot;page-no&amp;quot;: 9,&lt;br /&gt;
            &amp;quot;frame-id&amp;quot;: &amp;quot;a&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
&lt;br /&gt;
The following is an example of a complete redirect page.&lt;br /&gt;
&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;PID&amp;quot;: {&lt;br /&gt;
            &amp;quot;page-no&amp;quot;: 2,&lt;br /&gt;
            &amp;quot;frame-id&amp;quot;: &amp;quot;a&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;redirect&amp;quot;: {&lt;br /&gt;
            &amp;quot;page-no&amp;quot;: 11,&lt;br /&gt;
            &amp;quot;frame-id&amp;quot;: &amp;quot;a&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;visible&amp;quot;: true&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
=== content ===&lt;br /&gt;
&lt;br /&gt;
These elements define the content. The example below shows the content.type to be an edit.tf url. The available types are shown below.&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;content&amp;quot;: {&lt;br /&gt;
            &amp;quot;data&amp;quot;: &amp;quot;https://edit.tf/#0:QIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgc4UCBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQICixYsWLFixYsWLFixYsWLFixYsWLFixYsWLFixYsWLFixYgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAxQIIs6PJnRYtKTOjoKkWnUQUIMeLTQIECBAgQIECBAgQIEDRAgp2adSLNQSZ0aegQIECBAgQIECBAgQIECBAgQIECBAgQNkCCPBqRa8GygpxaVaTDi00CBAgQIECBAgQIECBAgQIECBA4QIIc-dUgw6iCJFqQZMymgQIECBAgQIECBAgQIECBAgQIEDlAgmT46CfOQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQMECCZPjoJ8aMgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQICixYsWLFixYsWLFixYsWLFixYsWLFixYsWLFixYsWLFixYgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECAFUQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgBVAMUNMQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIAVQDFDTAlMPUQIECBAgQIECBAgQIECBAgQIECBAgQIECAFUAxQ0wJTD1A0EHSQIECBAgQIECBAgQIECBAgQIECBAgQIECANMCUw9QNBB0kCBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECAPUDQQdJAgQIECBAgQIECBAgQIECAosWLFixYsWLFixYsQIECAHSQIECAosWLFixYsWLFixYsWIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECA&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;edit.tf'&lt;br /&gt;
        },&lt;br /&gt;
&lt;br /&gt;
Content types:&lt;br /&gt;
&lt;br /&gt;
* '''zxnet''': If set, then the content will be treated as an zxnet editor url. This is converted to RawV before being rendered.&lt;br /&gt;
* '''edit.tf''': If set, then the content will be treated as an edit.tf url. This is converted to RawV before being rendered.&lt;br /&gt;
* '''markup''': If set, then the content will be treated as ''markup'' content. Full details of ''markup'' can be found in the section [[Markup]]&lt;br /&gt;
* '''rawV''': If set, then the content will be treated as raw videotex data. This is 7bit (00-7F) videotex format with control chars between 00-1F and escaped codes for alpha and graphic attributes. Ideally rows should have any trailing spaces removed and replaced with with a CR/LF combination. This will be rendered as is.&lt;br /&gt;
* '''rawT''': If set, then the content will be treated as raw teletex data. This is a 24 x 40 block of 7 bits chars (960 chars) in Teletext format (range 00-7F). This format is used internally when manipulating page data. It will be converted to RawV before being rendered.&lt;br /&gt;
&lt;br /&gt;
=== title ===&lt;br /&gt;
&lt;br /&gt;
This sets the title of the page. In many cases this may be left blank with all of the content specified in the ''content'' section (see above) however, the ''title'' section gives additional flexibility when creating frames.&lt;br /&gt;
&lt;br /&gt;
Values for ''title-type'' are the same as defined for the content section, however, if the type ''edit-tf'' is used then only the first four (default) lines of the edit.tf defined page are used. &lt;br /&gt;
&lt;br /&gt;
Separating title from content in this way allows logos and header sections to be created for the title whilst using markup for the main content or visa-versa. &lt;br /&gt;
&lt;br /&gt;
==== Example 1 ====&lt;br /&gt;
&lt;br /&gt;
In thi example the fields are blank meaning that only the data in the ''content'' section is displayed.&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;title&amp;quot;: {&lt;br /&gt;
            &amp;quot;data&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
            &amp;quot;merge-data&amp;quot;: []&lt;br /&gt;
        },&lt;br /&gt;
&lt;br /&gt;
==== Example 2 ====&lt;br /&gt;
&lt;br /&gt;
In this example, the top 4 lines of the edit.tf content is displayed at the top of the page.&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;title&amp;quot;: {&lt;br /&gt;
            &amp;quot;data&amp;quot;: &amp;quot;https://edit.tf/#0:QIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECAvobotqBX__oECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIC_9AgQIEGv-gQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgL_0Cj4kQav6BAgQIECBAgQIECBAgQIECBAgQIECBAgQIECAuq64P6Dx__oECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECA&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;edit.tf&amp;quot;,&lt;br /&gt;
            &amp;quot;merge-data&amp;quot;: []&lt;br /&gt;
        },&lt;br /&gt;
&lt;br /&gt;
To take the top 5 lines, the ''type'' field can be extended as follows.&lt;br /&gt;
&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;edit.tf,5&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Note that this extended form of ''type'' only applies to edit.tf types.&lt;br /&gt;
&lt;br /&gt;
==== Example 3 ====&lt;br /&gt;
&lt;br /&gt;
The merge data field can be used to add ''layers'' of markup data to the title area. For example the example above shows the Guardian logo. To add some alphagraphics text to this, an additional layer could be used e.g.&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;title&amp;quot;: {&lt;br /&gt;
            &amp;quot;data&amp;quot;: &amp;quot;https://edit.tf/#0:QIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECAvobotqBX__oECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIC_9AgQIEGv-gQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgL_0Cj4kQav6BAgQIECBAgQIECBAgQIECBAgQIECBAgQIECAuq64P6Dx__oECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECA&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;edit.tf,5&amp;quot;,&lt;br /&gt;
            &amp;quot;merge-data&amp;quot;: [&lt;br /&gt;
                &amp;quot;[w[             UK News]]&amp;quot;&lt;br /&gt;
            ]&lt;br /&gt;
        },&lt;br /&gt;
&lt;br /&gt;
Note that any number of layers can be added, however, the merge layer must be defined as markup.&lt;br /&gt;
&lt;br /&gt;
=== routing table ===&lt;br /&gt;
&lt;br /&gt;
The routing table defines which pages are navigated to when a user presses a key whilst viewing the frame. The table has 11 entries with the first 10 representing the keys 0-9, the final entry refers to the ''hash'' (return) key.&lt;br /&gt;
&lt;br /&gt;
The example below shows the default routing table for frame 9a. If the user is viewing this frame and presses 1 the frame 91a will be loaded, assuming it exists. Pressing the ''hash'' (return) key will take the user back to frame 0a, the main index.&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;routing-table&amp;quot;: [&lt;br /&gt;
            90,&lt;br /&gt;
            91,&lt;br /&gt;
            92,&lt;br /&gt;
            93,&lt;br /&gt;
            94,&lt;br /&gt;
            95,&lt;br /&gt;
            96,&lt;br /&gt;
            97,&lt;br /&gt;
            98,&lt;br /&gt;
            99,&lt;br /&gt;
            0&lt;br /&gt;
        ],&lt;br /&gt;
&lt;br /&gt;
=== cursor ===&lt;br /&gt;
&lt;br /&gt;
This element determines whether a cursor is shown on the page. Typically a cursor would only be shown on response frames.&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;cursor&amp;quot;: false,&lt;br /&gt;
        &lt;br /&gt;
=== connection ===&lt;br /&gt;
&lt;br /&gt;
This elements specifies the connection object used for gateway pages.&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;connection&amp;quot;: {&lt;br /&gt;
            &amp;quot;address&amp;quot;: &amp;quot;fish.ccl4.org&amp;quot;,&lt;br /&gt;
            &amp;quot;mode&amp;quot;: &amp;quot;viewdata&amp;quot;,&lt;br /&gt;
            &amp;quot;port&amp;quot;: 23&lt;br /&gt;
        },&lt;br /&gt;
&lt;br /&gt;
The values for ''address and port'' represent the endpoint of the system being accessed and the value for ''mode'' determines how the system is accessed, the options are:&lt;br /&gt;
&lt;br /&gt;
    viewdata&lt;br /&gt;
    full_duplex&lt;br /&gt;
    full_duplex_no_echo&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== author-id ===&lt;br /&gt;
&lt;br /&gt;
This is an optional field that can be used to indicate the author of the page or other source.&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;author-id&amp;quot;: &amp;quot;john&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
=== response-data ===&lt;br /&gt;
&lt;br /&gt;
These fields should be used when the frame type is set to be a ''response-frame''. &lt;br /&gt;
&lt;br /&gt;
There are two main sections, ''response-data'' and ''response-action''. Below is an example of a response frame used for the Telstar weather page. The frame is created in the normal way using ''markup'' or ''edit.tf''. In this example the text ''Town/Cty'' has been positioned near the centre of the page. Immediately to the right of this is a field for the user to enter either a Town or City, the ''response-data'' section defines that field. Once the user submits the frame the section ''response-action'' determines what happens. In the example here a binary file (''telstar-openweather-linux-amd64''), stored in the containers volume directory is executed with a single argument (''myopenweatherapikey''). Note that the ''post-action-frame'' is set to 290b, in this example frame 290b is dynamically generated by the binary file ''telstar-openweather-linux-amd64'' and contains the weather forecast.&lt;br /&gt;
&lt;br /&gt;
Full details of how to implement response frames are detailed in the section [[Implementing Response Frames]].&lt;br /&gt;
    &amp;quot;response-data&amp;quot;: {&lt;br /&gt;
        &amp;quot;response-fields&amp;quot;: [&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;vpos&amp;quot;: 8,&lt;br /&gt;
                &amp;quot;hpos&amp;quot;: 4,&lt;br /&gt;
                &amp;quot;required&amp;quot;: true,&lt;br /&gt;
                &amp;quot;length&amp;quot;: 16,&lt;br /&gt;
                &amp;quot;type&amp;quot;: &amp;quot;alphanumeric&amp;quot;,&lt;br /&gt;
                &amp;quot;auto-submit&amp;quot;: false,&lt;br /&gt;
                &amp;quot;password&amp;quot;: false&lt;br /&gt;
            }&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;response-action&amp;quot;: {&lt;br /&gt;
            &amp;quot;exec&amp;quot;: &amp;quot;/opt/telstar/volume/telstar-openweather-linux-amd64&amp;quot;,&lt;br /&gt;
            &amp;quot;args&amp;quot;: [&lt;br /&gt;
                &amp;quot;myopenweatherapikey&amp;quot;&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;post-action-frame&amp;quot;: {&lt;br /&gt;
                &amp;quot;page-no&amp;quot;: 290,&lt;br /&gt;
                &amp;quot;frame-id&amp;quot;: &amp;quot;c&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
=== navmessage-select ===&lt;br /&gt;
&lt;br /&gt;
Allows the ''navigation'' system message to be customised at frame level. In most cases this can be left blank in order that the system default is used instead, see [[Configuration Options]].&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;navmessage-select&amp;quot;: &amp;quot;[B][n][Y]Select item or[W]*page# : [_+]&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
=== navmessage-notfound ===&lt;br /&gt;
&lt;br /&gt;
Allows the ''not found'' system message to be customised at frame level. In most cases this can be left blank in order that the system default is used instead, see [[Configuration Options]].&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;navmessage-notfound&amp;quot;: &amp;quot;[B][n][Y]Page not Found :[W]&amp;quot;&lt;/div&gt;</summary>
		<author><name>John</name></author>
	</entry>
	<entry>
		<id>https://wiki.glasstty.com/index.php?title=Frames&amp;diff=352</id>
		<title>Frames</title>
		<link rel="alternate" type="text/html" href="https://wiki.glasstty.com/index.php?title=Frames&amp;diff=352"/>
		<updated>2022-05-16T20:32:57Z</updated>

		<summary type="html">&lt;p&gt;John: /* content */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;As is typical with interactive videotex systems, pages are numbered from 0 to 999999999 and consist of one or more frames with the suffix a-z, for example the first frame for page 200 would be 200a, the second 200b and so on (see [[Routing]]) for more details). These frames are stored within TELSTAR's database as ''JSON'' objects (see https://www.json.org/) and uploaded to Telstar using a simple command line utility.&lt;br /&gt;
&lt;br /&gt;
The Telstar utility program simply interacts with the Telstar API which is a restful API. This can be used directly by any software making it simple to programitically manage pages and routing information.&lt;br /&gt;
&lt;br /&gt;
Frames are defined in JSON. The simplest frame that can be viewed on TELSTAR would be as follows. This would create a simple information frame with some flashing content. In this example [[Markup]] has been used within the content, however, other content types can be used including edi.tf urls, see below.&lt;br /&gt;
&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;pid&amp;quot;: {&lt;br /&gt;
        &amp;quot;page-no&amp;quot;: 101,&lt;br /&gt;
        &amp;quot;frame-id&amp;quot;: &amp;quot;a&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;visible&amp;quot;: true,&lt;br /&gt;
      &amp;quot;content&amp;quot;: {&lt;br /&gt;
        &amp;quot;data&amp;quot;: &amp;quot;[D]This is page[F]101a&amp;quot;,&lt;br /&gt;
         &amp;quot;type&amp;quot;: &amp;quot;markup&amp;quot;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Shown below is a more complete example of a JSON defined frame. With this particular frame, the actual viewdata content has been created using the editor at http://edit.tf, this can be seen in the ''content.data'' and ''content.type'' keys. Both the edit.tf and zxnet (https://zxnet.co.uk/teletext/editor/) editors are supported. The example below is a simple information page with some simple routing (see [[Routing]]). Clicking the ''content.data'' link, or pasteing the value into a browser will show the page and allow it to be edited. It is not necessary to use the http://edit.tf editor, this is just one possible option.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;pid&amp;quot;: {&lt;br /&gt;
        &amp;quot;page-no&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;frame-id&amp;quot;: &amp;quot;a&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;visible&amp;quot;: true,&lt;br /&gt;
      &amp;quot;frame-type&amp;quot;: &amp;quot;information&amp;quot;,&lt;br /&gt;
      &amp;quot;content&amp;quot;: {&lt;br /&gt;
        &amp;quot;data&amp;quot;: &amp;quot;http://edit.tf/#0:QIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQMMKAbNw6dyCTuyZfCBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgKJEiRIkSJEiRIkSJEiRIkSJEiRIkSJEiRIkSJEiRIkSJEiRAxQR4s6LSgzEEmdUi0otOogkzo0-lNg1JM-cCg8unNYgQIASBBj67OnXllWIMu7pl5dMOndty7uixBoy4dnTQsQIECBAgBIEHfLh2dNCDDuyINmnNl59POzKuQIECBAgQIECBAgQIECBAyQTotemggzoiCvFg1JEWkCnYemnfuw7EGHdkQIECBAgQIASBBp3dMvLdh6ad-7DsQbsvfmgw7siDvlw9NGXkuQIECBAgQM0EKrTkzotOmgkzo0-lNg1JM-cCh79vDDu8oMO7IgQIECAEgQYuvPTuy8-aDdl781wM6EjVKcVBMw9MvPogoctOPLzQIEDRBHn1otKdNizqiCTOjT6U2DUkz5wKlvw5OaxByw6dixAgBIEGHdkQUMPLZpw7cu7ouQIECBAgQIECBAgQIECBAgQIECBA2QR4NSLXg2UFOLSrSYcWmCnWKkWYsQVIsWNBsLEEOHMaIASBBh3ZEHTRlQQ9-zfz54diCHh7ZUGHJ2y7unXllXIECBAgQN0EifMkxINmmCqcsPbLsQYd2RBI37NOTD5QbsvfmuQIECBA4CHQc2TDpT50WogcMGCAScgoOnLTi69MqDpvQdNGnmgQIAaBBzy8u2nHlQd9PTQgqZdmXnvzdO-HllQYd2RBt38sq5AgQOQ0yfHQT40ZYgp2adSLNQSZ0aegTIKkWnUQUIMeLTQIECAokSJEiRIkSJEiRIkSJEiRIkSJEiRIkSJEiRIkSJEiRIkSJEFeLBqSItJBGn0osODTqIBIM6EQIEFDDnyoFTJywvoECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECA&amp;quot;,&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;edit.tf&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;routing-table&amp;quot;: [0,1,11,3,400,5,6,7,800,9,0],&lt;br /&gt;
      &amp;quot;cursor&amp;quot;: false,&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
== Adding Frames to the System ==&lt;br /&gt;
&lt;br /&gt;
Frames can be added to the system using either the Telstar API.&lt;br /&gt;
&lt;br /&gt;
The Telstar API, in conjunction with the cross platform Telstar Util software, provides a simple method of creating and managing pages.&lt;br /&gt;
&lt;br /&gt;
The API can be used to retrieve and update frames and configuring routing. The API is a restful API that uses the GET, PUT, POST and DELETE HTTP methods and as such can be used from any application.&lt;br /&gt;
&lt;br /&gt;
Data is passed to and from the API in JSON format, making the system very simple to use in any programming language. The whole API could be used without any programming at all by using a command line utility such as CURL.&lt;br /&gt;
&lt;br /&gt;
''Further details of the Telstar API can be found in the section [[The Telstar API]].''&lt;br /&gt;
&lt;br /&gt;
== Adding Content with the Edit.tf editor ==&lt;br /&gt;
&lt;br /&gt;
There are several ways to add content to a page. One of the easiest is to create the page in an editor such as http://edit.tf.&lt;br /&gt;
&lt;br /&gt;
The JSON file would look something like the one showm below. Note that the content type is set to editf and the content data contains the edit.tf url.&lt;br /&gt;
&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;pid&amp;quot;: {&lt;br /&gt;
            &amp;quot;page-no&amp;quot;: 101,&lt;br /&gt;
            &amp;quot;frame-id&amp;quot;: &amp;quot;a&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;visible&amp;quot;: true,&lt;br /&gt;
        &amp;quot;frame-type&amp;quot;: &amp;quot;information&amp;quot;,&lt;br /&gt;
        &amp;quot;content&amp;quot;: {&lt;br /&gt;
            &amp;quot;data&amp;quot;: &amp;quot;http://edit.tf/#0:QIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQICn_OmTJkSJApUqVKlSpUlcHApiTJkyZEiRIkyZMmTIkSJFmKf3JX58____RBg-fPnzog__2iBBo-fNX9qgQcOHDh8-fGiAp_zFf______2v7_____7X___oEGr__Qa0ur_________QoCn9ywK__6D__a__7dH__tf___1QIv_9AiQIkaPX_bo0aMpiKf_-Yr__oP_9r__tUH_-1____9og__yjnz5cldX9qUc-fPkp__uSv_-g__2v_-1Qf_7X__aIv____KZv_dIV__2pTN___yn__mK___z__a____5__tf_9qgVf__8o5_vWJX__alHP___Kf_7kr____6dBr_____-h__2qBBr__ymbPnSFf69CUzf__8pnz5iq9ejRoECBWvXr0KBGjQYOHBHz4cECBAgwcCily7__yqDhw4ePnzogQeP7RAg0fPiBB___9X___QYPH___-sCmb__KoP________3B__tUCDV__tUH___1f36XB-_______KOf_8qgRo__9B__v9X___QINX___Qav__B8-NNX_-jR___8pm__ymYrq______h_odX9qg1f___7q__9X_-h1f_5TBgwYM37__KOSur-_Ro0Pr_8_f_qDV_b___r__1f_6D___lFKlSpUu__8pmK_v7VAgwf______tNX9r______V__oP__-gQaPnwpm__yqDB__tUCD__QIEG___1f2qL____9X_-g____z5-__ymb__KoNX_-lQKl6VAgQav6_V__oNf___1f2qBX_____9-hKOf_8qgVJ0JRw4cOPLkqiQoESNGgVL0aFEjQoECJGjRoymDNm__ymTJkzZv3_____-3bt27du3Thw8efPnz58-fPnz58-fP___QIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECA&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;edit.tf&amp;quot;&lt;br /&gt;
        }    &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
== Adding Content using Markup ==&lt;br /&gt;
&lt;br /&gt;
Content can be added directly to the JSON file using a very simple markup. For example consider the following frame definition.&lt;br /&gt;
&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;pid&amp;quot;: {&lt;br /&gt;
            &amp;quot;page-no&amp;quot;: 101,&lt;br /&gt;
            &amp;quot;frame-id&amp;quot;: &amp;quot;a&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;visible&amp;quot;: true,&lt;br /&gt;
        &amp;quot;frame-type&amp;quot;: &amp;quot;information&amp;quot;,&lt;br /&gt;
        &amp;quot;title&amp;quot;: {&lt;br /&gt;
            &amp;quot;data&amp;quot;: &amp;quot;[D]Welcome\r\n\r\n&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;markup&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;content&amp;quot;: {&lt;br /&gt;
            &amp;quot;data&amp;quot;: &amp;quot;[Y]Hello[C]Telstar[M]World&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;markup&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
This frame uses markup in the title and the content, The title is specified as [D]ouble height and the three words used in the content are coloured yellow, cyan and magenta respectively.&lt;br /&gt;
&lt;br /&gt;
Full details of markup can be found in the [[Markup]] section.&lt;br /&gt;
&lt;br /&gt;
== Complete Frame Description ==&lt;br /&gt;
&lt;br /&gt;
The frame below is a standard information page from the TELSTAR system shown in its JSON format. It represents the first frame of page 9. Taking this frame as an example, a description of the fields and their meaning is decribed below.&lt;br /&gt;
&lt;br /&gt;
''The full json schema can be found [[Frame Schema|here]].''&lt;br /&gt;
&lt;br /&gt;
     {&lt;br /&gt;
    	&amp;quot;pid&amp;quot;: {&lt;br /&gt;
    		&amp;quot;page-no&amp;quot;: 9,&lt;br /&gt;
    		&amp;quot;frame-id&amp;quot;: &amp;quot;a&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;visible&amp;quot;: true,&lt;br /&gt;
        &amp;quot;header-text&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;cost&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;frame-type&amp;quot;: &amp;quot;information&amp;quot;,&lt;br /&gt;
        &amp;quot;redirect&amp;quot;: {&lt;br /&gt;
            &amp;quot;page-no&amp;quot;: 0,&lt;br /&gt;
            &amp;quot;frame-id&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;content&amp;quot;: {&lt;br /&gt;
            &amp;quot;data&amp;quot;: &amp;quot;https://edit.tf/#0:QIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgc4UCBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQICixYsWLFixYsWLFixYsWLFixYsWLFixYsWLFixYsWLFixYgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAxQIIs6PJnRYtKTOjoKkWnUQUIMeLTQIECBAgQIECBAgQIEDRAgp2adSLNQSZ0aegQIECBAgQIECBAgQIECBAgQIECBAgQNkCCPBqRa8GygpxaVaTDi00CBAgQIECBAgQIECBAgQIECBA4QIIc-dUgw6iCJFqQZMymgQIECBAgQIECBAgQIECBAgQIEDlAgmT46CfOQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQMECCZPjoJ8aMgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQICixYsWLFixYsWLFixYsWLFixYsWLFixYsWLFixYsWLFixYgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECAFUQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgBVAMUNMQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIAVQDFDTAlMPUQIECBAgQIECBAgQIECBAgQIECBAgQIECAFUAxQ0wJTD1A0EHSQIECBAgQIECBAgQIECBAgQIECBAgQIECANMCUw9QNBB0kCBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECAPUDQQdJAgQIECBAgQIECBAgQIECAosWLFixYsWLFixYsQIECAHSQIECAosWLFixYsWLFixYsWIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECA&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;edit.tf'&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;title&amp;quot;: {&lt;br /&gt;
            &amp;quot;data&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
            &amp;quot;merge-data&amp;quot;: []&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;routing-table&amp;quot;: [&lt;br /&gt;
            90,&lt;br /&gt;
            91,&lt;br /&gt;
            92,&lt;br /&gt;
            93,&lt;br /&gt;
            94,&lt;br /&gt;
            95,&lt;br /&gt;
            96,&lt;br /&gt;
            97,&lt;br /&gt;
            98,&lt;br /&gt;
            990,&lt;br /&gt;
            0&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;cursor&amp;quot;: false,&lt;br /&gt;
        &amp;quot;connection&amp;quot;: {&lt;br /&gt;
            &amp;quot;address&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
            &amp;quot;mode&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
            &amp;quot;port&amp;quot;: 0&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;author-id&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;response-data&amp;quot;: {&lt;br /&gt;
            &amp;quot;responses&amp;quot;: null,&lt;br /&gt;
            &amp;quot;response-action&amp;quot;: {&lt;br /&gt;
                &amp;quot;exec&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
                &amp;quot;args&amp;quot;: null,&lt;br /&gt;
                &amp;quot;post-action-frame&amp;quot;: {&lt;br /&gt;
                    &amp;quot;page-no&amp;quot;: 0,&lt;br /&gt;
                    &amp;quot;frame-id&amp;quot;: ''&lt;br /&gt;
                },&lt;br /&gt;
                &amp;quot;post-cancel-frame&amp;quot;: {&lt;br /&gt;
                    &amp;quot;page-no&amp;quot;: 0,&lt;br /&gt;
                    &amp;quot;frame-id&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;navmessage-select&amp;quot;: &amp;quot;[B][n][Y]Select item or[W]*page# : [_+]&amp;quot;,&lt;br /&gt;
        &amp;quot;navmessage-notfound&amp;quot;: &amp;quot;[B][n][Y]Page not Found :[W]&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
=== pid ===&lt;br /&gt;
&lt;br /&gt;
Specifies the page number and frame id for the frame.&lt;br /&gt;
&lt;br /&gt;
    	&amp;quot;pid&amp;quot;: {&lt;br /&gt;
    		&amp;quot;page-no&amp;quot;: 9,&lt;br /&gt;
    		&amp;quot;frame-id&amp;quot;: &amp;quot;a&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
&lt;br /&gt;
=== visible ===&lt;br /&gt;
&lt;br /&gt;
When set to false, the frame will not be accessible and will return the ''not found'' system message to the user if an attempt is made to access it.&lt;br /&gt;
&lt;br /&gt;
      &amp;quot;visible&amp;quot;: true,&lt;br /&gt;
&lt;br /&gt;
=== header-text ===&lt;br /&gt;
&lt;br /&gt;
Allows the default header text to be ovwerridden at frame level. If this is left blank the default header will be used, see configuration.&lt;br /&gt;
&lt;br /&gt;
      &amp;quot;header-text&amp;quot;: &amp;quot;[Y]MICRONETn 800 (C)&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
=== cost ===&lt;br /&gt;
&lt;br /&gt;
      &amp;quot;cost&amp;quot;: 0,&lt;br /&gt;
&lt;br /&gt;
=== frame-type ===&lt;br /&gt;
&lt;br /&gt;
The API supports the following frame types ''initial'', ''mainindex'', ''information'', ''exit'', ''gateway'', ''test'' and ''response''.&lt;br /&gt;
&lt;br /&gt;
      &amp;quot;frame-type&amp;quot;: &amp;quot;information&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
* '''initial''': This frame type is used on the start page, see [[Configuration Options]]. Typically only one of these frames would exist within a system.&lt;br /&gt;
* '''mainindex''': This frame type is used on the main index page. , see [[Configuration Options]]. Only one of these frames should exist within a system.&lt;br /&gt;
* '''information''': This frame type is used for all normal content frames.&lt;br /&gt;
* '''exit''': This frame type is used for an exit page, any number of exit pages can be defined. When an exit page is rendered it will close the connection.&lt;br /&gt;
* '''gateway''': This page type is used to define a gateway page and is used in conjunction with the connection element (see below).&lt;br /&gt;
* '''test''': This page type indicates a test page and prevents navigation and system messages from being shown. this is typically used for frames that need to use the whole display such as 'test cards' etc.&lt;br /&gt;
* '''telesoftware''': Telesoftware frames (see [[Telesoftware]]).&lt;br /&gt;
* '''response''': This frame type is used for response frames. See [[Implementing Response Frames]].&lt;br /&gt;
* '''system''': Reserved for use internally.&lt;br /&gt;
* '''exception''': Reserved for use internally.&lt;br /&gt;
&lt;br /&gt;
=== redirect ===&lt;br /&gt;
 &lt;br /&gt;
If set it simply means that the user is redirected to the specified frame. This can be a useful alternative form of navigation to the routing table.&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;redirect&amp;quot;: {&lt;br /&gt;
            &amp;quot;page-no&amp;quot;: 9,&lt;br /&gt;
            &amp;quot;frame-id&amp;quot;: &amp;quot;a&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
&lt;br /&gt;
The following is an example of a complete redirect page.&lt;br /&gt;
&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;PID&amp;quot;: {&lt;br /&gt;
            &amp;quot;page-no&amp;quot;: 2,&lt;br /&gt;
            &amp;quot;frame-id&amp;quot;: &amp;quot;a&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;redirect&amp;quot;: {&lt;br /&gt;
            &amp;quot;page-no&amp;quot;: 11,&lt;br /&gt;
            &amp;quot;frame-id&amp;quot;: &amp;quot;a&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;visible&amp;quot;: true&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
=== content ===&lt;br /&gt;
&lt;br /&gt;
These elements define the content. The example below shows the content.type to be an edit.tf url. The available types are shown below.&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;content&amp;quot;: {&lt;br /&gt;
            &amp;quot;data&amp;quot;: &amp;quot;https://edit.tf/#0:QIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgc4UCBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQICixYsWLFixYsWLFixYsWLFixYsWLFixYsWLFixYsWLFixYgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAxQIIs6PJnRYtKTOjoKkWnUQUIMeLTQIECBAgQIECBAgQIEDRAgp2adSLNQSZ0aegQIECBAgQIECBAgQIECBAgQIECBAgQNkCCPBqRa8GygpxaVaTDi00CBAgQIECBAgQIECBAgQIECBA4QIIc-dUgw6iCJFqQZMymgQIECBAgQIECBAgQIECBAgQIEDlAgmT46CfOQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQMECCZPjoJ8aMgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQICixYsWLFixYsWLFixYsWLFixYsWLFixYsWLFixYsWLFixYgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECAFUQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgBVAMUNMQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIAVQDFDTAlMPUQIECBAgQIECBAgQIECBAgQIECBAgQIECAFUAxQ0wJTD1A0EHSQIECBAgQIECBAgQIECBAgQIECBAgQIECANMCUw9QNBB0kCBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECAPUDQQdJAgQIECBAgQIECBAgQIECAosWLFixYsWLFixYsQIECAHSQIECAosWLFixYsWLFixYsWIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECA&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;edit.tf'&lt;br /&gt;
        },&lt;br /&gt;
&lt;br /&gt;
Content types:&lt;br /&gt;
&lt;br /&gt;
* '''zxnet''': If set, then the content will be treated as an zxnet editor url. This is converted to RawV before being rendered.&lt;br /&gt;
* '''edit.tf''': If set, then the content will be treated as an edit.tf url. This is converted to RawV before being rendered.&lt;br /&gt;
* '''markup''': If set, then the content will be treated as ''markup'' content. Full details of ''markup'' can be found in the section [[Markup]]&lt;br /&gt;
* '''rawV''': If set, then the content will be treated as raw videotex data. This is 7bit (00-7F) videotex format with control chars between 00-1F and escaped codes for alpha and graphic attributes. Ideally rows should have any trailing spaces removed and replaced with with a CR/LF combination. This will be rendered as is.&lt;br /&gt;
* '''rawT''': If set, then the content will be treated as raw teletex data. This is a 24 x 40 block of 7 bits chars (960 chars) in Teletext format (range 00-7F). This format is used internally when manipulating page data. It will be converted to RawV before being rendered.&lt;br /&gt;
&lt;br /&gt;
=== title ===&lt;br /&gt;
&lt;br /&gt;
This sets the title of the page. In many cases this may be left blank with all of the content specified in the ''content'' section (see above) however, the ''title'' section gives additional flexibility when creating frames.&lt;br /&gt;
&lt;br /&gt;
Values for ''title-type'' are the same as defined for the content section, however, if the type ''edit-tf'' is used then only the first four (default) lines of the edit.tf defined page are used. &lt;br /&gt;
&lt;br /&gt;
Separating title from content in this way allows logos and header sections to be created for the title whilst using markup for the main content or visa-versa. &lt;br /&gt;
&lt;br /&gt;
==== Example 1 ====&lt;br /&gt;
&lt;br /&gt;
In thi example the fields are blank meaning that only the data in the ''content'' section is displayed.&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;title&amp;quot;: {&lt;br /&gt;
            &amp;quot;data&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
            &amp;quot;merge-data&amp;quot;: []&lt;br /&gt;
        },&lt;br /&gt;
&lt;br /&gt;
==== Example 2 ====&lt;br /&gt;
&lt;br /&gt;
In this example, the top 4 lines of the edit.tf content is displayed at the top of the page.&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;title&amp;quot;: {&lt;br /&gt;
            &amp;quot;data&amp;quot;: &amp;quot;https://edit.tf/#0:QIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECAvobotqBX__oECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIC_9AgQIEGv-gQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgL_0Cj4kQav6BAgQIECBAgQIECBAgQIECBAgQIECBAgQIECAuq64P6Dx__oECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECA&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;edit.tf&amp;quot;,&lt;br /&gt;
            &amp;quot;merge-data&amp;quot;: []&lt;br /&gt;
        },&lt;br /&gt;
&lt;br /&gt;
To take the top 5 lines, the ''type'' field can be extended as follows.&lt;br /&gt;
&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;edit.tf,5&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Note that this extended form of ''type'' only applies to edit.tf types.&lt;br /&gt;
&lt;br /&gt;
==== Example 3 ====&lt;br /&gt;
&lt;br /&gt;
The merge data field can be used to add ''layers'' of markup data to the title area. For example the example above shows the Guardian logo. To add some alphagraphics text to this, an additional layer could be used e.g.&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;title&amp;quot;: {&lt;br /&gt;
            &amp;quot;data&amp;quot;: &amp;quot;https://edit.tf/#0:QIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECAvobotqBX__oECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIC_9AgQIEGv-gQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgL_0Cj4kQav6BAgQIECBAgQIECBAgQIECBAgQIECBAgQIECAuq64P6Dx__oECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECA&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;edit.tf,5&amp;quot;,&lt;br /&gt;
            &amp;quot;merge-data&amp;quot;: [&lt;br /&gt;
                &amp;quot;[w[             UK News]]&amp;quot;&lt;br /&gt;
            ]&lt;br /&gt;
        },&lt;br /&gt;
&lt;br /&gt;
Note that any number of layers can be added, however, the merge layer must be defined as markup.&lt;br /&gt;
&lt;br /&gt;
=== routing table ===&lt;br /&gt;
&lt;br /&gt;
The routing table defines which pages are navigated to when a user presses a key whilst viewing the frame. The table has 11 entries with the first 10 representing the keys 0-9, the final entry refers to the ''hash'' (return) key.&lt;br /&gt;
&lt;br /&gt;
The example below shows the default routing table for frame 9a. If the user is viewing this frame and presses 1 the frame 91a will be loaded, assuming it exists. Pressing the ''hash'' (return) key will take the user back to frame 0a, the main index.&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;routing-table&amp;quot;: [&lt;br /&gt;
            90,&lt;br /&gt;
            91,&lt;br /&gt;
            92,&lt;br /&gt;
            93,&lt;br /&gt;
            94,&lt;br /&gt;
            95,&lt;br /&gt;
            96,&lt;br /&gt;
            97,&lt;br /&gt;
            98,&lt;br /&gt;
            99,&lt;br /&gt;
            0&lt;br /&gt;
        ],&lt;br /&gt;
&lt;br /&gt;
=== cursor ===&lt;br /&gt;
&lt;br /&gt;
This element determines whether a cursor is shown on the page. Typically a cursor would only be shown on response frames.&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;cursor&amp;quot;: false,&lt;br /&gt;
        &lt;br /&gt;
=== connection ===&lt;br /&gt;
&lt;br /&gt;
This elements specifies the connection object used for gateway pages.&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;connection&amp;quot;: {&lt;br /&gt;
            &amp;quot;address&amp;quot;: &amp;quot;fish.ccl4.org&amp;quot;,&lt;br /&gt;
            &amp;quot;mode&amp;quot;: &amp;quot;viewdata&amp;quot;,&lt;br /&gt;
            &amp;quot;port&amp;quot;: 23&lt;br /&gt;
        },&lt;br /&gt;
&lt;br /&gt;
The values for ''address and port'' represent the endpoint of the system being accessed and the value for ''mode'' determines how the system is accessed, the options are:&lt;br /&gt;
&lt;br /&gt;
    viewdata&lt;br /&gt;
    full_duplex&lt;br /&gt;
    full_duplex_no_echo&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== author-id ===&lt;br /&gt;
&lt;br /&gt;
This is an optional field that can be used to indicate the author of the page or other source.&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;author-id&amp;quot;: &amp;quot;john&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
=== response-data ===&lt;br /&gt;
&lt;br /&gt;
These fields should be used when the frame type is set to be a ''response-frame''. &lt;br /&gt;
&lt;br /&gt;
There are two main sections, ''response-data'' and ''response-action''. Below is an example of a response frame used for the Telstar weather page. The frame is created in the normal way using ''markup'' or ''edit.tf''. In this example the text ''Town/Cty'' has been positioned near the centre of the page. Immediately to the right of this is a field for the user to enter either a Town or City, the ''response-data'' section defines that field. Once the user submits the frame the section ''response-action'' determines what happens. In the example here a binary file (''telstar-openweather-linux-amd64''), stored in the containers volume directory is executed with a single argument (''myopenweatherapikey''). Note that the ''post-action-frame'' is set to 290b, in this example frame 290b is dynamically generated by the binary file ''telstar-openweather-linux-amd64'' and contains the weather forecast.&lt;br /&gt;
&lt;br /&gt;
Full details of how to implement response frames are detailed in the section [[Implementing Response Frames]].&lt;br /&gt;
    &amp;quot;response-data&amp;quot;: {&lt;br /&gt;
        &amp;quot;response-fields&amp;quot;: [&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;vpos&amp;quot;: 8,&lt;br /&gt;
                &amp;quot;hpos&amp;quot;: 4,&lt;br /&gt;
                &amp;quot;required&amp;quot;: true,&lt;br /&gt;
                &amp;quot;length&amp;quot;: 16,&lt;br /&gt;
                &amp;quot;type&amp;quot;: &amp;quot;alphanumeric&amp;quot;,&lt;br /&gt;
                &amp;quot;auto-submit&amp;quot;: false,&lt;br /&gt;
                &amp;quot;password&amp;quot;: false&lt;br /&gt;
            }&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;response-action&amp;quot;: {&lt;br /&gt;
            &amp;quot;exec&amp;quot;: &amp;quot;/opt/telstar/volume/telstar-openweather-linux-amd64&amp;quot;,&lt;br /&gt;
            &amp;quot;args&amp;quot;: [&lt;br /&gt;
                &amp;quot;myopenweatherapikey&amp;quot;&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;post-action-frame&amp;quot;: {&lt;br /&gt;
                &amp;quot;page-no&amp;quot;: 290,&lt;br /&gt;
                &amp;quot;frame-id&amp;quot;: &amp;quot;c&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
=== navmessage-select ===&lt;br /&gt;
&lt;br /&gt;
Allows the ''navigation'' system message to be customised at frame level. In most cases this can be left blank in order that the system default is used instead, see [[Configuration Options]].&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;navmessage-select&amp;quot;: &amp;quot;[B][n][Y]Select item or[W]*page# : [_+]&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
=== navmessage-notfound ===&lt;br /&gt;
&lt;br /&gt;
Allows the ''not found'' system message to be customised at frame level. In most cases this can be left blank in order that the system default is used instead, see [[Configuration Options]].&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;navmessage-notfound&amp;quot;: &amp;quot;[B][n][Y]Page not Found :[W]&amp;quot;&lt;/div&gt;</summary>
		<author><name>John</name></author>
	</entry>
	<entry>
		<id>https://wiki.glasstty.com/index.php?title=Frames&amp;diff=351</id>
		<title>Frames</title>
		<link rel="alternate" type="text/html" href="https://wiki.glasstty.com/index.php?title=Frames&amp;diff=351"/>
		<updated>2022-05-16T20:32:08Z</updated>

		<summary type="html">&lt;p&gt;John: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;As is typical with interactive videotex systems, pages are numbered from 0 to 999999999 and consist of one or more frames with the suffix a-z, for example the first frame for page 200 would be 200a, the second 200b and so on (see [[Routing]]) for more details). These frames are stored within TELSTAR's database as ''JSON'' objects (see https://www.json.org/) and uploaded to Telstar using a simple command line utility.&lt;br /&gt;
&lt;br /&gt;
The Telstar utility program simply interacts with the Telstar API which is a restful API. This can be used directly by any software making it simple to programitically manage pages and routing information.&lt;br /&gt;
&lt;br /&gt;
Frames are defined in JSON. The simplest frame that can be viewed on TELSTAR would be as follows. This would create a simple information frame with some flashing content. In this example [[Markup]] has been used within the content, however, other content types can be used including edi.tf urls, see below.&lt;br /&gt;
&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;pid&amp;quot;: {&lt;br /&gt;
        &amp;quot;page-no&amp;quot;: 101,&lt;br /&gt;
        &amp;quot;frame-id&amp;quot;: &amp;quot;a&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;visible&amp;quot;: true,&lt;br /&gt;
      &amp;quot;content&amp;quot;: {&lt;br /&gt;
        &amp;quot;data&amp;quot;: &amp;quot;[D]This is page[F]101a&amp;quot;,&lt;br /&gt;
         &amp;quot;type&amp;quot;: &amp;quot;markup&amp;quot;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Shown below is a more complete example of a JSON defined frame. With this particular frame, the actual viewdata content has been created using the editor at http://edit.tf, this can be seen in the ''content.data'' and ''content.type'' keys. Both the edit.tf and zxnet (https://zxnet.co.uk/teletext/editor/) editors are supported. The example below is a simple information page with some simple routing (see [[Routing]]). Clicking the ''content.data'' link, or pasteing the value into a browser will show the page and allow it to be edited. It is not necessary to use the http://edit.tf editor, this is just one possible option.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;pid&amp;quot;: {&lt;br /&gt;
        &amp;quot;page-no&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;frame-id&amp;quot;: &amp;quot;a&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;visible&amp;quot;: true,&lt;br /&gt;
      &amp;quot;frame-type&amp;quot;: &amp;quot;information&amp;quot;,&lt;br /&gt;
      &amp;quot;content&amp;quot;: {&lt;br /&gt;
        &amp;quot;data&amp;quot;: &amp;quot;http://edit.tf/#0:QIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQMMKAbNw6dyCTuyZfCBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgKJEiRIkSJEiRIkSJEiRIkSJEiRIkSJEiRIkSJEiRIkSJEiRAxQR4s6LSgzEEmdUi0otOogkzo0-lNg1JM-cCg8unNYgQIASBBj67OnXllWIMu7pl5dMOndty7uixBoy4dnTQsQIECBAgBIEHfLh2dNCDDuyINmnNl59POzKuQIECBAgQIECBAgQIECBAyQTotemggzoiCvFg1JEWkCnYemnfuw7EGHdkQIECBAgQIASBBp3dMvLdh6ad-7DsQbsvfmgw7siDvlw9NGXkuQIECBAgQM0EKrTkzotOmgkzo0-lNg1JM-cCh79vDDu8oMO7IgQIECAEgQYuvPTuy8-aDdl781wM6EjVKcVBMw9MvPogoctOPLzQIEDRBHn1otKdNizqiCTOjT6U2DUkz5wKlvw5OaxByw6dixAgBIEGHdkQUMPLZpw7cu7ouQIECBAgQIECBAgQIECBAgQIECBA2QR4NSLXg2UFOLSrSYcWmCnWKkWYsQVIsWNBsLEEOHMaIASBBh3ZEHTRlQQ9-zfz54diCHh7ZUGHJ2y7unXllXIECBAgQN0EifMkxINmmCqcsPbLsQYd2RBI37NOTD5QbsvfmuQIECBA4CHQc2TDpT50WogcMGCAScgoOnLTi69MqDpvQdNGnmgQIAaBBzy8u2nHlQd9PTQgqZdmXnvzdO-HllQYd2RBt38sq5AgQOQ0yfHQT40ZYgp2adSLNQSZ0aegTIKkWnUQUIMeLTQIECAokSJEiRIkSJEiRIkSJEiRIkSJEiRIkSJEiRIkSJEiRIkSJEFeLBqSItJBGn0osODTqIBIM6EQIEFDDnyoFTJywvoECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECA&amp;quot;,&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;edit.tf&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;routing-table&amp;quot;: [0,1,11,3,400,5,6,7,800,9,0],&lt;br /&gt;
      &amp;quot;cursor&amp;quot;: false,&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
== Adding Frames to the System ==&lt;br /&gt;
&lt;br /&gt;
Frames can be added to the system using either the Telstar API.&lt;br /&gt;
&lt;br /&gt;
The Telstar API, in conjunction with the cross platform Telstar Util software, provides a simple method of creating and managing pages.&lt;br /&gt;
&lt;br /&gt;
The API can be used to retrieve and update frames and configuring routing. The API is a restful API that uses the GET, PUT, POST and DELETE HTTP methods and as such can be used from any application.&lt;br /&gt;
&lt;br /&gt;
Data is passed to and from the API in JSON format, making the system very simple to use in any programming language. The whole API could be used without any programming at all by using a command line utility such as CURL.&lt;br /&gt;
&lt;br /&gt;
''Further details of the Telstar API can be found in the section [[The Telstar API]].''&lt;br /&gt;
&lt;br /&gt;
== Adding Content with the Edit.tf editor ==&lt;br /&gt;
&lt;br /&gt;
There are several ways to add content to a page. One of the easiest is to create the page in an editor such as http://edit.tf.&lt;br /&gt;
&lt;br /&gt;
The JSON file would look something like the one showm below. Note that the content type is set to editf and the content data contains the edit.tf url.&lt;br /&gt;
&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;pid&amp;quot;: {&lt;br /&gt;
            &amp;quot;page-no&amp;quot;: 101,&lt;br /&gt;
            &amp;quot;frame-id&amp;quot;: &amp;quot;a&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;visible&amp;quot;: true,&lt;br /&gt;
        &amp;quot;frame-type&amp;quot;: &amp;quot;information&amp;quot;,&lt;br /&gt;
        &amp;quot;content&amp;quot;: {&lt;br /&gt;
            &amp;quot;data&amp;quot;: &amp;quot;http://edit.tf/#0:QIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQICn_OmTJkSJApUqVKlSpUlcHApiTJkyZEiRIkyZMmTIkSJFmKf3JX58____RBg-fPnzog__2iBBo-fNX9qgQcOHDh8-fGiAp_zFf______2v7_____7X___oEGr__Qa0ur_________QoCn9ywK__6D__a__7dH__tf___1QIv_9AiQIkaPX_bo0aMpiKf_-Yr__oP_9r__tUH_-1____9og__yjnz5cldX9qUc-fPkp__uSv_-g__2v_-1Qf_7X__aIv____KZv_dIV__2pTN___yn__mK___z__a____5__tf_9qgVf__8o5_vWJX__alHP___Kf_7kr____6dBr_____-h__2qBBr__ymbPnSFf69CUzf__8pnz5iq9ejRoECBWvXr0KBGjQYOHBHz4cECBAgwcCily7__yqDhw4ePnzogQeP7RAg0fPiBB___9X___QYPH___-sCmb__KoP________3B__tUCDV__tUH___1f36XB-_______KOf_8qgRo__9B__v9X___QINX___Qav__B8-NNX_-jR___8pm__ymYrq______h_odX9qg1f___7q__9X_-h1f_5TBgwYM37__KOSur-_Ro0Pr_8_f_qDV_b___r__1f_6D___lFKlSpUu__8pmK_v7VAgwf______tNX9r______V__oP__-gQaPnwpm__yqDB__tUCD__QIEG___1f2qL____9X_-g____z5-__ymb__KoNX_-lQKl6VAgQav6_V__oNf___1f2qBX_____9-hKOf_8qgVJ0JRw4cOPLkqiQoESNGgVL0aFEjQoECJGjRoymDNm__ymTJkzZv3_____-3bt27du3Thw8efPnz58-fPnz58-fP___QIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECA&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;edit.tf&amp;quot;&lt;br /&gt;
        }    &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
== Adding Content using Markup ==&lt;br /&gt;
&lt;br /&gt;
Content can be added directly to the JSON file using a very simple markup. For example consider the following frame definition.&lt;br /&gt;
&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;pid&amp;quot;: {&lt;br /&gt;
            &amp;quot;page-no&amp;quot;: 101,&lt;br /&gt;
            &amp;quot;frame-id&amp;quot;: &amp;quot;a&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;visible&amp;quot;: true,&lt;br /&gt;
        &amp;quot;frame-type&amp;quot;: &amp;quot;information&amp;quot;,&lt;br /&gt;
        &amp;quot;title&amp;quot;: {&lt;br /&gt;
            &amp;quot;data&amp;quot;: &amp;quot;[D]Welcome\r\n\r\n&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;markup&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;content&amp;quot;: {&lt;br /&gt;
            &amp;quot;data&amp;quot;: &amp;quot;[Y]Hello[C]Telstar[M]World&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;markup&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
This frame uses markup in the title and the content, The title is specified as [D]ouble height and the three words used in the content are coloured yellow, cyan and magenta respectively.&lt;br /&gt;
&lt;br /&gt;
Full details of markup can be found in the [[Markup]] section.&lt;br /&gt;
&lt;br /&gt;
== Complete Frame Description ==&lt;br /&gt;
&lt;br /&gt;
The frame below is a standard information page from the TELSTAR system shown in its JSON format. It represents the first frame of page 9. Taking this frame as an example, a description of the fields and their meaning is decribed below.&lt;br /&gt;
&lt;br /&gt;
''The full json schema can be found [[Frame Schema|here]].''&lt;br /&gt;
&lt;br /&gt;
     {&lt;br /&gt;
    	&amp;quot;pid&amp;quot;: {&lt;br /&gt;
    		&amp;quot;page-no&amp;quot;: 9,&lt;br /&gt;
    		&amp;quot;frame-id&amp;quot;: &amp;quot;a&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;visible&amp;quot;: true,&lt;br /&gt;
        &amp;quot;header-text&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;cost&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;frame-type&amp;quot;: &amp;quot;information&amp;quot;,&lt;br /&gt;
        &amp;quot;redirect&amp;quot;: {&lt;br /&gt;
            &amp;quot;page-no&amp;quot;: 0,&lt;br /&gt;
            &amp;quot;frame-id&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;content&amp;quot;: {&lt;br /&gt;
            &amp;quot;data&amp;quot;: &amp;quot;https://edit.tf/#0:QIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgc4UCBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQICixYsWLFixYsWLFixYsWLFixYsWLFixYsWLFixYsWLFixYgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAxQIIs6PJnRYtKTOjoKkWnUQUIMeLTQIECBAgQIECBAgQIEDRAgp2adSLNQSZ0aegQIECBAgQIECBAgQIECBAgQIECBAgQNkCCPBqRa8GygpxaVaTDi00CBAgQIECBAgQIECBAgQIECBA4QIIc-dUgw6iCJFqQZMymgQIECBAgQIECBAgQIECBAgQIEDlAgmT46CfOQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQMECCZPjoJ8aMgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQICixYsWLFixYsWLFixYsWLFixYsWLFixYsWLFixYsWLFixYgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECAFUQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgBVAMUNMQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIAVQDFDTAlMPUQIECBAgQIECBAgQIECBAgQIECBAgQIECAFUAxQ0wJTD1A0EHSQIECBAgQIECBAgQIECBAgQIECBAgQIECANMCUw9QNBB0kCBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECAPUDQQdJAgQIECBAgQIECBAgQIECAosWLFixYsWLFixYsQIECAHSQIECAosWLFixYsWLFixYsWIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECA&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;edit.tf'&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;title&amp;quot;: {&lt;br /&gt;
            &amp;quot;data&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
            &amp;quot;merge-data&amp;quot;: []&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;routing-table&amp;quot;: [&lt;br /&gt;
            90,&lt;br /&gt;
            91,&lt;br /&gt;
            92,&lt;br /&gt;
            93,&lt;br /&gt;
            94,&lt;br /&gt;
            95,&lt;br /&gt;
            96,&lt;br /&gt;
            97,&lt;br /&gt;
            98,&lt;br /&gt;
            990,&lt;br /&gt;
            0&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;cursor&amp;quot;: false,&lt;br /&gt;
        &amp;quot;connection&amp;quot;: {&lt;br /&gt;
            &amp;quot;address&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
            &amp;quot;mode&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
            &amp;quot;port&amp;quot;: 0&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;author-id&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;response-data&amp;quot;: {&lt;br /&gt;
            &amp;quot;responses&amp;quot;: null,&lt;br /&gt;
            &amp;quot;response-action&amp;quot;: {&lt;br /&gt;
                &amp;quot;exec&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
                &amp;quot;args&amp;quot;: null,&lt;br /&gt;
                &amp;quot;post-action-frame&amp;quot;: {&lt;br /&gt;
                    &amp;quot;page-no&amp;quot;: 0,&lt;br /&gt;
                    &amp;quot;frame-id&amp;quot;: ''&lt;br /&gt;
                },&lt;br /&gt;
                &amp;quot;post-cancel-frame&amp;quot;: {&lt;br /&gt;
                    &amp;quot;page-no&amp;quot;: 0,&lt;br /&gt;
                    &amp;quot;frame-id&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;navmessage-select&amp;quot;: &amp;quot;[B][n][Y]Select item or[W]*page# : [_+]&amp;quot;,&lt;br /&gt;
        &amp;quot;navmessage-notfound&amp;quot;: &amp;quot;[B][n][Y]Page not Found :[W]&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
=== pid ===&lt;br /&gt;
&lt;br /&gt;
Specifies the page number and frame id for the frame.&lt;br /&gt;
&lt;br /&gt;
    	&amp;quot;pid&amp;quot;: {&lt;br /&gt;
    		&amp;quot;page-no&amp;quot;: 9,&lt;br /&gt;
    		&amp;quot;frame-id&amp;quot;: &amp;quot;a&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
&lt;br /&gt;
=== visible ===&lt;br /&gt;
&lt;br /&gt;
When set to false, the frame will not be accessible and will return the ''not found'' system message to the user if an attempt is made to access it.&lt;br /&gt;
&lt;br /&gt;
      &amp;quot;visible&amp;quot;: true,&lt;br /&gt;
&lt;br /&gt;
=== header-text ===&lt;br /&gt;
&lt;br /&gt;
Allows the default header text to be ovwerridden at frame level. If this is left blank the default header will be used, see configuration.&lt;br /&gt;
&lt;br /&gt;
      &amp;quot;header-text&amp;quot;: &amp;quot;[Y]MICRONETn 800 (C)&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
=== cost ===&lt;br /&gt;
&lt;br /&gt;
      &amp;quot;cost&amp;quot;: 0,&lt;br /&gt;
&lt;br /&gt;
=== frame-type ===&lt;br /&gt;
&lt;br /&gt;
The API supports the following frame types ''initial'', ''mainindex'', ''information'', ''exit'', ''gateway'', ''test'' and ''response''.&lt;br /&gt;
&lt;br /&gt;
      &amp;quot;frame-type&amp;quot;: &amp;quot;information&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
* '''initial''': This frame type is used on the start page, see [[Configuration Options]]. Typically only one of these frames would exist within a system.&lt;br /&gt;
* '''mainindex''': This frame type is used on the main index page. , see [[Configuration Options]]. Only one of these frames should exist within a system.&lt;br /&gt;
* '''information''': This frame type is used for all normal content frames.&lt;br /&gt;
* '''exit''': This frame type is used for an exit page, any number of exit pages can be defined. When an exit page is rendered it will close the connection.&lt;br /&gt;
* '''gateway''': This page type is used to define a gateway page and is used in conjunction with the connection element (see below).&lt;br /&gt;
* '''test''': This page type indicates a test page and prevents navigation and system messages from being shown. this is typically used for frames that need to use the whole display such as 'test cards' etc.&lt;br /&gt;
* '''telesoftware''': Telesoftware frames (see [[Telesoftware]]).&lt;br /&gt;
* '''response''': This frame type is used for response frames. See [[Implementing Response Frames]].&lt;br /&gt;
* '''system''': Reserved for use internally.&lt;br /&gt;
* '''exception''': Reserved for use internally.&lt;br /&gt;
&lt;br /&gt;
=== redirect ===&lt;br /&gt;
 &lt;br /&gt;
If set it simply means that the user is redirected to the specified frame. This can be a useful alternative form of navigation to the routing table.&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;redirect&amp;quot;: {&lt;br /&gt;
            &amp;quot;page-no&amp;quot;: 9,&lt;br /&gt;
            &amp;quot;frame-id&amp;quot;: &amp;quot;a&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
&lt;br /&gt;
The following is an example of a complete redirect page.&lt;br /&gt;
&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;PID&amp;quot;: {&lt;br /&gt;
            &amp;quot;page-no&amp;quot;: 2,&lt;br /&gt;
            &amp;quot;frame-id&amp;quot;: &amp;quot;a&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;redirect&amp;quot;: {&lt;br /&gt;
            &amp;quot;page-no&amp;quot;: 11,&lt;br /&gt;
            &amp;quot;frame-id&amp;quot;: &amp;quot;a&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;visible&amp;quot;: true&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
=== content ===&lt;br /&gt;
&lt;br /&gt;
These elements define the content. The example below shows the content.type to be an edit.tf url. The available types are shown below.&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;content&amp;quot;: {&lt;br /&gt;
            &amp;quot;data&amp;quot;: &amp;quot;https://edit.tf/#0:QIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgc4UCBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQICixYsWLFixYsWLFixYsWLFixYsWLFixYsWLFixYsWLFixYgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAxQIIs6PJnRYtKTOjoKkWnUQUIMeLTQIECBAgQIECBAgQIEDRAgp2adSLNQSZ0aegQIECBAgQIECBAgQIECBAgQIECBAgQNkCCPBqRa8GygpxaVaTDi00CBAgQIECBAgQIECBAgQIECBA4QIIc-dUgw6iCJFqQZMymgQIECBAgQIECBAgQIECBAgQIEDlAgmT46CfOQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQMECCZPjoJ8aMgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQICixYsWLFixYsWLFixYsWLFixYsWLFixYsWLFixYsWLFixYgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECAFUQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgBVAMUNMQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIAVQDFDTAlMPUQIECBAgQIECBAgQIECBAgQIECBAgQIECAFUAxQ0wJTD1A0EHSQIECBAgQIECBAgQIECBAgQIECBAgQIECANMCUw9QNBB0kCBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECAPUDQQdJAgQIECBAgQIECBAgQIECAosWLFixYsWLFixYsQIECAHSQIECAosWLFixYsWLFixYsWIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECA&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;edit.tf'&lt;br /&gt;
        },&lt;br /&gt;
&lt;br /&gt;
Content types:&lt;br /&gt;
&lt;br /&gt;
* '''edit.tf''': If set, then the content will be treated as an edit.tf url. This is converted to RawV before being rendered.&lt;br /&gt;
* '''markup''': If set, then the content will be treated as ''markup'' content. Full details of ''markup'' can be found in the section [[Markup]]&lt;br /&gt;
* '''rawV''': If set, then the content will be treated as raw videotex data. This is 7bit (00-7F) videotex format with control chars between 00-1F and escaped codes for alpha and graphic attributes. Ideally rows should have any trailing spaces removed and replaced with with a CR/LF combination. This will be rendered as is.&lt;br /&gt;
* '''rawT''': If set, then the content will be treated as raw teletex data. This is a 24 x 40 block of 7 bits chars (960 chars) in Teletext format (range 00-7F). This format is used internally when manipulating page data. It will be converted to RawV before being rendered.&lt;br /&gt;
&lt;br /&gt;
=== title ===&lt;br /&gt;
&lt;br /&gt;
This sets the title of the page. In many cases this may be left blank with all of the content specified in the ''content'' section (see above) however, the ''title'' section gives additional flexibility when creating frames.&lt;br /&gt;
&lt;br /&gt;
Values for ''title-type'' are the same as defined for the content section, however, if the type ''edit-tf'' is used then only the first four (default) lines of the edit.tf defined page are used. &lt;br /&gt;
&lt;br /&gt;
Separating title from content in this way allows logos and header sections to be created for the title whilst using markup for the main content or visa-versa. &lt;br /&gt;
&lt;br /&gt;
==== Example 1 ====&lt;br /&gt;
&lt;br /&gt;
In thi example the fields are blank meaning that only the data in the ''content'' section is displayed.&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;title&amp;quot;: {&lt;br /&gt;
            &amp;quot;data&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
            &amp;quot;merge-data&amp;quot;: []&lt;br /&gt;
        },&lt;br /&gt;
&lt;br /&gt;
==== Example 2 ====&lt;br /&gt;
&lt;br /&gt;
In this example, the top 4 lines of the edit.tf content is displayed at the top of the page.&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;title&amp;quot;: {&lt;br /&gt;
            &amp;quot;data&amp;quot;: &amp;quot;https://edit.tf/#0:QIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECAvobotqBX__oECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIC_9AgQIEGv-gQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgL_0Cj4kQav6BAgQIECBAgQIECBAgQIECBAgQIECBAgQIECAuq64P6Dx__oECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECA&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;edit.tf&amp;quot;,&lt;br /&gt;
            &amp;quot;merge-data&amp;quot;: []&lt;br /&gt;
        },&lt;br /&gt;
&lt;br /&gt;
To take the top 5 lines, the ''type'' field can be extended as follows.&lt;br /&gt;
&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;edit.tf,5&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Note that this extended form of ''type'' only applies to edit.tf types.&lt;br /&gt;
&lt;br /&gt;
==== Example 3 ====&lt;br /&gt;
&lt;br /&gt;
The merge data field can be used to add ''layers'' of markup data to the title area. For example the example above shows the Guardian logo. To add some alphagraphics text to this, an additional layer could be used e.g.&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;title&amp;quot;: {&lt;br /&gt;
            &amp;quot;data&amp;quot;: &amp;quot;https://edit.tf/#0:QIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECAvobotqBX__oECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIC_9AgQIEGv-gQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgL_0Cj4kQav6BAgQIECBAgQIECBAgQIECBAgQIECBAgQIECAuq64P6Dx__oECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECA&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;edit.tf,5&amp;quot;,&lt;br /&gt;
            &amp;quot;merge-data&amp;quot;: [&lt;br /&gt;
                &amp;quot;[w[             UK News]]&amp;quot;&lt;br /&gt;
            ]&lt;br /&gt;
        },&lt;br /&gt;
&lt;br /&gt;
Note that any number of layers can be added, however, the merge layer must be defined as markup.&lt;br /&gt;
&lt;br /&gt;
=== routing table ===&lt;br /&gt;
&lt;br /&gt;
The routing table defines which pages are navigated to when a user presses a key whilst viewing the frame. The table has 11 entries with the first 10 representing the keys 0-9, the final entry refers to the ''hash'' (return) key.&lt;br /&gt;
&lt;br /&gt;
The example below shows the default routing table for frame 9a. If the user is viewing this frame and presses 1 the frame 91a will be loaded, assuming it exists. Pressing the ''hash'' (return) key will take the user back to frame 0a, the main index.&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;routing-table&amp;quot;: [&lt;br /&gt;
            90,&lt;br /&gt;
            91,&lt;br /&gt;
            92,&lt;br /&gt;
            93,&lt;br /&gt;
            94,&lt;br /&gt;
            95,&lt;br /&gt;
            96,&lt;br /&gt;
            97,&lt;br /&gt;
            98,&lt;br /&gt;
            99,&lt;br /&gt;
            0&lt;br /&gt;
        ],&lt;br /&gt;
&lt;br /&gt;
=== cursor ===&lt;br /&gt;
&lt;br /&gt;
This element determines whether a cursor is shown on the page. Typically a cursor would only be shown on response frames.&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;cursor&amp;quot;: false,&lt;br /&gt;
        &lt;br /&gt;
=== connection ===&lt;br /&gt;
&lt;br /&gt;
This elements specifies the connection object used for gateway pages.&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;connection&amp;quot;: {&lt;br /&gt;
            &amp;quot;address&amp;quot;: &amp;quot;fish.ccl4.org&amp;quot;,&lt;br /&gt;
            &amp;quot;mode&amp;quot;: &amp;quot;viewdata&amp;quot;,&lt;br /&gt;
            &amp;quot;port&amp;quot;: 23&lt;br /&gt;
        },&lt;br /&gt;
&lt;br /&gt;
The values for ''address and port'' represent the endpoint of the system being accessed and the value for ''mode'' determines how the system is accessed, the options are:&lt;br /&gt;
&lt;br /&gt;
    viewdata&lt;br /&gt;
    full_duplex&lt;br /&gt;
    full_duplex_no_echo&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== author-id ===&lt;br /&gt;
&lt;br /&gt;
This is an optional field that can be used to indicate the author of the page or other source.&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;author-id&amp;quot;: &amp;quot;john&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
=== response-data ===&lt;br /&gt;
&lt;br /&gt;
These fields should be used when the frame type is set to be a ''response-frame''. &lt;br /&gt;
&lt;br /&gt;
There are two main sections, ''response-data'' and ''response-action''. Below is an example of a response frame used for the Telstar weather page. The frame is created in the normal way using ''markup'' or ''edit.tf''. In this example the text ''Town/Cty'' has been positioned near the centre of the page. Immediately to the right of this is a field for the user to enter either a Town or City, the ''response-data'' section defines that field. Once the user submits the frame the section ''response-action'' determines what happens. In the example here a binary file (''telstar-openweather-linux-amd64''), stored in the containers volume directory is executed with a single argument (''myopenweatherapikey''). Note that the ''post-action-frame'' is set to 290b, in this example frame 290b is dynamically generated by the binary file ''telstar-openweather-linux-amd64'' and contains the weather forecast.&lt;br /&gt;
&lt;br /&gt;
Full details of how to implement response frames are detailed in the section [[Implementing Response Frames]].&lt;br /&gt;
    &amp;quot;response-data&amp;quot;: {&lt;br /&gt;
        &amp;quot;response-fields&amp;quot;: [&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;vpos&amp;quot;: 8,&lt;br /&gt;
                &amp;quot;hpos&amp;quot;: 4,&lt;br /&gt;
                &amp;quot;required&amp;quot;: true,&lt;br /&gt;
                &amp;quot;length&amp;quot;: 16,&lt;br /&gt;
                &amp;quot;type&amp;quot;: &amp;quot;alphanumeric&amp;quot;,&lt;br /&gt;
                &amp;quot;auto-submit&amp;quot;: false,&lt;br /&gt;
                &amp;quot;password&amp;quot;: false&lt;br /&gt;
            }&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;response-action&amp;quot;: {&lt;br /&gt;
            &amp;quot;exec&amp;quot;: &amp;quot;/opt/telstar/volume/telstar-openweather-linux-amd64&amp;quot;,&lt;br /&gt;
            &amp;quot;args&amp;quot;: [&lt;br /&gt;
                &amp;quot;myopenweatherapikey&amp;quot;&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;post-action-frame&amp;quot;: {&lt;br /&gt;
                &amp;quot;page-no&amp;quot;: 290,&lt;br /&gt;
                &amp;quot;frame-id&amp;quot;: &amp;quot;c&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
=== navmessage-select ===&lt;br /&gt;
&lt;br /&gt;
Allows the ''navigation'' system message to be customised at frame level. In most cases this can be left blank in order that the system default is used instead, see [[Configuration Options]].&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;navmessage-select&amp;quot;: &amp;quot;[B][n][Y]Select item or[W]*page# : [_+]&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
=== navmessage-notfound ===&lt;br /&gt;
&lt;br /&gt;
Allows the ''not found'' system message to be customised at frame level. In most cases this can be left blank in order that the system default is used instead, see [[Configuration Options]].&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;navmessage-notfound&amp;quot;: &amp;quot;[B][n][Y]Page not Found :[W]&amp;quot;&lt;/div&gt;</summary>
		<author><name>John</name></author>
	</entry>
	<entry>
		<id>https://wiki.glasstty.com/index.php?title=Configuration_Options&amp;diff=349</id>
		<title>Configuration Options</title>
		<link rel="alternate" type="text/html" href="https://wiki.glasstty.com/index.php?title=Configuration_Options&amp;diff=349"/>
		<updated>2022-05-16T14:46:18Z</updated>

		<summary type="html">&lt;p&gt;John: /* Environment Variables */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Container Types ==&lt;br /&gt;
&lt;br /&gt;
The same Telstar image is used to host different container types, for example a the Telstar image can be used to create videotex server container and an API server container. The first argument passed to the container determines the specific configuration of the container. Currently the container supports the following values;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    server          Creates the standard videotex server container&lt;br /&gt;
    api             Creates an API server allowing the videotex system to be managed using a restful API.&lt;br /&gt;
&lt;br /&gt;
For example the following Docker run command starts a videotex server listening on port 6502 (see TCP Port below) with an initial set of example system pages.&lt;br /&gt;
&lt;br /&gt;
    docker run --rm -d --name telstar-server --network telstar-network -p 6512:6512 -v telstar-volume:/opt/telstar/volume johnnewcombe/telstar server --port=6502 --init&lt;br /&gt;
    &lt;br /&gt;
== TCP Port Number ==&lt;br /&gt;
&lt;br /&gt;
The ''--port'' argument must be specified for the Telstar server and API containers. The port parameter specifies the TCP port number that the server or api application should be listening on. This can be any suitable port.&lt;br /&gt;
&lt;br /&gt;
== Optional Arguments ==&lt;br /&gt;
&lt;br /&gt;
The following is a list of optional arguments for both the Telstar server and Telstar API containers.&lt;br /&gt;
&lt;br /&gt;
    --init                              This will create/recreate the basic telstar content.&lt;br /&gt;
&lt;br /&gt;
The ''--init'' parameter, when starting a videotex server will create/recreate the standard telstar system pages along with some example gateway pages. If this parameter is used when starting an API server, it will create an API user using the userid '''&amp;quot;2222222222&amp;quot;''' and password '''&amp;quot;1234&amp;quot;'''.&lt;br /&gt;
&lt;br /&gt;
== Environment Variables ==&lt;br /&gt;
&lt;br /&gt;
The full description of each of these can be found below.&lt;br /&gt;
&lt;br /&gt;
    Name                                   | Default&lt;br /&gt;
    -----------------------------------------------------------------------------------------&lt;br /&gt;
    TELSTAR_API_HOST                       | 0.0.0.0&lt;br /&gt;
    TELSTAR_PAD_HOST                       | 0.0.0.0&lt;br /&gt;
    TELSTAR_PAD_DLE                        | 0x10&lt;br /&gt;
    TELSTAR_SERVER_HOST                    | 0.0.0.0&lt;br /&gt;
    TELSTAR_SERVER_DISPLAY_NAME            | DUKE&lt;br /&gt;
    TELSTAR_HIDE_PAGE_ID                   | FALSE&lt;br /&gt;
    TELSTAR_HIDE_COST                      | FALSE&lt;br /&gt;
    TELSTAR_DISABLE_VERTICAL_ROLLOVER      | TRUE&lt;br /&gt;
    TELSTAR_EDITTF_TITLE_ROWS              | 4&lt;br /&gt;
    TELSTAR_DBCON                          | mongodb://mongoadmin:secret@telstar-mongo:27017&lt;br /&gt;
    TELSTAR_DBCOLLECTION                   | SECONDARY&lt;br /&gt;
    TELSTAR_START_PAGE                     | 99&lt;br /&gt;
    TELSTAR_LOGIN_PAGE                     | 990&lt;br /&gt;
    TELSTAR_MAIN_INDEX_PAGE                | 0&lt;br /&gt;
    TELSTAR_REQUIRES_AUTHENTICATION        | FALSE&lt;br /&gt;
    TELSTAR_ROOT_USER_ID                   | 0&lt;br /&gt;
    TELSTAR_PARITY                         | FALSE&lt;br /&gt;
    TELSTAR_VOLUME_DIRECTORY               | /opt/telstar/volume/&lt;br /&gt;
    TELSTAR_DEFAULT_NAV_MESSAGE            | [B][n][Y]Select item or[W]*page# : [_+]&lt;br /&gt;
    TELSTAR_DEFAULT_PAGE_NOT_FOUND_MESSAGE | [B][n][Y]Page not Found :[W]&lt;br /&gt;
    TELSTAR_DEFAULT_HEADER_TEXT            | [G]T[R]E[C]L[B]S[W]T[M]A[Y]R&lt;br /&gt;
&lt;br /&gt;
The default settings for the settings above are stored in the ''telstar.yaml'' configuration file which is stored in the ''/opt/telstar'' directory of the respective container. It is recommended that Telstar is run in a Docker container in which case the above environment variables should be used to override the standard configuration file.&lt;br /&gt;
&lt;br /&gt;
=== TELSTAR_API_HOST ===&lt;br /&gt;
&lt;br /&gt;
This is for future use and can be ignored the default setting is:&lt;br /&gt;
&lt;br /&gt;
    0.0.0.0&lt;br /&gt;
&lt;br /&gt;
=== TELSTAR_PAD_HOST ===&lt;br /&gt;
&lt;br /&gt;
This is for future use and can be ignored the default setting is:&lt;br /&gt;
&lt;br /&gt;
    0.0.0.0&lt;br /&gt;
&lt;br /&gt;
=== TELSTAR_PAD_DLE ===&lt;br /&gt;
&lt;br /&gt;
This is the Data Link Escape character used to exit a Gateway connection, the default value is:&lt;br /&gt;
&lt;br /&gt;
    0x10 (Ctrl P)&lt;br /&gt;
&lt;br /&gt;
=== TELSTAR_SERVER_HOST ===&lt;br /&gt;
&lt;br /&gt;
This is for future use and can be ignored the default setting is:&lt;br /&gt;
&lt;br /&gt;
    0.0.0.0&lt;br /&gt;
&lt;br /&gt;
=== TELSTAR_SERVER_DISPLAY_NAME ===&lt;br /&gt;
&lt;br /&gt;
This is the display name of the viewdata server and is used in place of the [SERVER] placeholder tag, see [[Frames]] for more details on placeholder tags. The default value is:&lt;br /&gt;
&lt;br /&gt;
    DUKE&lt;br /&gt;
    &lt;br /&gt;
=== TELSTAR_HIDE_PAGE_ID ===&lt;br /&gt;
&lt;br /&gt;
Setting this value to true will hide the Page ID displayed in the top line header of the frame. The default value is:&lt;br /&gt;
&lt;br /&gt;
    FALSE&lt;br /&gt;
&lt;br /&gt;
=== TELSTAR_HIDE_COST ===&lt;br /&gt;
&lt;br /&gt;
Setting this value to true will hide the frame cost displayed in the top line header of the frame. The default value is:&lt;br /&gt;
&lt;br /&gt;
    FALSE&lt;br /&gt;
&lt;br /&gt;
=== TELSTAR_DISABLE_VERTICAL_ROLLOVER ===&lt;br /&gt;
&lt;br /&gt;
Setting this value to true will enable Vertical Rollover. The default value is:&lt;br /&gt;
&lt;br /&gt;
    TRUE&lt;br /&gt;
&lt;br /&gt;
Vertical Rollover is used as a means for Telstar to move the cursor to a point on the screen in the most efficient way possible. For example to get to the start of the bottom row, it may be quicker to send the commands HOME followed by VT. This would cause a vertical rollover to the bottom row. Not all clients currently support this correctly.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== TELSTAR_EDITTF_TITLE_ROWS ===&lt;br /&gt;
&lt;br /&gt;
The https://edit.tf frame editor can be used to create pages and titles. When used to create a title, the number of rows taken fron the edit.tf data can be specified with this variable. The default settings is:&lt;br /&gt;
&lt;br /&gt;
    4&lt;br /&gt;
    &lt;br /&gt;
=== TELSTAR_DBCON ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This is the database connection and points to a mongo Docker container on the Docker telstar-network, see [[Installing Telstar]]. The default value is:&lt;br /&gt;
&lt;br /&gt;
    mongodb://mongoadmin:secret@telstar-mongo:27017&lt;br /&gt;
&lt;br /&gt;
=== TELSTAR_DBCOLLECTION ===&lt;br /&gt;
&lt;br /&gt;
The database is divided into two logical partitions, PRIMARY and SECONDARY. Typically PRIMARY would be used for a production system with SECONDARY being used for a test system. When adding pages to the database via the API, these would typically be send to the SECONDARY database, reviewed on a test system and then ''published'' to the PRIMARY database. The default value is:&lt;br /&gt;
&lt;br /&gt;
    SECONDARY&lt;br /&gt;
&lt;br /&gt;
=== TELSTAR_START_PAGE ===&lt;br /&gt;
&lt;br /&gt;
The start page to be used by the system. This would typically be a welcome screen. The default value is:&lt;br /&gt;
&lt;br /&gt;
    99&lt;br /&gt;
&lt;br /&gt;
=== TELSTAR_LOGIN_PAGE ===&lt;br /&gt;
&lt;br /&gt;
The login page to be used by the system. This would typically be a welcome screen set up as a response page. The default value is:&lt;br /&gt;
&lt;br /&gt;
    990&lt;br /&gt;
&lt;br /&gt;
=== TELSTAR_MAIN_INDEX_PAGE ===&lt;br /&gt;
&lt;br /&gt;
The main index page to be used by the system. This would typically be the top level menu. The default value is:&lt;br /&gt;
&lt;br /&gt;
    0&lt;br /&gt;
&lt;br /&gt;
=== TELSTAR_REQUIRES_AUTHENTICATION ===&lt;br /&gt;
       &lt;br /&gt;
If set to true, the user is directed to the TELSTAR_LOGIN_PAGE, rather than the TELSTAR_START_PAGE. The default value is:&lt;br /&gt;
&lt;br /&gt;
    FALSE&lt;br /&gt;
&lt;br /&gt;
=== TELSTAR_ROOT_USER_ID ===&lt;br /&gt;
&lt;br /&gt;
This is for future use and should be ignored. The Default value is:&lt;br /&gt;
&lt;br /&gt;
    0&lt;br /&gt;
&lt;br /&gt;
=== TELSTAR_PARITY ===&lt;br /&gt;
&lt;br /&gt;
If set to true then 7bit Even Parity is invoked over the TCP connection. Typically this would not be required. The default value is:&lt;br /&gt;
&lt;br /&gt;
    FALSE&lt;br /&gt;
&lt;br /&gt;
=== TELSTAR_VOLUME_DIRECTORY ===&lt;br /&gt;
&lt;br /&gt;
This is the folder within the container that is used for the Docker Volume. The default value is:&lt;br /&gt;
&lt;br /&gt;
    /opt/telstar/volume/&lt;br /&gt;
&lt;br /&gt;
=== TELSTAR_DEFAULT_NAV_MESSAGE ===&lt;br /&gt;
&lt;br /&gt;
This is the default message to be used for navigation. This can be overridden on a frame by frame basis as required and can be specified using ''markup''.  See [[Frames]] for more details of this setting and details of ''markup'' text.&lt;br /&gt;
 &lt;br /&gt;
    [B][n][Y]Select item or[W]*page# : [_+]&lt;br /&gt;
&lt;br /&gt;
=== TELSTAR_DEFAULT_PAGE_NOT_FOUND_MESSAGE ===&lt;br /&gt;
&lt;br /&gt;
This is the default message to be used when a page is not found. This can be overridden on a frame by frame basis as required and can be specified using ''markup''.  See [[Frames]] for more details of this setting and details of ''markup'' text.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    [B][n][Y]Page not Found :[W]&lt;br /&gt;
&lt;br /&gt;
=== TELSTAR_DEFAULT_HEADER_TEXT ===&lt;br /&gt;
&lt;br /&gt;
This is the default top row header text for each frame. This can be overridden on a frame by frame basis as required and can be specified using ''markup''.  See [[Frames]] for more details of this setting and details of ''markup'' text.&lt;br /&gt;
&lt;br /&gt;
    [G]T[R]E[C]L[B]S[W]T[M]A[Y]R&lt;/div&gt;</summary>
		<author><name>John</name></author>
	</entry>
	<entry>
		<id>https://wiki.glasstty.com/index.php?title=Configuration_Options&amp;diff=348</id>
		<title>Configuration Options</title>
		<link rel="alternate" type="text/html" href="https://wiki.glasstty.com/index.php?title=Configuration_Options&amp;diff=348"/>
		<updated>2022-05-16T14:45:31Z</updated>

		<summary type="html">&lt;p&gt;John: /* Environment Variables */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Container Types ==&lt;br /&gt;
&lt;br /&gt;
The same Telstar image is used to host different container types, for example a the Telstar image can be used to create videotex server container and an API server container. The first argument passed to the container determines the specific configuration of the container. Currently the container supports the following values;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    server          Creates the standard videotex server container&lt;br /&gt;
    api             Creates an API server allowing the videotex system to be managed using a restful API.&lt;br /&gt;
&lt;br /&gt;
For example the following Docker run command starts a videotex server listening on port 6502 (see TCP Port below) with an initial set of example system pages.&lt;br /&gt;
&lt;br /&gt;
    docker run --rm -d --name telstar-server --network telstar-network -p 6512:6512 -v telstar-volume:/opt/telstar/volume johnnewcombe/telstar server --port=6502 --init&lt;br /&gt;
    &lt;br /&gt;
== TCP Port Number ==&lt;br /&gt;
&lt;br /&gt;
The ''--port'' argument must be specified for the Telstar server and API containers. The port parameter specifies the TCP port number that the server or api application should be listening on. This can be any suitable port.&lt;br /&gt;
&lt;br /&gt;
== Optional Arguments ==&lt;br /&gt;
&lt;br /&gt;
The following is a list of optional arguments for both the Telstar server and Telstar API containers.&lt;br /&gt;
&lt;br /&gt;
    --init                              This will create/recreate the basic telstar content.&lt;br /&gt;
&lt;br /&gt;
The ''--init'' parameter, when starting a videotex server will create/recreate the standard telstar system pages along with some example gateway pages. If this parameter is used when starting an API server, it will create an API user using the userid '''&amp;quot;2222222222&amp;quot;''' and password '''&amp;quot;1234&amp;quot;'''.&lt;br /&gt;
&lt;br /&gt;
== Environment Variables ==&lt;br /&gt;
&lt;br /&gt;
The full description of each of these can be found below.&lt;br /&gt;
&lt;br /&gt;
    Name                                   | Default&lt;br /&gt;
    -----------------------------------------------------------------------------------------&lt;br /&gt;
    TELSTAR_API_HOST                       | 0.0.0.0&lt;br /&gt;
    TELSTAR_PAD_HOST                       | 0.0.0.0&lt;br /&gt;
    TELSTAR_PAD_DLE                        | 0x10&lt;br /&gt;
    TELSTAR_SERVER_HOST                    | 0.0.0.0&lt;br /&gt;
    TELSTAR_SERVER_DISPLAY_NAME            | DUKE&lt;br /&gt;
    TELSTAR_HIDE_PAGE_ID                   | FALSE&lt;br /&gt;
    TELSTAR_HIDE_COST                      | FALSE&lt;br /&gt;
    TELSTAR_DISABLE_VERTICAL_ROLLOVER      | TRUE&lt;br /&gt;
    TELSTAR_EDITTF_TITLE_ROWS              | 4&lt;br /&gt;
    TELSTAR_DBCON                          | mongodb://mongoadmin:secret@telstar-mongo:27017&lt;br /&gt;
    TELSTAR_DBCOLLECTION                   | SECONDARY&lt;br /&gt;
    TELSTAR_START_PAGE                     | 99&lt;br /&gt;
    TELSTAR_LOGIN_PAGE                     | 990&lt;br /&gt;
    TELSTAR_MAIN_INDEX_PAGE                | 0&lt;br /&gt;
    TELSTAR_REQUIRES_AUTHENTICATION        | FALSE&lt;br /&gt;
    TELSTAR_ROOT_USER_ID                   | 0&lt;br /&gt;
    TELSTAR_PARITY                         | FALSE&lt;br /&gt;
    TELSTAR_VOLUME_DIRECTORY               | /opt/telstar/volume/&lt;br /&gt;
    TELSTAR_DEFAULT_NAV_MESSAGE            | [B][n][Y]Select item or[W]*page# : [_+]&lt;br /&gt;
    TELSTAR_DEFAULT_PAGE_NOT_FOUND_MESSAGE | [B][n][Y]Page not Found :[W]&lt;br /&gt;
    TELSTAR_DEFAULT_HEADER_TEXT            | [G]T[R]E[C]L[B]S[W]T[M]A[Y]R&lt;br /&gt;
    TELSTAR_ANTIOPE                        | FALSE&lt;br /&gt;
&lt;br /&gt;
The default settings for the settings above are stored in the ''telstar.yaml'' configuration file which is stored in the ''/opt/telstar'' directory of the respective container. It is recommended that Telstar is run in a Docker container in which case the above environment variables should be used to override the standard configuration file.&lt;br /&gt;
&lt;br /&gt;
=== TELSTAR_API_HOST ===&lt;br /&gt;
&lt;br /&gt;
This is for future use and can be ignored the default setting is:&lt;br /&gt;
&lt;br /&gt;
    0.0.0.0&lt;br /&gt;
&lt;br /&gt;
=== TELSTAR_PAD_HOST ===&lt;br /&gt;
&lt;br /&gt;
This is for future use and can be ignored the default setting is:&lt;br /&gt;
&lt;br /&gt;
    0.0.0.0&lt;br /&gt;
&lt;br /&gt;
=== TELSTAR_PAD_DLE ===&lt;br /&gt;
&lt;br /&gt;
This is the Data Link Escape character used to exit a Gateway connection, the default value is:&lt;br /&gt;
&lt;br /&gt;
    0x10 (Ctrl P)&lt;br /&gt;
&lt;br /&gt;
=== TELSTAR_SERVER_HOST ===&lt;br /&gt;
&lt;br /&gt;
This is for future use and can be ignored the default setting is:&lt;br /&gt;
&lt;br /&gt;
    0.0.0.0&lt;br /&gt;
&lt;br /&gt;
=== TELSTAR_SERVER_DISPLAY_NAME ===&lt;br /&gt;
&lt;br /&gt;
This is the display name of the viewdata server and is used in place of the [SERVER] placeholder tag, see [[Frames]] for more details on placeholder tags. The default value is:&lt;br /&gt;
&lt;br /&gt;
    DUKE&lt;br /&gt;
    &lt;br /&gt;
=== TELSTAR_HIDE_PAGE_ID ===&lt;br /&gt;
&lt;br /&gt;
Setting this value to true will hide the Page ID displayed in the top line header of the frame. The default value is:&lt;br /&gt;
&lt;br /&gt;
    FALSE&lt;br /&gt;
&lt;br /&gt;
=== TELSTAR_HIDE_COST ===&lt;br /&gt;
&lt;br /&gt;
Setting this value to true will hide the frame cost displayed in the top line header of the frame. The default value is:&lt;br /&gt;
&lt;br /&gt;
    FALSE&lt;br /&gt;
&lt;br /&gt;
=== TELSTAR_DISABLE_VERTICAL_ROLLOVER ===&lt;br /&gt;
&lt;br /&gt;
Setting this value to true will enable Vertical Rollover. The default value is:&lt;br /&gt;
&lt;br /&gt;
    TRUE&lt;br /&gt;
&lt;br /&gt;
Vertical Rollover is used as a means for Telstar to move the cursor to a point on the screen in the most efficient way possible. For example to get to the start of the bottom row, it may be quicker to send the commands HOME followed by VT. This would cause a vertical rollover to the bottom row. Not all clients currently support this correctly.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== TELSTAR_EDITTF_TITLE_ROWS ===&lt;br /&gt;
&lt;br /&gt;
The https://edit.tf frame editor can be used to create pages and titles. When used to create a title, the number of rows taken fron the edit.tf data can be specified with this variable. The default settings is:&lt;br /&gt;
&lt;br /&gt;
    4&lt;br /&gt;
    &lt;br /&gt;
=== TELSTAR_DBCON ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This is the database connection and points to a mongo Docker container on the Docker telstar-network, see [[Installing Telstar]]. The default value is:&lt;br /&gt;
&lt;br /&gt;
    mongodb://mongoadmin:secret@telstar-mongo:27017&lt;br /&gt;
&lt;br /&gt;
=== TELSTAR_DBCOLLECTION ===&lt;br /&gt;
&lt;br /&gt;
The database is divided into two logical partitions, PRIMARY and SECONDARY. Typically PRIMARY would be used for a production system with SECONDARY being used for a test system. When adding pages to the database via the API, these would typically be send to the SECONDARY database, reviewed on a test system and then ''published'' to the PRIMARY database. The default value is:&lt;br /&gt;
&lt;br /&gt;
    SECONDARY&lt;br /&gt;
&lt;br /&gt;
=== TELSTAR_START_PAGE ===&lt;br /&gt;
&lt;br /&gt;
The start page to be used by the system. This would typically be a welcome screen. The default value is:&lt;br /&gt;
&lt;br /&gt;
    99&lt;br /&gt;
&lt;br /&gt;
=== TELSTAR_LOGIN_PAGE ===&lt;br /&gt;
&lt;br /&gt;
The login page to be used by the system. This would typically be a welcome screen set up as a response page. The default value is:&lt;br /&gt;
&lt;br /&gt;
    990&lt;br /&gt;
&lt;br /&gt;
=== TELSTAR_MAIN_INDEX_PAGE ===&lt;br /&gt;
&lt;br /&gt;
The main index page to be used by the system. This would typically be the top level menu. The default value is:&lt;br /&gt;
&lt;br /&gt;
    0&lt;br /&gt;
&lt;br /&gt;
=== TELSTAR_REQUIRES_AUTHENTICATION ===&lt;br /&gt;
       &lt;br /&gt;
If set to true, the user is directed to the TELSTAR_LOGIN_PAGE, rather than the TELSTAR_START_PAGE. The default value is:&lt;br /&gt;
&lt;br /&gt;
    FALSE&lt;br /&gt;
&lt;br /&gt;
=== TELSTAR_ROOT_USER_ID ===&lt;br /&gt;
&lt;br /&gt;
This is for future use and should be ignored. The Default value is:&lt;br /&gt;
&lt;br /&gt;
    0&lt;br /&gt;
&lt;br /&gt;
=== TELSTAR_PARITY ===&lt;br /&gt;
&lt;br /&gt;
If set to true then 7bit Even Parity is invoked over the TCP connection. Typically this would not be required. The default value is:&lt;br /&gt;
&lt;br /&gt;
    FALSE&lt;br /&gt;
&lt;br /&gt;
=== TELSTAR_VOLUME_DIRECTORY ===&lt;br /&gt;
&lt;br /&gt;
This is the folder within the container that is used for the Docker Volume. The default value is:&lt;br /&gt;
&lt;br /&gt;
    /opt/telstar/volume/&lt;br /&gt;
&lt;br /&gt;
=== TELSTAR_DEFAULT_NAV_MESSAGE ===&lt;br /&gt;
&lt;br /&gt;
This is the default message to be used for navigation. This can be overridden on a frame by frame basis as required and can be specified using ''markup''.  See [[Frames]] for more details of this setting and details of ''markup'' text.&lt;br /&gt;
 &lt;br /&gt;
    [B][n][Y]Select item or[W]*page# : [_+]&lt;br /&gt;
&lt;br /&gt;
=== TELSTAR_DEFAULT_PAGE_NOT_FOUND_MESSAGE ===&lt;br /&gt;
&lt;br /&gt;
This is the default message to be used when a page is not found. This can be overridden on a frame by frame basis as required and can be specified using ''markup''.  See [[Frames]] for more details of this setting and details of ''markup'' text.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    [B][n][Y]Page not Found :[W]&lt;br /&gt;
&lt;br /&gt;
=== TELSTAR_DEFAULT_HEADER_TEXT ===&lt;br /&gt;
&lt;br /&gt;
This is the default top row header text for each frame. This can be overridden on a frame by frame basis as required and can be specified using ''markup''.  See [[Frames]] for more details of this setting and details of ''markup'' text.&lt;br /&gt;
&lt;br /&gt;
    [G]T[R]E[C]L[B]S[W]T[M]A[Y]R&lt;/div&gt;</summary>
		<author><name>John</name></author>
	</entry>
	<entry>
		<id>https://wiki.glasstty.com/index.php?title=Installing_Telstar&amp;diff=341</id>
		<title>Installing Telstar</title>
		<link rel="alternate" type="text/html" href="https://wiki.glasstty.com/index.php?title=Installing_Telstar&amp;diff=341"/>
		<updated>2022-05-07T17:04:20Z</updated>

		<summary type="html">&lt;p&gt;John: /* Pull the Images and Run the Containers */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;It is recommended that Telstar is installed into a Docker environment. The required images are available from https://hub.docker.com/repository/docker/johnnewcombe/telstar. The following examples can be used to install and run Telstar. In addition&lt;br /&gt;
examples are also given for orchestrating the services using both Docker Compose and Kubernetes.&lt;br /&gt;
&lt;br /&gt;
To run Telstar using Docker, a minimum of two Docker images are required.&lt;br /&gt;
&lt;br /&gt;
* The official Docker image '''mongodb'''&lt;br /&gt;
* The Docker image '''telstar'''&lt;br /&gt;
&lt;br /&gt;
In addition, a Docker network will need to created to allow the images to communicate, and a Docker volume is desirable to allow for configuration changes and the addition of plugins.&lt;br /&gt;
&lt;br /&gt;
== Create the Docker Network and Volumes ==&lt;br /&gt;
&lt;br /&gt;
The Docker network is used to allow communication between the TELSTAR application and the ''mongo'' database. The volumes provide a means to persist configuration data, plugins to be added and the ''mongo'' databse itself.&lt;br /&gt;
&lt;br /&gt;
The following commands will create the resources required.&lt;br /&gt;
&lt;br /&gt;
    $ docker network create telstar-network&lt;br /&gt;
    $ docker volume create telstar-volume&lt;br /&gt;
    $ docker volume create mongo-volume&lt;br /&gt;
&lt;br /&gt;
== Pull the Images and Run the Containers ==&lt;br /&gt;
&lt;br /&gt;
It is highly recommended that the Stacks feature of Portainer, inconjunction with a compose file is used to install and manage Telstar. But to get started quickly the following docker commands can be used. See [[Managing Telstar with Portainer]] and [[Orchestrating Telstar with Docker Compose]].&lt;br /&gt;
&lt;br /&gt;
Pull the required images as follows (example shows amd64 image, see https://hub.docker.com/repository/docker/johnnewcombe/telstar/tags?page=1&amp;amp;ordering=last_updated) for the latest version for your architecture.&lt;br /&gt;
&lt;br /&gt;
    $ docker pull johnnewcombe/telstar:amd64-2.0-RC3.23 .&lt;br /&gt;
    $ docker pull mongo&lt;br /&gt;
&lt;br /&gt;
''Please note that the tag used with the official mongo image may need to be set to the system architecture that is to be used. Please see https://hub.docker.com/_/mongo.//&lt;br /&gt;
&lt;br /&gt;
Start the ''mongodb'' container and connect it to the previously created network using the command below.&lt;br /&gt;
&lt;br /&gt;
''Please note that the '--name' parameter is important as it is used as part of the database connection string from the TELSTAR container.''&lt;br /&gt;
&lt;br /&gt;
    $ docker run --name telstar-mongo --network telstar-network -v mongo-volume:/data/db -d -e MONGO_INITDB_ROOT_USERNAME=mongoadmin -e MONGO_INITDB_ROOT_PASSWORD=secret mongo&lt;br /&gt;
&lt;br /&gt;
The Docker ''run'' command can be used to start the Telstar container and connect it to the previously created network. Note that in the example below the internal port is specified as 6512 and that this is mapped to the same port on the host system. This is also specified at the end of the command to inform TELSTAR that this is the port to listen on.&lt;br /&gt;
&lt;br /&gt;
    $ docker run --rm -d --name telstar-server --network telstar-network -p 6512:6512 -v telstar-volume:/opt/telstar/volume johnnewcombe/telstar:amd64-2.0-RC3.23 server --port=6512&lt;br /&gt;
&lt;br /&gt;
In order to add some example content to the system, the ''init'' parameter can be used as in the example below.&lt;br /&gt;
&lt;br /&gt;
    $ docker run --rm -d --name telstar-server --network telstar-network -p 6512:6512 -v telstar-volume:/opt/telstar/volume johnnewcombe/telstar:amd64-2.0-RC3.23 server --port=6512 --init&lt;br /&gt;
&lt;br /&gt;
If the ''--init'' switch is used as in the example above, the service will be running with some example content (see [[Example Content]]) and can be accessed using a suitable client.&lt;br /&gt;
&lt;br /&gt;
In order to add additional content to the system the Telstar API can be used, this can be started as follows (see [[the Telstar API]] for mor details).&lt;br /&gt;
&lt;br /&gt;
    docker run --rm -d --name telstar-api --network telstar-network -p 8011:8011 -e TELSTAR_API_USERID=2222222222 -e TELSTAR_API_PASSWORD=1234 -e TELSTAR_COOKIE_SECRET=b6c7a826-96d6-4f45-88c4-3cf27cc2c647 johnnewcombe/telstar:amd64-2.0-RC3.23 api --port 8001 --init&lt;br /&gt;
&lt;br /&gt;
The simplest way to test the system from a desktop machine is to use the [[Telstar Viewdata Client]] alternatively Telnet can be used. TELSTAR is not a Telnet application but telnet can be used to provide a ''sanity check'' e.g.&lt;br /&gt;
&lt;br /&gt;
    $ telnet &amp;lt;ip-of-docker-host&amp;gt; &amp;lt;port-used-for-telstar&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the system is working, a display similar to the following would be shown.&lt;br /&gt;
&lt;br /&gt;
    Connected to glasstty.com.&lt;br /&gt;
    Escape character is '^]'.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    20201128T1316Z&lt;br /&gt;
    L             TE&lt;br /&gt;
     ST&lt;br /&gt;
    Welcome&lt;br /&gt;
&lt;br /&gt;
    $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$&lt;br /&gt;
             Welcome to theTELSTAR&lt;br /&gt;
               videotex service.&lt;br /&gt;
&lt;br /&gt;
         You are connected toELIOT.&lt;br /&gt;
    $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$&lt;br /&gt;
    ...&lt;br /&gt;
&lt;br /&gt;
The screen looks a little garbled simply because TELSTAR is a videotex application not a Telnet application.&lt;br /&gt;
&lt;br /&gt;
== Docker Compose and Kubernetes ==&lt;br /&gt;
&lt;br /&gt;
In the examples above the Docker command was used to set up the system. Howevevr, it may be more appropriate to use Docker Compose See [[Orchestrating Telstar with Docker Compose]]. Telstar could even be implemented using Kubernetes, see [[Orchestrating Telstar with Kubernetes]] sections for other examples.&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
Configuration options for the docker containers can be specified using environment variables, these can be specified as part of the ''docker run'' command or within the Docker Compose yaml file (see above). Full details of all of the available environment variables can be found in the section [[Configuration Options]].&lt;br /&gt;
&lt;br /&gt;
== Portainer ==&lt;br /&gt;
&lt;br /&gt;
The Docker environmemnt can be managed using Portainer, see [[Managing Telstar with Portainer]].&lt;br /&gt;
&lt;br /&gt;
[[File:2827664245-portainer.png]]&lt;/div&gt;</summary>
		<author><name>John</name></author>
	</entry>
	<entry>
		<id>https://wiki.glasstty.com/index.php?title=Installing_Telstar&amp;diff=340</id>
		<title>Installing Telstar</title>
		<link rel="alternate" type="text/html" href="https://wiki.glasstty.com/index.php?title=Installing_Telstar&amp;diff=340"/>
		<updated>2022-05-07T17:03:44Z</updated>

		<summary type="html">&lt;p&gt;John: /* Pull the Images and Run the Containers */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;It is recommended that Telstar is installed into a Docker environment. The required images are available from https://hub.docker.com/repository/docker/johnnewcombe/telstar. The following examples can be used to install and run Telstar. In addition&lt;br /&gt;
examples are also given for orchestrating the services using both Docker Compose and Kubernetes.&lt;br /&gt;
&lt;br /&gt;
To run Telstar using Docker, a minimum of two Docker images are required.&lt;br /&gt;
&lt;br /&gt;
* The official Docker image '''mongodb'''&lt;br /&gt;
* The Docker image '''telstar'''&lt;br /&gt;
&lt;br /&gt;
In addition, a Docker network will need to created to allow the images to communicate, and a Docker volume is desirable to allow for configuration changes and the addition of plugins.&lt;br /&gt;
&lt;br /&gt;
== Create the Docker Network and Volumes ==&lt;br /&gt;
&lt;br /&gt;
The Docker network is used to allow communication between the TELSTAR application and the ''mongo'' database. The volumes provide a means to persist configuration data, plugins to be added and the ''mongo'' databse itself.&lt;br /&gt;
&lt;br /&gt;
The following commands will create the resources required.&lt;br /&gt;
&lt;br /&gt;
    $ docker network create telstar-network&lt;br /&gt;
    $ docker volume create telstar-volume&lt;br /&gt;
    $ docker volume create mongo-volume&lt;br /&gt;
&lt;br /&gt;
== Pull the Images and Run the Containers ==&lt;br /&gt;
&lt;br /&gt;
It is highly recommended that the Stacks feature of Portainer, inconjunction with a compose file is used to install and manage Telstar. But to get started quickly the following docker commands can be used. See [[Managing Telstar with Portainer]] and &lt;br /&gt;
&lt;br /&gt;
Pull the required images as follows (example shows amd64 image, see https://hub.docker.com/repository/docker/johnnewcombe/telstar/tags?page=1&amp;amp;ordering=last_updated) for the latest version for your architecture.&lt;br /&gt;
&lt;br /&gt;
    $ docker pull johnnewcombe/telstar:amd64-2.0-RC3.23 .&lt;br /&gt;
    $ docker pull mongo&lt;br /&gt;
&lt;br /&gt;
''Please note that the tag used with the official mongo image may need to be set to the system architecture that is to be used. Please see https://hub.docker.com/_/mongo.//&lt;br /&gt;
&lt;br /&gt;
Start the ''mongodb'' container and connect it to the previously created network using the command below.&lt;br /&gt;
&lt;br /&gt;
''Please note that the '--name' parameter is important as it is used as part of the database connection string from the TELSTAR container.''&lt;br /&gt;
&lt;br /&gt;
    $ docker run --name telstar-mongo --network telstar-network -v mongo-volume:/data/db -d -e MONGO_INITDB_ROOT_USERNAME=mongoadmin -e MONGO_INITDB_ROOT_PASSWORD=secret mongo&lt;br /&gt;
&lt;br /&gt;
The Docker ''run'' command can be used to start the Telstar container and connect it to the previously created network. Note that in the example below the internal port is specified as 6512 and that this is mapped to the same port on the host system. This is also specified at the end of the command to inform TELSTAR that this is the port to listen on.&lt;br /&gt;
&lt;br /&gt;
    $ docker run --rm -d --name telstar-server --network telstar-network -p 6512:6512 -v telstar-volume:/opt/telstar/volume johnnewcombe/telstar:amd64-2.0-RC3.23 server --port=6512&lt;br /&gt;
&lt;br /&gt;
In order to add some example content to the system, the ''init'' parameter can be used as in the example below.&lt;br /&gt;
&lt;br /&gt;
    $ docker run --rm -d --name telstar-server --network telstar-network -p 6512:6512 -v telstar-volume:/opt/telstar/volume johnnewcombe/telstar:amd64-2.0-RC3.23 server --port=6512 --init&lt;br /&gt;
&lt;br /&gt;
If the ''--init'' switch is used as in the example above, the service will be running with some example content (see [[Example Content]]) and can be accessed using a suitable client.&lt;br /&gt;
&lt;br /&gt;
In order to add additional content to the system the Telstar API can be used, this can be started as follows (see [[the Telstar API]] for mor details).&lt;br /&gt;
&lt;br /&gt;
    docker run --rm -d --name telstar-api --network telstar-network -p 8011:8011 -e TELSTAR_API_USERID=2222222222 -e TELSTAR_API_PASSWORD=1234 -e TELSTAR_COOKIE_SECRET=b6c7a826-96d6-4f45-88c4-3cf27cc2c647 johnnewcombe/telstar:amd64-2.0-RC3.23 api --port 8001 --init&lt;br /&gt;
&lt;br /&gt;
The simplest way to test the system from a desktop machine is to use the [[Telstar Viewdata Client]] alternatively Telnet can be used. TELSTAR is not a Telnet application but telnet can be used to provide a ''sanity check'' e.g.&lt;br /&gt;
&lt;br /&gt;
    $ telnet &amp;lt;ip-of-docker-host&amp;gt; &amp;lt;port-used-for-telstar&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the system is working, a display similar to the following would be shown.&lt;br /&gt;
&lt;br /&gt;
    Connected to glasstty.com.&lt;br /&gt;
    Escape character is '^]'.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    20201128T1316Z&lt;br /&gt;
    L             TE&lt;br /&gt;
     ST&lt;br /&gt;
    Welcome&lt;br /&gt;
&lt;br /&gt;
    $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$&lt;br /&gt;
             Welcome to theTELSTAR&lt;br /&gt;
               videotex service.&lt;br /&gt;
&lt;br /&gt;
         You are connected toELIOT.&lt;br /&gt;
    $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$&lt;br /&gt;
    ...&lt;br /&gt;
&lt;br /&gt;
The screen looks a little garbled simply because TELSTAR is a videotex application not a Telnet application.&lt;br /&gt;
&lt;br /&gt;
== Docker Compose and Kubernetes ==&lt;br /&gt;
&lt;br /&gt;
In the examples above the Docker command was used to set up the system. Howevevr, it may be more appropriate to use Docker Compose See [[Orchestrating Telstar with Docker Compose]]. Telstar could even be implemented using Kubernetes, see [[Orchestrating Telstar with Kubernetes]] sections for other examples.&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
Configuration options for the docker containers can be specified using environment variables, these can be specified as part of the ''docker run'' command or within the Docker Compose yaml file (see above). Full details of all of the available environment variables can be found in the section [[Configuration Options]].&lt;br /&gt;
&lt;br /&gt;
== Portainer ==&lt;br /&gt;
&lt;br /&gt;
The Docker environmemnt can be managed using Portainer, see [[Managing Telstar with Portainer]].&lt;br /&gt;
&lt;br /&gt;
[[File:2827664245-portainer.png]]&lt;/div&gt;</summary>
		<author><name>John</name></author>
	</entry>
	<entry>
		<id>https://wiki.glasstty.com/index.php?title=Installing_Telstar&amp;diff=339</id>
		<title>Installing Telstar</title>
		<link rel="alternate" type="text/html" href="https://wiki.glasstty.com/index.php?title=Installing_Telstar&amp;diff=339"/>
		<updated>2022-05-07T17:03:05Z</updated>

		<summary type="html">&lt;p&gt;John: /* Pull the Images and Run the Containers */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;It is recommended that Telstar is installed into a Docker environment. The required images are available from https://hub.docker.com/repository/docker/johnnewcombe/telstar. The following examples can be used to install and run Telstar. In addition&lt;br /&gt;
examples are also given for orchestrating the services using both Docker Compose and Kubernetes.&lt;br /&gt;
&lt;br /&gt;
To run Telstar using Docker, a minimum of two Docker images are required.&lt;br /&gt;
&lt;br /&gt;
* The official Docker image '''mongodb'''&lt;br /&gt;
* The Docker image '''telstar'''&lt;br /&gt;
&lt;br /&gt;
In addition, a Docker network will need to created to allow the images to communicate, and a Docker volume is desirable to allow for configuration changes and the addition of plugins.&lt;br /&gt;
&lt;br /&gt;
== Create the Docker Network and Volumes ==&lt;br /&gt;
&lt;br /&gt;
The Docker network is used to allow communication between the TELSTAR application and the ''mongo'' database. The volumes provide a means to persist configuration data, plugins to be added and the ''mongo'' databse itself.&lt;br /&gt;
&lt;br /&gt;
The following commands will create the resources required.&lt;br /&gt;
&lt;br /&gt;
    $ docker network create telstar-network&lt;br /&gt;
    $ docker volume create telstar-volume&lt;br /&gt;
    $ docker volume create mongo-volume&lt;br /&gt;
&lt;br /&gt;
== Pull the Images and Run the Containers ==&lt;br /&gt;
&lt;br /&gt;
It is highly recommended that the Stacks feature of Portainer, inconjunction with a compose file is used to install and manage Telstar. But to get started quickly the following docker commands can be used.&lt;br /&gt;
&lt;br /&gt;
Pull the required images as follows (example shows amd64 image, see https://hub.docker.com/repository/docker/johnnewcombe/telstar/tags?page=1&amp;amp;ordering=last_updated) for the latest version for your architecture.&lt;br /&gt;
&lt;br /&gt;
    $ docker pull johnnewcombe/telstar:amd64-2.0-RC3.23 .&lt;br /&gt;
    $ docker pull mongo&lt;br /&gt;
&lt;br /&gt;
''Please note that the tag used with the official mongo image may need to be set to the system architecture that is to be used. Please see https://hub.docker.com/_/mongo.//&lt;br /&gt;
&lt;br /&gt;
Start the ''mongodb'' container and connect it to the previously created network using the command below.&lt;br /&gt;
&lt;br /&gt;
''Please note that the '--name' parameter is important as it is used as part of the database connection string from the TELSTAR container.''&lt;br /&gt;
&lt;br /&gt;
    $ docker run --name telstar-mongo --network telstar-network -v mongo-volume:/data/db -d -e MONGO_INITDB_ROOT_USERNAME=mongoadmin -e MONGO_INITDB_ROOT_PASSWORD=secret mongo&lt;br /&gt;
&lt;br /&gt;
The Docker ''run'' command can be used to start the Telstar container and connect it to the previously created network. Note that in the example below the internal port is specified as 6512 and that this is mapped to the same port on the host system. This is also specified at the end of the command to inform TELSTAR that this is the port to listen on.&lt;br /&gt;
&lt;br /&gt;
    $ docker run --rm -d --name telstar-server --network telstar-network -p 6512:6512 -v telstar-volume:/opt/telstar/volume johnnewcombe/telstar:amd64-2.0-RC3.23 server --port=6512&lt;br /&gt;
&lt;br /&gt;
In order to add some example content to the system, the ''init'' parameter can be used as in the example below.&lt;br /&gt;
&lt;br /&gt;
    $ docker run --rm -d --name telstar-server --network telstar-network -p 6512:6512 -v telstar-volume:/opt/telstar/volume johnnewcombe/telstar:amd64-2.0-RC3.23 server --port=6512 --init&lt;br /&gt;
&lt;br /&gt;
If the ''--init'' switch is used as in the example above, the service will be running with some example content (see [[Example Content]]) and can be accessed using a suitable client.&lt;br /&gt;
&lt;br /&gt;
In order to add additional content to the system the Telstar API can be used, this can be started as follows (see [[the Telstar API]] for mor details).&lt;br /&gt;
&lt;br /&gt;
    docker run --rm -d --name telstar-api --network telstar-network -p 8011:8011 -e TELSTAR_API_USERID=2222222222 -e TELSTAR_API_PASSWORD=1234 -e TELSTAR_COOKIE_SECRET=b6c7a826-96d6-4f45-88c4-3cf27cc2c647 johnnewcombe/telstar:amd64-2.0-RC3.23 api --port 8001 --init&lt;br /&gt;
&lt;br /&gt;
The simplest way to test the system from a desktop machine is to use the [[Telstar Viewdata Client]] alternatively Telnet can be used. TELSTAR is not a Telnet application but telnet can be used to provide a ''sanity check'' e.g.&lt;br /&gt;
&lt;br /&gt;
    $ telnet &amp;lt;ip-of-docker-host&amp;gt; &amp;lt;port-used-for-telstar&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the system is working, a display similar to the following would be shown.&lt;br /&gt;
&lt;br /&gt;
    Connected to glasstty.com.&lt;br /&gt;
    Escape character is '^]'.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    20201128T1316Z&lt;br /&gt;
    L             TE&lt;br /&gt;
     ST&lt;br /&gt;
    Welcome&lt;br /&gt;
&lt;br /&gt;
    $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$&lt;br /&gt;
             Welcome to theTELSTAR&lt;br /&gt;
               videotex service.&lt;br /&gt;
&lt;br /&gt;
         You are connected toELIOT.&lt;br /&gt;
    $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$&lt;br /&gt;
    ...&lt;br /&gt;
&lt;br /&gt;
The screen looks a little garbled simply because TELSTAR is a videotex application not a Telnet application.&lt;br /&gt;
&lt;br /&gt;
== Docker Compose and Kubernetes ==&lt;br /&gt;
&lt;br /&gt;
In the examples above the Docker command was used to set up the system. Howevevr, it may be more appropriate to use Docker Compose See [[Orchestrating Telstar with Docker Compose]]. Telstar could even be implemented using Kubernetes, see [[Orchestrating Telstar with Kubernetes]] sections for other examples.&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
Configuration options for the docker containers can be specified using environment variables, these can be specified as part of the ''docker run'' command or within the Docker Compose yaml file (see above). Full details of all of the available environment variables can be found in the section [[Configuration Options]].&lt;br /&gt;
&lt;br /&gt;
== Portainer ==&lt;br /&gt;
&lt;br /&gt;
The Docker environmemnt can be managed using Portainer, see [[Managing Telstar with Portainer]].&lt;br /&gt;
&lt;br /&gt;
[[File:2827664245-portainer.png]]&lt;/div&gt;</summary>
		<author><name>John</name></author>
	</entry>
	<entry>
		<id>https://wiki.glasstty.com/index.php?title=Installing_Telstar&amp;diff=338</id>
		<title>Installing Telstar</title>
		<link rel="alternate" type="text/html" href="https://wiki.glasstty.com/index.php?title=Installing_Telstar&amp;diff=338"/>
		<updated>2022-05-07T08:52:38Z</updated>

		<summary type="html">&lt;p&gt;John: /* Pull the Images and Run the Containers */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;It is recommended that Telstar is installed into a Docker environment. The required images are available from https://hub.docker.com/repository/docker/johnnewcombe/telstar. The following examples can be used to install and run Telstar. In addition&lt;br /&gt;
examples are also given for orchestrating the services using both Docker Compose and Kubernetes.&lt;br /&gt;
&lt;br /&gt;
To run Telstar using Docker, a minimum of two Docker images are required.&lt;br /&gt;
&lt;br /&gt;
* The official Docker image '''mongodb'''&lt;br /&gt;
* The Docker image '''telstar'''&lt;br /&gt;
&lt;br /&gt;
In addition, a Docker network will need to created to allow the images to communicate, and a Docker volume is desirable to allow for configuration changes and the addition of plugins.&lt;br /&gt;
&lt;br /&gt;
== Create the Docker Network and Volumes ==&lt;br /&gt;
&lt;br /&gt;
The Docker network is used to allow communication between the TELSTAR application and the ''mongo'' database. The volumes provide a means to persist configuration data, plugins to be added and the ''mongo'' databse itself.&lt;br /&gt;
&lt;br /&gt;
The following commands will create the resources required.&lt;br /&gt;
&lt;br /&gt;
    $ docker network create telstar-network&lt;br /&gt;
    $ docker volume create telstar-volume&lt;br /&gt;
    $ docker volume create mongo-volume&lt;br /&gt;
&lt;br /&gt;
== Pull the Images and Run the Containers ==&lt;br /&gt;
&lt;br /&gt;
Pull the required images as follows (example shows amd64 image, see https://hub.docker.com/repository/docker/johnnewcombe/telstar/tags?page=1&amp;amp;ordering=last_updated) for the latest version for your architecture.&lt;br /&gt;
&lt;br /&gt;
    $ docker pull johnnewcombe/telstar:amd64-2.0-RC3.23 .&lt;br /&gt;
    $ docker pull mongo&lt;br /&gt;
&lt;br /&gt;
''Please note that the tag used with the official mongo image may need to be set to the system architecture that is to be used. Please see https://hub.docker.com/_/mongo.//&lt;br /&gt;
&lt;br /&gt;
Start the ''mongodb'' container and connect it to the previously created network using the command below.&lt;br /&gt;
&lt;br /&gt;
''Please note that the '--name' parameter is important as it is used as part of the database connection string from the TELSTAR container.''&lt;br /&gt;
&lt;br /&gt;
    $ docker run --name telstar-mongo --network telstar-network -v mongo-volume:/data/db -d -e MONGO_INITDB_ROOT_USERNAME=mongoadmin -e MONGO_INITDB_ROOT_PASSWORD=secret mongo&lt;br /&gt;
&lt;br /&gt;
The Docker ''run'' command can be used to start the Telstar container and connect it to the previously created network. Note that in the example below the internal port is specified as 6512 and that this is mapped to the same port on the host system. This is also specified at the end of the command to inform TELSTAR that this is the port to listen on.&lt;br /&gt;
&lt;br /&gt;
    $ docker run --rm -d --name telstar-server --network telstar-network -p 6512:6512 -v telstar-volume:/opt/telstar/volume johnnewcombe/telstar:amd64-2.0-RC3.23 server --port=6512&lt;br /&gt;
&lt;br /&gt;
In order to add some example content to the system, the ''init'' parameter can be used as in the example below.&lt;br /&gt;
&lt;br /&gt;
    $ docker run --rm -d --name telstar-server --network telstar-network -p 6512:6512 -v telstar-volume:/opt/telstar/volume johnnewcombe/telstar:amd64-2.0-RC3.23 server --port=6512 --init&lt;br /&gt;
&lt;br /&gt;
If the ''--init'' switch is used as in the example above, the service will be running with some example content (see [[Example Content]]) and can be accessed using a suitable client.&lt;br /&gt;
&lt;br /&gt;
In order to add additional content to the system the Telstar API can be used, this can be started as follows (see [[the Telstar API]] for mor details).&lt;br /&gt;
&lt;br /&gt;
    docker run --rm -d --name telstar-api --network telstar-network -p 8011:8011 -e TELSTAR_API_USERID=2222222222 -e TELSTAR_API_PASSWORD=1234 -e TELSTAR_COOKIE_SECRET=b6c7a826-96d6-4f45-88c4-3cf27cc2c647 johnnewcombe/telstar:amd64-2.0-RC3.23 api --port 8001 --init&lt;br /&gt;
&lt;br /&gt;
The simplest way to test the system from a desktop machine is to use the [[Telstar Viewdata Client]] alternatively Telnet can be used. TELSTAR is not a Telnet application but telnet can be used to provide a ''sanity check'' e.g.&lt;br /&gt;
&lt;br /&gt;
    $ telnet &amp;lt;ip-of-docker-host&amp;gt; &amp;lt;port-used-for-telstar&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the system is working, a display similar to the following would be shown.&lt;br /&gt;
&lt;br /&gt;
    Connected to glasstty.com.&lt;br /&gt;
    Escape character is '^]'.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    20201128T1316Z&lt;br /&gt;
    L             TE&lt;br /&gt;
     ST&lt;br /&gt;
    Welcome&lt;br /&gt;
&lt;br /&gt;
    $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$&lt;br /&gt;
             Welcome to theTELSTAR&lt;br /&gt;
               videotex service.&lt;br /&gt;
&lt;br /&gt;
         You are connected toELIOT.&lt;br /&gt;
    $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$&lt;br /&gt;
    ...&lt;br /&gt;
&lt;br /&gt;
The screen looks a little garbled simply because TELSTAR is a videotex application not a Telnet application.&lt;br /&gt;
&lt;br /&gt;
== Docker Compose and Kubernetes ==&lt;br /&gt;
&lt;br /&gt;
In the examples above the Docker command was used to set up the system. Howevevr, it may be more appropriate to use Docker Compose See [[Orchestrating Telstar with Docker Compose]]. Telstar could even be implemented using Kubernetes, see [[Orchestrating Telstar with Kubernetes]] sections for other examples.&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
Configuration options for the docker containers can be specified using environment variables, these can be specified as part of the ''docker run'' command or within the Docker Compose yaml file (see above). Full details of all of the available environment variables can be found in the section [[Configuration Options]].&lt;br /&gt;
&lt;br /&gt;
== Portainer ==&lt;br /&gt;
&lt;br /&gt;
The Docker environmemnt can be managed using Portainer, see [[Managing Telstar with Portainer]].&lt;br /&gt;
&lt;br /&gt;
[[File:2827664245-portainer.png]]&lt;/div&gt;</summary>
		<author><name>John</name></author>
	</entry>
	<entry>
		<id>https://wiki.glasstty.com/index.php?title=Installing_Telstar&amp;diff=337</id>
		<title>Installing Telstar</title>
		<link rel="alternate" type="text/html" href="https://wiki.glasstty.com/index.php?title=Installing_Telstar&amp;diff=337"/>
		<updated>2022-05-07T08:51:59Z</updated>

		<summary type="html">&lt;p&gt;John: /* Pull the Images and Run the Containers */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;It is recommended that Telstar is installed into a Docker environment. The required images are available from https://hub.docker.com/repository/docker/johnnewcombe/telstar. The following examples can be used to install and run Telstar. In addition&lt;br /&gt;
examples are also given for orchestrating the services using both Docker Compose and Kubernetes.&lt;br /&gt;
&lt;br /&gt;
To run Telstar using Docker, a minimum of two Docker images are required.&lt;br /&gt;
&lt;br /&gt;
* The official Docker image '''mongodb'''&lt;br /&gt;
* The Docker image '''telstar'''&lt;br /&gt;
&lt;br /&gt;
In addition, a Docker network will need to created to allow the images to communicate, and a Docker volume is desirable to allow for configuration changes and the addition of plugins.&lt;br /&gt;
&lt;br /&gt;
== Create the Docker Network and Volumes ==&lt;br /&gt;
&lt;br /&gt;
The Docker network is used to allow communication between the TELSTAR application and the ''mongo'' database. The volumes provide a means to persist configuration data, plugins to be added and the ''mongo'' databse itself.&lt;br /&gt;
&lt;br /&gt;
The following commands will create the resources required.&lt;br /&gt;
&lt;br /&gt;
    $ docker network create telstar-network&lt;br /&gt;
    $ docker volume create telstar-volume&lt;br /&gt;
    $ docker volume create mongo-volume&lt;br /&gt;
&lt;br /&gt;
== Pull the Images and Run the Containers ==&lt;br /&gt;
&lt;br /&gt;
Pull the required images as follows (example shows amd64 image, see https://hub.docker.com/repository/docker/johnnewcombe/telstar/tags?page=1&amp;amp;ordering=last_updated) for the latest version.&lt;br /&gt;
&lt;br /&gt;
    $ docker pull johnnewcombe/telstar:amd64-2.0-RC3.23 .&lt;br /&gt;
    $ docker pull mongo&lt;br /&gt;
&lt;br /&gt;
''Please note that the tag used with the official mongo image may need to be set to the system architecture that is to be used. Please see https://hub.docker.com/_/mongo.//&lt;br /&gt;
&lt;br /&gt;
Start the ''mongodb'' container and connect it to the previously created network using the command below.&lt;br /&gt;
&lt;br /&gt;
''Please note that the '--name' parameter is important as it is used as part of the database connection string from the TELSTAR container.''&lt;br /&gt;
&lt;br /&gt;
    $ docker run --name telstar-mongo --network telstar-network -v mongo-volume:/data/db -d -e MONGO_INITDB_ROOT_USERNAME=mongoadmin -e MONGO_INITDB_ROOT_PASSWORD=secret mongo&lt;br /&gt;
&lt;br /&gt;
The Docker ''run'' command can be used to start the Telstar container and connect it to the previously created network. Note that in the example below the internal port is specified as 6512 and that this is mapped to the same port on the host system. This is also specified at the end of the command to inform TELSTAR that this is the port to listen on.&lt;br /&gt;
&lt;br /&gt;
    $ docker run --rm -d --name telstar-server --network telstar-network -p 6512:6512 -v telstar-volume:/opt/telstar/volume johnnewcombe/telstar:amd64-2.0-RC3.23 server --port=6512&lt;br /&gt;
&lt;br /&gt;
In order to add some example content to the system, the ''init'' parameter can be used as in the example below.&lt;br /&gt;
&lt;br /&gt;
    $ docker run --rm -d --name telstar-server --network telstar-network -p 6512:6512 -v telstar-volume:/opt/telstar/volume johnnewcombe/telstar:amd64-2.0-RC3.23 server --port=6512 --init&lt;br /&gt;
&lt;br /&gt;
If the ''--init'' switch is used as in the example above, the service will be running with some example content (see [[Example Content]]) and can be accessed using a suitable client.&lt;br /&gt;
&lt;br /&gt;
In order to add additional content to the system the Telstar API can be used, this can be started as follows (see [[the Telstar API]] for mor details).&lt;br /&gt;
&lt;br /&gt;
    docker run --rm -d --name telstar-api --network telstar-network -p 8011:8011 -e TELSTAR_API_USERID=2222222222 -e TELSTAR_API_PASSWORD=1234 -e TELSTAR_COOKIE_SECRET=b6c7a826-96d6-4f45-88c4-3cf27cc2c647 johnnewcombe/telstar:amd64-2.0-RC3.23 api --port 8001 --init&lt;br /&gt;
&lt;br /&gt;
The simplest way to test the system from a desktop machine is to use the [[Telstar Viewdata Client]] alternatively Telnet can be used. TELSTAR is not a Telnet application but telnet can be used to provide a ''sanity check'' e.g.&lt;br /&gt;
&lt;br /&gt;
    $ telnet &amp;lt;ip-of-docker-host&amp;gt; &amp;lt;port-used-for-telstar&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the system is working, a display similar to the following would be shown.&lt;br /&gt;
&lt;br /&gt;
    Connected to glasstty.com.&lt;br /&gt;
    Escape character is '^]'.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    20201128T1316Z&lt;br /&gt;
    L             TE&lt;br /&gt;
     ST&lt;br /&gt;
    Welcome&lt;br /&gt;
&lt;br /&gt;
    $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$&lt;br /&gt;
             Welcome to theTELSTAR&lt;br /&gt;
               videotex service.&lt;br /&gt;
&lt;br /&gt;
         You are connected toELIOT.&lt;br /&gt;
    $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$&lt;br /&gt;
    ...&lt;br /&gt;
&lt;br /&gt;
The screen looks a little garbled simply because TELSTAR is a videotex application not a Telnet application.&lt;br /&gt;
&lt;br /&gt;
== Docker Compose and Kubernetes ==&lt;br /&gt;
&lt;br /&gt;
In the examples above the Docker command was used to set up the system. Howevevr, it may be more appropriate to use Docker Compose See [[Orchestrating Telstar with Docker Compose]]. Telstar could even be implemented using Kubernetes, see [[Orchestrating Telstar with Kubernetes]] sections for other examples.&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
Configuration options for the docker containers can be specified using environment variables, these can be specified as part of the ''docker run'' command or within the Docker Compose yaml file (see above). Full details of all of the available environment variables can be found in the section [[Configuration Options]].&lt;br /&gt;
&lt;br /&gt;
== Portainer ==&lt;br /&gt;
&lt;br /&gt;
The Docker environmemnt can be managed using Portainer, see [[Managing Telstar with Portainer]].&lt;br /&gt;
&lt;br /&gt;
[[File:2827664245-portainer.png]]&lt;/div&gt;</summary>
		<author><name>John</name></author>
	</entry>
	<entry>
		<id>https://wiki.glasstty.com/index.php?title=Orchestrating_Telstar_with_Docker_Compose&amp;diff=335</id>
		<title>Orchestrating Telstar with Docker Compose</title>
		<link rel="alternate" type="text/html" href="https://wiki.glasstty.com/index.php?title=Orchestrating_Telstar_with_Docker_Compose&amp;diff=335"/>
		<updated>2022-05-07T08:49:50Z</updated>

		<summary type="html">&lt;p&gt;John: /* Example Docker Compose Yaml Files */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Docker Compose is a tool for defining and running multi-container Docker applications. With Compose, you use a YAML file to configure your application’s services. Then, with a single command, you create and start all the services from your configuration. Given that a YAML file has been defined and stored in ''docker-compoe.ymal'', the following command will start the docker containers.&lt;br /&gt;
&lt;br /&gt;
    $ docker-compose up -d&lt;br /&gt;
&lt;br /&gt;
To stop the containers, the following command can be used.&lt;br /&gt;
&lt;br /&gt;
    $ docker-compose down&lt;br /&gt;
&lt;br /&gt;
Full details of Docker Compose can be found at https://docs.docker.com/compose/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Example Docker Compose Yaml Files ==&lt;br /&gt;
&lt;br /&gt;
The following docker-compose yaml file can be used to manage the Telstar application and associated ''mongo'' database.&lt;br /&gt;
&lt;br /&gt;
    version: &amp;quot;3.8&amp;quot;&lt;br /&gt;
    services:&lt;br /&gt;
      telstar-01:&lt;br /&gt;
        container_name: &amp;quot;telstar-server&amp;quot;&lt;br /&gt;
        image: &amp;quot;johnnewcombe/telstar:amd64-2.0-RC3.23&amp;quot;&lt;br /&gt;
        command: &amp;quot;server --port 6512 --init&amp;quot;&lt;br /&gt;
        ports:&lt;br /&gt;
          - target: 6512&lt;br /&gt;
            published: 6512&lt;br /&gt;
        networks:&lt;br /&gt;
          - telstar-network&lt;br /&gt;
        volumes:&lt;br /&gt;
          - type: volume&lt;br /&gt;
          source: telstar-volume&lt;br /&gt;
          target: /opt/telstar/volume&lt;br /&gt;
        depends_on:&lt;br /&gt;
          - mongodb&lt;br /&gt;
        environment:&lt;br /&gt;
          - TELSTAR_SERVER_DISPLAY_NAME=AUSTEN&lt;br /&gt;
      mongodb:&lt;br /&gt;
        container_name: &amp;quot;telstar-mongo&amp;quot;&lt;br /&gt;
        image: &amp;quot;mongo&amp;quot;&lt;br /&gt;
        ports:&lt;br /&gt;
          - target: 27017&lt;br /&gt;
            published: 27017&lt;br /&gt;
        networks:&lt;br /&gt;
          telstar-network:&lt;br /&gt;
        environment:&lt;br /&gt;
          - MONGO_INITDB_ROOT_USERNAME=mongoadmin&lt;br /&gt;
          - MONGO_INITDB_ROOT_PASSWORD=secret&lt;br /&gt;
    networks:&lt;br /&gt;
      telstar-network:&lt;br /&gt;
        name: telstar-network&lt;br /&gt;
    volumes:&lt;br /&gt;
      telstar-volume:&lt;br /&gt;
        name: telstar-volume&lt;br /&gt;
&lt;br /&gt;
The following docker-compose file starts three Telstar servers all talking to the same database server, however the third server (telstar-server-03) includes an environment variable that ensures that it uses the ''secondary'' database. This ''secondary'' database collection is typically used to test content before publishing it to the primary database collection. Further details of all of the available environment variables can be found in the section [[Configuration Options]]. In addition, the Telstar API is launched as a separate container.&lt;br /&gt;
&lt;br /&gt;
    version: &amp;quot;3.8&amp;quot;&lt;br /&gt;
    services:&lt;br /&gt;
      telstar-01:&lt;br /&gt;
        container_name: &amp;quot;telstar-server-01&amp;quot;&lt;br /&gt;
        build: .&lt;br /&gt;
        image: &amp;quot;johnnewcombe/telstar:amd64-2.0-RC3.23&amp;quot;&lt;br /&gt;
        command: &amp;quot;server --port 6512 --init&amp;quot; # install to the primary database&lt;br /&gt;
        ports:&lt;br /&gt;
          - target: 6512&lt;br /&gt;
            published: 6512&lt;br /&gt;
        networks:&lt;br /&gt;
          - telstar-network&lt;br /&gt;
        volumes:&lt;br /&gt;
          - type: volume&lt;br /&gt;
          source: telstar-volume&lt;br /&gt;
          target: /opt/telstar/volume&lt;br /&gt;
        depends_on:&lt;br /&gt;
          - mongodb&lt;br /&gt;
        environment:&lt;br /&gt;
          - TELSTAR_SERVER_DISPLAY_NAME=AUSTEN&lt;br /&gt;
      telstar-02:&lt;br /&gt;
        container_name: &amp;quot;telstar-server-02&amp;quot;&lt;br /&gt;
        image: &amp;quot;johnnewcombe/telstar:amd64-2.0-RC3.23&amp;quot;&lt;br /&gt;
        command: &amp;quot;server --port 6513&amp;quot;&lt;br /&gt;
        ports:&lt;br /&gt;
          - target: 6513&lt;br /&gt;
            published: 6513&lt;br /&gt;
        networks:&lt;br /&gt;
          - telstar-network&lt;br /&gt;
        volumes:&lt;br /&gt;
          - type: volume&lt;br /&gt;
            source: telstar-volume&lt;br /&gt;
            target: /opt/telstar/volume&lt;br /&gt;
        depends_on:&lt;br /&gt;
          - mongodb&lt;br /&gt;
        environment:&lt;br /&gt;
          - TELSTAR_SERVER_DISPLAY_NAME=ELIOT&lt;br /&gt;
      telstar-03:&lt;br /&gt;
        container_name: &amp;quot;telstar-server-03&amp;quot;&lt;br /&gt;
        image: &amp;quot;johnnewcombe/telstar:amd64-2.0-RC3.23&amp;quot;&lt;br /&gt;
        command: &amp;quot;server --port 6514 --init&amp;quot; # install to the secondary database&lt;br /&gt;
        ports:&lt;br /&gt;
          - target: 6514&lt;br /&gt;
            published: 6514&lt;br /&gt;
        networks:&lt;br /&gt;
          - telstar-network&lt;br /&gt;
        volumes:&lt;br /&gt;
          - type: volume&lt;br /&gt;
            source: telstar-volume&lt;br /&gt;
            target: /opt/telstar/volume&lt;br /&gt;
        depends_on:&lt;br /&gt;
          - mongodb&lt;br /&gt;
        environment:&lt;br /&gt;
          - TELSTAR_SERVER_DISPLAY_NAME=HARDY&lt;br /&gt;
          - TELSTAR_DBCOLLECTION=SECONDARY&lt;br /&gt;
      telstar-api:&lt;br /&gt;
        container_name: &amp;quot;telstar-api&amp;quot;&lt;br /&gt;
        image: &amp;quot;johnnewcombe/telstar:amd64-2.0-RC3.23&amp;quot;&lt;br /&gt;
        command: &amp;quot;api --port 8001 --init&amp;quot;&lt;br /&gt;
        ports:&lt;br /&gt;
          - target: 8001&lt;br /&gt;
            published: 8001&lt;br /&gt;
        networks:&lt;br /&gt;
          - telstar-network&lt;br /&gt;
        depends_on:&lt;br /&gt;
          - mongodb&lt;br /&gt;
    environment:&lt;br /&gt;
      - TELSTAR_API_USERID=2222222222&lt;br /&gt;
      - TELSTAR_API_PASSWORD=1234&lt;br /&gt;
      - TELSTAR_COOKIE_SECRET=&amp;lt;place yout secret here&amp;gt; # define this for yourself and keep it secret, a GUID is a good option.&lt;br /&gt;
    mongodb:&lt;br /&gt;
      container_name: &amp;quot;telstar-mongo&amp;quot;&lt;br /&gt;
      image: &amp;quot;mongo&amp;quot;&lt;br /&gt;
      ports:&lt;br /&gt;
        - target: 27017&lt;br /&gt;
          published: 27017&lt;br /&gt;
      networks:&lt;br /&gt;
        telstar-network:&lt;br /&gt;
      environment:&lt;br /&gt;
        - MONGO_INITDB_ROOT_USERNAME=mongoadmin&lt;br /&gt;
        - MONGO_INITDB_ROOT_PASSWORD=secret&lt;br /&gt;
    networks:&lt;br /&gt;
      telstar-network:&lt;br /&gt;
        name: telstar-network&lt;br /&gt;
    volumes:&lt;br /&gt;
      telstar-volume:&lt;br /&gt;
        name: telstar-volume&lt;/div&gt;</summary>
		<author><name>John</name></author>
	</entry>
	<entry>
		<id>https://wiki.glasstty.com/index.php?title=Installing_Telstar&amp;diff=334</id>
		<title>Installing Telstar</title>
		<link rel="alternate" type="text/html" href="https://wiki.glasstty.com/index.php?title=Installing_Telstar&amp;diff=334"/>
		<updated>2022-05-07T08:49:07Z</updated>

		<summary type="html">&lt;p&gt;John: /* Pull the Images and Run the Containers */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;It is recommended that Telstar is installed into a Docker environment. The required images are available from https://hub.docker.com/repository/docker/johnnewcombe/telstar. The following examples can be used to install and run Telstar. In addition&lt;br /&gt;
examples are also given for orchestrating the services using both Docker Compose and Kubernetes.&lt;br /&gt;
&lt;br /&gt;
To run Telstar using Docker, a minimum of two Docker images are required.&lt;br /&gt;
&lt;br /&gt;
* The official Docker image '''mongodb'''&lt;br /&gt;
* The Docker image '''telstar'''&lt;br /&gt;
&lt;br /&gt;
In addition, a Docker network will need to created to allow the images to communicate, and a Docker volume is desirable to allow for configuration changes and the addition of plugins.&lt;br /&gt;
&lt;br /&gt;
== Create the Docker Network and Volumes ==&lt;br /&gt;
&lt;br /&gt;
The Docker network is used to allow communication between the TELSTAR application and the ''mongo'' database. The volumes provide a means to persist configuration data, plugins to be added and the ''mongo'' databse itself.&lt;br /&gt;
&lt;br /&gt;
The following commands will create the resources required.&lt;br /&gt;
&lt;br /&gt;
    $ docker network create telstar-network&lt;br /&gt;
    $ docker volume create telstar-volume&lt;br /&gt;
    $ docker volume create mongo-volume&lt;br /&gt;
&lt;br /&gt;
== Pull the Images and Run the Containers ==&lt;br /&gt;
&lt;br /&gt;
Pull the required images as follows (example shows amd64 image, see https://hub.docker.com/repository/docker/johnnewcombe/telstar/tags?page=1&amp;amp;ordering=last_updated).&lt;br /&gt;
&lt;br /&gt;
    $ docker pull johnnewcombe/telstar:amd64-2.0-RC3.23 .&lt;br /&gt;
    $ docker pull mongo&lt;br /&gt;
&lt;br /&gt;
''Please note that the tag used with the official mongo image may need to be set to the system architecture that is to be used. Please see https://hub.docker.com/_/mongo.//&lt;br /&gt;
&lt;br /&gt;
Start the ''mongodb'' container and connect it to the previously created network using the command below.&lt;br /&gt;
&lt;br /&gt;
''Please note that the '--name' parameter is important as it is used as part of the database connection string from the TELSTAR container.''&lt;br /&gt;
&lt;br /&gt;
    $ docker run --name telstar-mongo --network telstar-network -v mongo-volume:/data/db -d -e MONGO_INITDB_ROOT_USERNAME=mongoadmin -e MONGO_INITDB_ROOT_PASSWORD=secret mongo&lt;br /&gt;
&lt;br /&gt;
The Docker ''run'' command can be used to start the Telstar container and connect it to the previously created network. Note that in the example below the internal port is specified as 6512 and that this is mapped to the same port on the host system. This is also specified at the end of the command to inform TELSTAR that this is the port to listen on.&lt;br /&gt;
&lt;br /&gt;
    $ docker run --rm -d --name telstar-server --network telstar-network -p 6512:6512 -v telstar-volume:/opt/telstar/volume johnnewcombe/telstar:amd64-2.0-RC3.23 server --port=6512&lt;br /&gt;
&lt;br /&gt;
In order to add some example content to the system, the ''init'' parameter can be used as in the example below.&lt;br /&gt;
&lt;br /&gt;
    $ docker run --rm -d --name telstar-server --network telstar-network -p 6512:6512 -v telstar-volume:/opt/telstar/volume johnnewcombe/telstar:amd64-2.0-RC3.23 server --port=6512 --init&lt;br /&gt;
&lt;br /&gt;
If the ''--init'' switch is used as in the example above, the service will be running with some example content (see [[Example Content]]) and can be accessed using a suitable client.&lt;br /&gt;
&lt;br /&gt;
In order to add additional content to the system the Telstar API can be used, this can be started as follows (see [[the Telstar API]] for mor details).&lt;br /&gt;
&lt;br /&gt;
    docker run --rm -d --name telstar-api --network telstar-network -p 8011:8011 -e TELSTAR_API_USERID=2222222222 -e TELSTAR_API_PASSWORD=1234 -e TELSTAR_COOKIE_SECRET=b6c7a826-96d6-4f45-88c4-3cf27cc2c647 johnnewcombe/telstar:amd64-2.0-RC3.23 api --port 8001 --init&lt;br /&gt;
&lt;br /&gt;
The simplest way to test the system from a desktop machine is to use the [[Telstar Viewdata Client]] alternatively Telnet can be used. TELSTAR is not a Telnet application but telnet can be used to provide a ''sanity check'' e.g.&lt;br /&gt;
&lt;br /&gt;
    $ telnet &amp;lt;ip-of-docker-host&amp;gt; &amp;lt;port-used-for-telstar&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the system is working, a display similar to the following would be shown.&lt;br /&gt;
&lt;br /&gt;
    Connected to glasstty.com.&lt;br /&gt;
    Escape character is '^]'.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    20201128T1316Z&lt;br /&gt;
    L             TE&lt;br /&gt;
     ST&lt;br /&gt;
    Welcome&lt;br /&gt;
&lt;br /&gt;
    $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$&lt;br /&gt;
             Welcome to theTELSTAR&lt;br /&gt;
               videotex service.&lt;br /&gt;
&lt;br /&gt;
         You are connected toELIOT.&lt;br /&gt;
    $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$&lt;br /&gt;
    ...&lt;br /&gt;
&lt;br /&gt;
The screen looks a little garbled simply because TELSTAR is a videotex application not a Telnet application.&lt;br /&gt;
&lt;br /&gt;
== Docker Compose and Kubernetes ==&lt;br /&gt;
&lt;br /&gt;
In the examples above the Docker command was used to set up the system. Howevevr, it may be more appropriate to use Docker Compose See [[Orchestrating Telstar with Docker Compose]]. Telstar could even be implemented using Kubernetes, see [[Orchestrating Telstar with Kubernetes]] sections for other examples.&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
Configuration options for the docker containers can be specified using environment variables, these can be specified as part of the ''docker run'' command or within the Docker Compose yaml file (see above). Full details of all of the available environment variables can be found in the section [[Configuration Options]].&lt;br /&gt;
&lt;br /&gt;
== Portainer ==&lt;br /&gt;
&lt;br /&gt;
The Docker environmemnt can be managed using Portainer, see [[Managing Telstar with Portainer]].&lt;br /&gt;
&lt;br /&gt;
[[File:2827664245-portainer.png]]&lt;/div&gt;</summary>
		<author><name>John</name></author>
	</entry>
	<entry>
		<id>https://wiki.glasstty.com/index.php?title=Frames&amp;diff=331</id>
		<title>Frames</title>
		<link rel="alternate" type="text/html" href="https://wiki.glasstty.com/index.php?title=Frames&amp;diff=331"/>
		<updated>2022-04-24T19:25:09Z</updated>

		<summary type="html">&lt;p&gt;John: /* redirect */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;As is typical with interactive videotex systems, pages are numbered from 0 to 999999999 and consist of one or more frames with the suffix a-z, for example the first frame for page 200 would be 200a, the second 200b and so on (see [[Routing]]) for more details). These frames are stored within TELSTAR's database as ''JSON'' objects (see https://www.json.org/) and uploaded to Telstar using a simple command line utility.&lt;br /&gt;
&lt;br /&gt;
The Telstar utility program simply interacts with the Telstar API which is a restful API. This can be used directly by any software making it simple to programitically manage pages and routing information.&lt;br /&gt;
&lt;br /&gt;
Frames are defined in JSON. The simplest frame that can be viewed on TELSTAR would be as follows. This would create a simple information frame with some flashing content. In this example [[Markup]] has been used within the content, however, other content types can be used including edi.tf urls, see below.&lt;br /&gt;
&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;pid&amp;quot;: {&lt;br /&gt;
        &amp;quot;page-no&amp;quot;: 101,&lt;br /&gt;
        &amp;quot;frame-id&amp;quot;: &amp;quot;a&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;visible&amp;quot;: true,&lt;br /&gt;
      &amp;quot;content&amp;quot;: {&lt;br /&gt;
        &amp;quot;data&amp;quot;: &amp;quot;[D]This is page[F]101a&amp;quot;,&lt;br /&gt;
         &amp;quot;type&amp;quot;: &amp;quot;markup&amp;quot;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Shown below is a more complete example of a JSON defined frame. With this particular frame, the actual viewdata content has been created using the editor at http://edit.tf, this can be seen in the ''content.data'' and ''content.type'' keys. The example below is a simple information page with some simple routing (see [[Routing]]). Clicking the ''content.data'' link, or pasteing the value into a browser will show the page and allow it to be edited. It is not necessary to use the http://edit.tf editor, this is just one possible option.&lt;br /&gt;
&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;pid&amp;quot;: {&lt;br /&gt;
        &amp;quot;page-no&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;frame-id&amp;quot;: &amp;quot;a&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;visible&amp;quot;: true,&lt;br /&gt;
      &amp;quot;frame-type&amp;quot;: &amp;quot;information&amp;quot;,&lt;br /&gt;
      &amp;quot;content&amp;quot;: {&lt;br /&gt;
        &amp;quot;data&amp;quot;: &amp;quot;http://edit.tf/#0:QIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQMMKAbNw6dyCTuyZfCBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgKJEiRIkSJEiRIkSJEiRIkSJEiRIkSJEiRIkSJEiRIkSJEiRAxQR4s6LSgzEEmdUi0otOogkzo0-lNg1JM-cCg8unNYgQIASBBj67OnXllWIMu7pl5dMOndty7uixBoy4dnTQsQIECBAgBIEHfLh2dNCDDuyINmnNl59POzKuQIECBAgQIECBAgQIECBAyQTotemggzoiCvFg1JEWkCnYemnfuw7EGHdkQIECBAgQIASBBp3dMvLdh6ad-7DsQbsvfmgw7siDvlw9NGXkuQIECBAgQM0EKrTkzotOmgkzo0-lNg1JM-cCh79vDDu8oMO7IgQIECAEgQYuvPTuy8-aDdl781wM6EjVKcVBMw9MvPogoctOPLzQIEDRBHn1otKdNizqiCTOjT6U2DUkz5wKlvw5OaxByw6dixAgBIEGHdkQUMPLZpw7cu7ouQIECBAgQIECBAgQIECBAgQIECBA2QR4NSLXg2UFOLSrSYcWmCnWKkWYsQVIsWNBsLEEOHMaIASBBh3ZEHTRlQQ9-zfz54diCHh7ZUGHJ2y7unXllXIECBAgQN0EifMkxINmmCqcsPbLsQYd2RBI37NOTD5QbsvfmuQIECBA4CHQc2TDpT50WogcMGCAScgoOnLTi69MqDpvQdNGnmgQIAaBBzy8u2nHlQd9PTQgqZdmXnvzdO-HllQYd2RBt38sq5AgQOQ0yfHQT40ZYgp2adSLNQSZ0aegTIKkWnUQUIMeLTQIECAokSJEiRIkSJEiRIkSJEiRIkSJEiRIkSJEiRIkSJEiRIkSJEFeLBqSItJBGn0osODTqIBIM6EQIEFDDnyoFTJywvoECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECA&amp;quot;,&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;edit.tf&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;routing-table&amp;quot;: [0,1,11,3,400,5,6,7,800,9,0],&lt;br /&gt;
      &amp;quot;cursor&amp;quot;: false,&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
== Adding Frames to the System ==&lt;br /&gt;
&lt;br /&gt;
Frames can be added to the system using either the Telstar API.&lt;br /&gt;
&lt;br /&gt;
The Telstar API, in conjunction with the cross platform Telstar Util software, provides a simple method of creating and managing pages.&lt;br /&gt;
&lt;br /&gt;
The API can be used to retrieve and update frames and configuring routing. The API is a restful API that uses the GET, PUT, POST and DELETE HTTP methods and as such can be used from any application.&lt;br /&gt;
&lt;br /&gt;
Data is passed to and from the API in JSON format, making the system very simple to use in any programming language. The whole API could be used without any programming at all by using a command line utility such as CURL.&lt;br /&gt;
&lt;br /&gt;
''Further details of the Telstar API can be found in the section [[The Telstar API]].''&lt;br /&gt;
&lt;br /&gt;
== Adding Content with the Edit.tf editor ==&lt;br /&gt;
&lt;br /&gt;
There are several ways to add content to a page. One of the easiest is to create the page in an editor such as http://edit.tf.&lt;br /&gt;
&lt;br /&gt;
The JSON file would look something like the one showm below. Note that the content type is set to editf and the content data contains the edit.tf url.&lt;br /&gt;
&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;pid&amp;quot;: {&lt;br /&gt;
            &amp;quot;page-no&amp;quot;: 101,&lt;br /&gt;
            &amp;quot;frame-id&amp;quot;: &amp;quot;a&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;visible&amp;quot;: true,&lt;br /&gt;
        &amp;quot;frame-type&amp;quot;: &amp;quot;information&amp;quot;,&lt;br /&gt;
        &amp;quot;content&amp;quot;: {&lt;br /&gt;
            &amp;quot;data&amp;quot;: &amp;quot;http://edit.tf/#0:QIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQICn_OmTJkSJApUqVKlSpUlcHApiTJkyZEiRIkyZMmTIkSJFmKf3JX58____RBg-fPnzog__2iBBo-fNX9qgQcOHDh8-fGiAp_zFf______2v7_____7X___oEGr__Qa0ur_________QoCn9ywK__6D__a__7dH__tf___1QIv_9AiQIkaPX_bo0aMpiKf_-Yr__oP_9r__tUH_-1____9og__yjnz5cldX9qUc-fPkp__uSv_-g__2v_-1Qf_7X__aIv____KZv_dIV__2pTN___yn__mK___z__a____5__tf_9qgVf__8o5_vWJX__alHP___Kf_7kr____6dBr_____-h__2qBBr__ymbPnSFf69CUzf__8pnz5iq9ejRoECBWvXr0KBGjQYOHBHz4cECBAgwcCily7__yqDhw4ePnzogQeP7RAg0fPiBB___9X___QYPH___-sCmb__KoP________3B__tUCDV__tUH___1f36XB-_______KOf_8qgRo__9B__v9X___QINX___Qav__B8-NNX_-jR___8pm__ymYrq______h_odX9qg1f___7q__9X_-h1f_5TBgwYM37__KOSur-_Ro0Pr_8_f_qDV_b___r__1f_6D___lFKlSpUu__8pmK_v7VAgwf______tNX9r______V__oP__-gQaPnwpm__yqDB__tUCD__QIEG___1f2qL____9X_-g____z5-__ymb__KoNX_-lQKl6VAgQav6_V__oNf___1f2qBX_____9-hKOf_8qgVJ0JRw4cOPLkqiQoESNGgVL0aFEjQoECJGjRoymDNm__ymTJkzZv3_____-3bt27du3Thw8efPnz58-fPnz58-fP___QIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECA&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;edit.tf&amp;quot;&lt;br /&gt;
        }    &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
== Adding Content using Markup ==&lt;br /&gt;
&lt;br /&gt;
Content can be added directly to the JSON file using a very simple markup. For example consider the following frame definition.&lt;br /&gt;
&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;pid&amp;quot;: {&lt;br /&gt;
            &amp;quot;page-no&amp;quot;: 101,&lt;br /&gt;
            &amp;quot;frame-id&amp;quot;: &amp;quot;a&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;visible&amp;quot;: true,&lt;br /&gt;
        &amp;quot;frame-type&amp;quot;: &amp;quot;information&amp;quot;,&lt;br /&gt;
        &amp;quot;title&amp;quot;: {&lt;br /&gt;
            &amp;quot;data&amp;quot;: &amp;quot;[D]Welcome\r\n\r\n&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;markup&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;content&amp;quot;: {&lt;br /&gt;
            &amp;quot;data&amp;quot;: &amp;quot;[Y]Hello[C]Telstar[M]World&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;markup&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
This frame uses markup in the title and the content, The title is specified as [D]ouble height and the three words used in the content are coloured yellow, cyan and magenta respectively.&lt;br /&gt;
&lt;br /&gt;
Full details of markup can be found in the [[Markup]] section.&lt;br /&gt;
&lt;br /&gt;
== Complete Frame Description ==&lt;br /&gt;
&lt;br /&gt;
The frame below is a standard information page from the TELSTAR system shown in its JSON format. It represents the first frame of page 9. Taking this frame as an example, a description of the fields and their meaning is decribed below.&lt;br /&gt;
&lt;br /&gt;
''The full json schema can be found [[Frame Schema|here]].''&lt;br /&gt;
&lt;br /&gt;
     {&lt;br /&gt;
    	&amp;quot;pid&amp;quot;: {&lt;br /&gt;
    		&amp;quot;page-no&amp;quot;: 9,&lt;br /&gt;
    		&amp;quot;frame-id&amp;quot;: &amp;quot;a&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;visible&amp;quot;: true,&lt;br /&gt;
        &amp;quot;header-text&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;cost&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;frame-type&amp;quot;: &amp;quot;information&amp;quot;,&lt;br /&gt;
        &amp;quot;redirect&amp;quot;: {&lt;br /&gt;
            &amp;quot;page-no&amp;quot;: 0,&lt;br /&gt;
            &amp;quot;frame-id&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;content&amp;quot;: {&lt;br /&gt;
            &amp;quot;data&amp;quot;: &amp;quot;https://edit.tf/#0:QIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgc4UCBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQICixYsWLFixYsWLFixYsWLFixYsWLFixYsWLFixYsWLFixYgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAxQIIs6PJnRYtKTOjoKkWnUQUIMeLTQIECBAgQIECBAgQIEDRAgp2adSLNQSZ0aegQIECBAgQIECBAgQIECBAgQIECBAgQNkCCPBqRa8GygpxaVaTDi00CBAgQIECBAgQIECBAgQIECBA4QIIc-dUgw6iCJFqQZMymgQIECBAgQIECBAgQIECBAgQIEDlAgmT46CfOQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQMECCZPjoJ8aMgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQICixYsWLFixYsWLFixYsWLFixYsWLFixYsWLFixYsWLFixYgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECAFUQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgBVAMUNMQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIAVQDFDTAlMPUQIECBAgQIECBAgQIECBAgQIECBAgQIECAFUAxQ0wJTD1A0EHSQIECBAgQIECBAgQIECBAgQIECBAgQIECANMCUw9QNBB0kCBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECAPUDQQdJAgQIECBAgQIECBAgQIECAosWLFixYsWLFixYsQIECAHSQIECAosWLFixYsWLFixYsWIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECA&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;edit.tf'&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;title&amp;quot;: {&lt;br /&gt;
            &amp;quot;data&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
            &amp;quot;merge-data&amp;quot;: []&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;routing-table&amp;quot;: [&lt;br /&gt;
            90,&lt;br /&gt;
            91,&lt;br /&gt;
            92,&lt;br /&gt;
            93,&lt;br /&gt;
            94,&lt;br /&gt;
            95,&lt;br /&gt;
            96,&lt;br /&gt;
            97,&lt;br /&gt;
            98,&lt;br /&gt;
            990,&lt;br /&gt;
            0&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;cursor&amp;quot;: false,&lt;br /&gt;
        &amp;quot;connection&amp;quot;: {&lt;br /&gt;
            &amp;quot;address&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
            &amp;quot;mode&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
            &amp;quot;port&amp;quot;: 0&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;author-id&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;response-data&amp;quot;: {&lt;br /&gt;
            &amp;quot;responses&amp;quot;: null,&lt;br /&gt;
            &amp;quot;response-action&amp;quot;: {&lt;br /&gt;
                &amp;quot;exec&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
                &amp;quot;args&amp;quot;: null,&lt;br /&gt;
                &amp;quot;post-action-frame&amp;quot;: {&lt;br /&gt;
                    &amp;quot;page-no&amp;quot;: 0,&lt;br /&gt;
                    &amp;quot;frame-id&amp;quot;: ''&lt;br /&gt;
                },&lt;br /&gt;
                &amp;quot;post-cancel-frame&amp;quot;: {&lt;br /&gt;
                    &amp;quot;page-no&amp;quot;: 0,&lt;br /&gt;
                    &amp;quot;frame-id&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;navmessage-select&amp;quot;: &amp;quot;[B][n][Y]Select item or[W]*page# : [_+]&amp;quot;,&lt;br /&gt;
        &amp;quot;navmessage-notfound&amp;quot;: &amp;quot;[B][n][Y]Page not Found :[W]&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
=== pid ===&lt;br /&gt;
&lt;br /&gt;
Specifies the page number and frame id for the frame.&lt;br /&gt;
&lt;br /&gt;
    	&amp;quot;pid&amp;quot;: {&lt;br /&gt;
    		&amp;quot;page-no&amp;quot;: 9,&lt;br /&gt;
    		&amp;quot;frame-id&amp;quot;: &amp;quot;a&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
&lt;br /&gt;
=== visible ===&lt;br /&gt;
&lt;br /&gt;
When set to false, the frame will not be accessible and will return the ''not found'' system message to the user if an attempt is made to access it.&lt;br /&gt;
&lt;br /&gt;
      &amp;quot;visible&amp;quot;: true,&lt;br /&gt;
&lt;br /&gt;
=== header-text ===&lt;br /&gt;
&lt;br /&gt;
Allows the default header text to be ovwerridden at frame level. If this is left blank the default header will be used, see configuration.&lt;br /&gt;
&lt;br /&gt;
      &amp;quot;header-text&amp;quot;: &amp;quot;[Y]MICRONETn 800 (C)&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
=== cost ===&lt;br /&gt;
&lt;br /&gt;
      &amp;quot;cost&amp;quot;: 0,&lt;br /&gt;
&lt;br /&gt;
=== frame-type ===&lt;br /&gt;
&lt;br /&gt;
The API supports the following frame types ''initial'', ''mainindex'', ''information'', ''exit'', ''gateway'', ''test'' and ''response''.&lt;br /&gt;
&lt;br /&gt;
      &amp;quot;frame-type&amp;quot;: &amp;quot;information&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
* '''initial''': This frame type is used on the start page, see [[Configuration Options]]. Typically only one of these frames would exist within a system.&lt;br /&gt;
* '''mainindex''': This frame type is used on the main index page. , see [[Configuration Options]]. Only one of these frames should exist within a system.&lt;br /&gt;
* '''information''': This frame type is used for all normal content frames.&lt;br /&gt;
* '''exit''': This frame type is used for an exit page, any number of exit pages can be defined. When an exit page is rendered it will close the connection.&lt;br /&gt;
* '''gateway''': This page type is used to define a gateway page and is used in conjunction with the connection element (see below).&lt;br /&gt;
* '''test''': This page type indicates a test page and prevents navigation and system messages from being shown. this is typically used for frames that need to use the whole display such as 'test cards' etc.&lt;br /&gt;
* '''telesoftware''': Telesoftware frames (see [[Telesoftware]]).&lt;br /&gt;
* '''response''': This frame type is used for response frames. See [[Implementing Response Frames]].&lt;br /&gt;
* '''system''': Reserved for use internally.&lt;br /&gt;
* '''exception''': Reserved for use internally.&lt;br /&gt;
&lt;br /&gt;
=== redirect ===&lt;br /&gt;
 &lt;br /&gt;
If set it simply means that the user is redirected to the specified frame. This can be a useful alternative form of navigation to the routing table.&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;redirect&amp;quot;: {&lt;br /&gt;
            &amp;quot;page-no&amp;quot;: 9,&lt;br /&gt;
            &amp;quot;frame-id&amp;quot;: &amp;quot;a&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
&lt;br /&gt;
The following is an example of a complete redirect page.&lt;br /&gt;
&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;PID&amp;quot;: {&lt;br /&gt;
            &amp;quot;page-no&amp;quot;: 2,&lt;br /&gt;
            &amp;quot;frame-id&amp;quot;: &amp;quot;a&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;redirect&amp;quot;: {&lt;br /&gt;
            &amp;quot;page-no&amp;quot;: 11,&lt;br /&gt;
            &amp;quot;frame-id&amp;quot;: &amp;quot;a&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;visible&amp;quot;: true&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
=== content ===&lt;br /&gt;
&lt;br /&gt;
These elements define the content. The example below shows the content.type to be an edit.tf url. The available types are shown below.&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;content&amp;quot;: {&lt;br /&gt;
            &amp;quot;data&amp;quot;: &amp;quot;https://edit.tf/#0:QIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgc4UCBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQICixYsWLFixYsWLFixYsWLFixYsWLFixYsWLFixYsWLFixYgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAxQIIs6PJnRYtKTOjoKkWnUQUIMeLTQIECBAgQIECBAgQIEDRAgp2adSLNQSZ0aegQIECBAgQIECBAgQIECBAgQIECBAgQNkCCPBqRa8GygpxaVaTDi00CBAgQIECBAgQIECBAgQIECBA4QIIc-dUgw6iCJFqQZMymgQIECBAgQIECBAgQIECBAgQIEDlAgmT46CfOQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQMECCZPjoJ8aMgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQICixYsWLFixYsWLFixYsWLFixYsWLFixYsWLFixYsWLFixYgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECAFUQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgBVAMUNMQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIAVQDFDTAlMPUQIECBAgQIECBAgQIECBAgQIECBAgQIECAFUAxQ0wJTD1A0EHSQIECBAgQIECBAgQIECBAgQIECBAgQIECANMCUw9QNBB0kCBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECAPUDQQdJAgQIECBAgQIECBAgQIECAosWLFixYsWLFixYsQIECAHSQIECAosWLFixYsWLFixYsWIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECA&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;edit.tf'&lt;br /&gt;
        },&lt;br /&gt;
&lt;br /&gt;
Content types:&lt;br /&gt;
&lt;br /&gt;
* '''edit.tf''': If set, then the content will be treated as an edit.tf url. This is converted to RawV before being rendered.&lt;br /&gt;
* '''markup''': If set, then the content will be treated as ''markup'' content. Full details of ''markup'' can be found in the section [[Markup]]&lt;br /&gt;
* '''rawV''': If set, then the content will be treated as raw videotex data. This is 7bit (00-7F) videotex format with control chars between 00-1F and escaped codes for alpha and graphic attributes. Ideally rows should have any trailing spaces removed and replaced with with a CR/LF combination. This will be rendered as is.&lt;br /&gt;
* '''rawT''': If set, then the content will be treated as raw teletex data. This is a 24 x 40 block of 7 bits chars (960 chars) in Teletext format (range 00-7F). This format is used internally when manipulating page data. It will be converted to RawV before being rendered.&lt;br /&gt;
&lt;br /&gt;
=== title ===&lt;br /&gt;
&lt;br /&gt;
This sets the title of the page. In many cases this may be left blank with all of the content specified in the ''content'' section (see above) however, the ''title'' section gives additional flexibility when creating frames.&lt;br /&gt;
&lt;br /&gt;
Values for ''title-type'' are the same as defined for the content section, however, if the type ''edit-tf'' is used then only the first four (default) lines of the edit.tf defined page are used. &lt;br /&gt;
&lt;br /&gt;
Separating title from content in this way allows logos and header sections to be created for the title whilst using markup for the main content or visa-versa. &lt;br /&gt;
&lt;br /&gt;
==== Example 1 ====&lt;br /&gt;
&lt;br /&gt;
In thi example the fields are blank meaning that only the data in the ''content'' section is displayed.&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;title&amp;quot;: {&lt;br /&gt;
            &amp;quot;data&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
            &amp;quot;merge-data&amp;quot;: []&lt;br /&gt;
        },&lt;br /&gt;
&lt;br /&gt;
==== Example 2 ====&lt;br /&gt;
&lt;br /&gt;
In this example, the top 4 lines of the edit.tf content is displayed at the top of the page.&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;title&amp;quot;: {&lt;br /&gt;
            &amp;quot;data&amp;quot;: &amp;quot;https://edit.tf/#0:QIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECAvobotqBX__oECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIC_9AgQIEGv-gQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgL_0Cj4kQav6BAgQIECBAgQIECBAgQIECBAgQIECBAgQIECAuq64P6Dx__oECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECA&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;edit.tf&amp;quot;,&lt;br /&gt;
            &amp;quot;merge-data&amp;quot;: []&lt;br /&gt;
        },&lt;br /&gt;
&lt;br /&gt;
To take the top 5 lines, the ''type'' field can be extended as follows.&lt;br /&gt;
&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;edit.tf,5&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Note that this extended form of ''type'' only applies to edit.tf types.&lt;br /&gt;
&lt;br /&gt;
==== Example 3 ====&lt;br /&gt;
&lt;br /&gt;
The merge data field can be used to add ''layers'' of markup data to the title area. For example the example above shows the Guardian logo. To add some alphagraphics text to this, an additional layer could be used e.g.&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;title&amp;quot;: {&lt;br /&gt;
            &amp;quot;data&amp;quot;: &amp;quot;https://edit.tf/#0:QIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECAvobotqBX__oECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIC_9AgQIEGv-gQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgL_0Cj4kQav6BAgQIECBAgQIECBAgQIECBAgQIECBAgQIECAuq64P6Dx__oECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECA&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;edit.tf,5&amp;quot;,&lt;br /&gt;
            &amp;quot;merge-data&amp;quot;: [&lt;br /&gt;
                &amp;quot;[w[             UK News]]&amp;quot;&lt;br /&gt;
            ]&lt;br /&gt;
        },&lt;br /&gt;
&lt;br /&gt;
Note that any number of layers can be added, however, the merge layer must be defined as markup.&lt;br /&gt;
&lt;br /&gt;
=== routing table ===&lt;br /&gt;
&lt;br /&gt;
The routing table defines which pages are navigated to when a user presses a key whilst viewing the frame. The table has 11 entries with the first 10 representing the keys 0-9, the final entry refers to the ''hash'' (return) key.&lt;br /&gt;
&lt;br /&gt;
The example below shows the default routing table for frame 9a. If the user is viewing this frame and presses 1 the frame 91a will be loaded, assuming it exists. Pressing the ''hash'' (return) key will take the user back to frame 0a, the main index.&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;routing-table&amp;quot;: [&lt;br /&gt;
            90,&lt;br /&gt;
            91,&lt;br /&gt;
            92,&lt;br /&gt;
            93,&lt;br /&gt;
            94,&lt;br /&gt;
            95,&lt;br /&gt;
            96,&lt;br /&gt;
            97,&lt;br /&gt;
            98,&lt;br /&gt;
            99,&lt;br /&gt;
            0&lt;br /&gt;
        ],&lt;br /&gt;
&lt;br /&gt;
=== cursor ===&lt;br /&gt;
&lt;br /&gt;
This element determines whether a cursor is shown on the page. Typically a cursor would only be shown on response frames.&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;cursor&amp;quot;: false,&lt;br /&gt;
        &lt;br /&gt;
=== connection ===&lt;br /&gt;
&lt;br /&gt;
This elements specifies the connection object used for gateway pages.&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;connection&amp;quot;: {&lt;br /&gt;
            &amp;quot;address&amp;quot;: &amp;quot;fish.ccl4.org&amp;quot;,&lt;br /&gt;
            &amp;quot;mode&amp;quot;: &amp;quot;viewdata&amp;quot;,&lt;br /&gt;
            &amp;quot;port&amp;quot;: 23&lt;br /&gt;
        },&lt;br /&gt;
&lt;br /&gt;
The values for ''address and port'' represent the endpoint of the system being accessed and the value for ''mode'' determines how the system is accessed, the options are:&lt;br /&gt;
&lt;br /&gt;
    viewdata&lt;br /&gt;
    full_duplex&lt;br /&gt;
    full_duplex_no_echo&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== author-id ===&lt;br /&gt;
&lt;br /&gt;
This is an optional field that can be used to indicate the author of the page or other source.&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;author-id&amp;quot;: &amp;quot;john&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
=== response-data ===&lt;br /&gt;
&lt;br /&gt;
These fields should be used when the frame type is set to be a ''response-frame''. &lt;br /&gt;
&lt;br /&gt;
There are two main sections, ''response-data'' and ''response-action''. Below is an example of a response frame used for the Telstar weather page. The frame is created in the normal way using ''markup'' or ''edit.tf''. In this example the text ''Town/Cty'' has been positioned near the centre of the page. Immediately to the right of this is a field for the user to enter either a Town or City, the ''response-data'' section defines that field. Once the user submits the frame the section ''response-action'' determines what happens. In the example here a binary file (''telstar-openweather-linux-amd64''), stored in the containers volume directory is executed with a single argument (''myopenweatherapikey''). Note that the ''post-action-frame'' is set to 290b, in this example frame 290b is dynamically generated by the binary file ''telstar-openweather-linux-amd64'' and contains the weather forecast.&lt;br /&gt;
&lt;br /&gt;
Full details of how to implement response frames are detailed in the section [[Implementing Response Frames]].&lt;br /&gt;
    &amp;quot;response-data&amp;quot;: {&lt;br /&gt;
        &amp;quot;response-fields&amp;quot;: [&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;vpos&amp;quot;: 8,&lt;br /&gt;
                &amp;quot;hpos&amp;quot;: 4,&lt;br /&gt;
                &amp;quot;required&amp;quot;: true,&lt;br /&gt;
                &amp;quot;length&amp;quot;: 16,&lt;br /&gt;
                &amp;quot;type&amp;quot;: &amp;quot;alphanumeric&amp;quot;,&lt;br /&gt;
                &amp;quot;auto-submit&amp;quot;: false,&lt;br /&gt;
                &amp;quot;password&amp;quot;: false&lt;br /&gt;
            }&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;response-action&amp;quot;: {&lt;br /&gt;
            &amp;quot;exec&amp;quot;: &amp;quot;/opt/telstar/volume/telstar-openweather-linux-amd64&amp;quot;,&lt;br /&gt;
            &amp;quot;args&amp;quot;: [&lt;br /&gt;
                &amp;quot;myopenweatherapikey&amp;quot;&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;post-action-frame&amp;quot;: {&lt;br /&gt;
                &amp;quot;page-no&amp;quot;: 290,&lt;br /&gt;
                &amp;quot;frame-id&amp;quot;: &amp;quot;c&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
=== navmessage-select ===&lt;br /&gt;
&lt;br /&gt;
Allows the ''navigation'' system message to be customised at frame level. In most cases this can be left blank in order that the system default is used instead, see [[Configuration Options]].&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;navmessage-select&amp;quot;: &amp;quot;[B][n][Y]Select item or[W]*page# : [_+]&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
=== navmessage-notfound ===&lt;br /&gt;
&lt;br /&gt;
Allows the ''not found'' system message to be customised at frame level. In most cases this can be left blank in order that the system default is used instead, see [[Configuration Options]].&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;navmessage-notfound&amp;quot;: &amp;quot;[B][n][Y]Page not Found :[W]&amp;quot;&lt;/div&gt;</summary>
		<author><name>John</name></author>
	</entry>
	<entry>
		<id>https://wiki.glasstty.com/index.php?title=Frames&amp;diff=330</id>
		<title>Frames</title>
		<link rel="alternate" type="text/html" href="https://wiki.glasstty.com/index.php?title=Frames&amp;diff=330"/>
		<updated>2022-04-24T19:24:19Z</updated>

		<summary type="html">&lt;p&gt;John: /* redirect */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;As is typical with interactive videotex systems, pages are numbered from 0 to 999999999 and consist of one or more frames with the suffix a-z, for example the first frame for page 200 would be 200a, the second 200b and so on (see [[Routing]]) for more details). These frames are stored within TELSTAR's database as ''JSON'' objects (see https://www.json.org/) and uploaded to Telstar using a simple command line utility.&lt;br /&gt;
&lt;br /&gt;
The Telstar utility program simply interacts with the Telstar API which is a restful API. This can be used directly by any software making it simple to programitically manage pages and routing information.&lt;br /&gt;
&lt;br /&gt;
Frames are defined in JSON. The simplest frame that can be viewed on TELSTAR would be as follows. This would create a simple information frame with some flashing content. In this example [[Markup]] has been used within the content, however, other content types can be used including edi.tf urls, see below.&lt;br /&gt;
&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;pid&amp;quot;: {&lt;br /&gt;
        &amp;quot;page-no&amp;quot;: 101,&lt;br /&gt;
        &amp;quot;frame-id&amp;quot;: &amp;quot;a&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;visible&amp;quot;: true,&lt;br /&gt;
      &amp;quot;content&amp;quot;: {&lt;br /&gt;
        &amp;quot;data&amp;quot;: &amp;quot;[D]This is page[F]101a&amp;quot;,&lt;br /&gt;
         &amp;quot;type&amp;quot;: &amp;quot;markup&amp;quot;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Shown below is a more complete example of a JSON defined frame. With this particular frame, the actual viewdata content has been created using the editor at http://edit.tf, this can be seen in the ''content.data'' and ''content.type'' keys. The example below is a simple information page with some simple routing (see [[Routing]]). Clicking the ''content.data'' link, or pasteing the value into a browser will show the page and allow it to be edited. It is not necessary to use the http://edit.tf editor, this is just one possible option.&lt;br /&gt;
&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;pid&amp;quot;: {&lt;br /&gt;
        &amp;quot;page-no&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;frame-id&amp;quot;: &amp;quot;a&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;visible&amp;quot;: true,&lt;br /&gt;
      &amp;quot;frame-type&amp;quot;: &amp;quot;information&amp;quot;,&lt;br /&gt;
      &amp;quot;content&amp;quot;: {&lt;br /&gt;
        &amp;quot;data&amp;quot;: &amp;quot;http://edit.tf/#0:QIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQMMKAbNw6dyCTuyZfCBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgKJEiRIkSJEiRIkSJEiRIkSJEiRIkSJEiRIkSJEiRIkSJEiRAxQR4s6LSgzEEmdUi0otOogkzo0-lNg1JM-cCg8unNYgQIASBBj67OnXllWIMu7pl5dMOndty7uixBoy4dnTQsQIECBAgBIEHfLh2dNCDDuyINmnNl59POzKuQIECBAgQIECBAgQIECBAyQTotemggzoiCvFg1JEWkCnYemnfuw7EGHdkQIECBAgQIASBBp3dMvLdh6ad-7DsQbsvfmgw7siDvlw9NGXkuQIECBAgQM0EKrTkzotOmgkzo0-lNg1JM-cCh79vDDu8oMO7IgQIECAEgQYuvPTuy8-aDdl781wM6EjVKcVBMw9MvPogoctOPLzQIEDRBHn1otKdNizqiCTOjT6U2DUkz5wKlvw5OaxByw6dixAgBIEGHdkQUMPLZpw7cu7ouQIECBAgQIECBAgQIECBAgQIECBA2QR4NSLXg2UFOLSrSYcWmCnWKkWYsQVIsWNBsLEEOHMaIASBBh3ZEHTRlQQ9-zfz54diCHh7ZUGHJ2y7unXllXIECBAgQN0EifMkxINmmCqcsPbLsQYd2RBI37NOTD5QbsvfmuQIECBA4CHQc2TDpT50WogcMGCAScgoOnLTi69MqDpvQdNGnmgQIAaBBzy8u2nHlQd9PTQgqZdmXnvzdO-HllQYd2RBt38sq5AgQOQ0yfHQT40ZYgp2adSLNQSZ0aegTIKkWnUQUIMeLTQIECAokSJEiRIkSJEiRIkSJEiRIkSJEiRIkSJEiRIkSJEiRIkSJEFeLBqSItJBGn0osODTqIBIM6EQIEFDDnyoFTJywvoECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECA&amp;quot;,&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;edit.tf&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;routing-table&amp;quot;: [0,1,11,3,400,5,6,7,800,9,0],&lt;br /&gt;
      &amp;quot;cursor&amp;quot;: false,&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
== Adding Frames to the System ==&lt;br /&gt;
&lt;br /&gt;
Frames can be added to the system using either the Telstar API.&lt;br /&gt;
&lt;br /&gt;
The Telstar API, in conjunction with the cross platform Telstar Util software, provides a simple method of creating and managing pages.&lt;br /&gt;
&lt;br /&gt;
The API can be used to retrieve and update frames and configuring routing. The API is a restful API that uses the GET, PUT, POST and DELETE HTTP methods and as such can be used from any application.&lt;br /&gt;
&lt;br /&gt;
Data is passed to and from the API in JSON format, making the system very simple to use in any programming language. The whole API could be used without any programming at all by using a command line utility such as CURL.&lt;br /&gt;
&lt;br /&gt;
''Further details of the Telstar API can be found in the section [[The Telstar API]].''&lt;br /&gt;
&lt;br /&gt;
== Adding Content with the Edit.tf editor ==&lt;br /&gt;
&lt;br /&gt;
There are several ways to add content to a page. One of the easiest is to create the page in an editor such as http://edit.tf.&lt;br /&gt;
&lt;br /&gt;
The JSON file would look something like the one showm below. Note that the content type is set to editf and the content data contains the edit.tf url.&lt;br /&gt;
&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;pid&amp;quot;: {&lt;br /&gt;
            &amp;quot;page-no&amp;quot;: 101,&lt;br /&gt;
            &amp;quot;frame-id&amp;quot;: &amp;quot;a&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;visible&amp;quot;: true,&lt;br /&gt;
        &amp;quot;frame-type&amp;quot;: &amp;quot;information&amp;quot;,&lt;br /&gt;
        &amp;quot;content&amp;quot;: {&lt;br /&gt;
            &amp;quot;data&amp;quot;: &amp;quot;http://edit.tf/#0:QIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQICn_OmTJkSJApUqVKlSpUlcHApiTJkyZEiRIkyZMmTIkSJFmKf3JX58____RBg-fPnzog__2iBBo-fNX9qgQcOHDh8-fGiAp_zFf______2v7_____7X___oEGr__Qa0ur_________QoCn9ywK__6D__a__7dH__tf___1QIv_9AiQIkaPX_bo0aMpiKf_-Yr__oP_9r__tUH_-1____9og__yjnz5cldX9qUc-fPkp__uSv_-g__2v_-1Qf_7X__aIv____KZv_dIV__2pTN___yn__mK___z__a____5__tf_9qgVf__8o5_vWJX__alHP___Kf_7kr____6dBr_____-h__2qBBr__ymbPnSFf69CUzf__8pnz5iq9ejRoECBWvXr0KBGjQYOHBHz4cECBAgwcCily7__yqDhw4ePnzogQeP7RAg0fPiBB___9X___QYPH___-sCmb__KoP________3B__tUCDV__tUH___1f36XB-_______KOf_8qgRo__9B__v9X___QINX___Qav__B8-NNX_-jR___8pm__ymYrq______h_odX9qg1f___7q__9X_-h1f_5TBgwYM37__KOSur-_Ro0Pr_8_f_qDV_b___r__1f_6D___lFKlSpUu__8pmK_v7VAgwf______tNX9r______V__oP__-gQaPnwpm__yqDB__tUCD__QIEG___1f2qL____9X_-g____z5-__ymb__KoNX_-lQKl6VAgQav6_V__oNf___1f2qBX_____9-hKOf_8qgVJ0JRw4cOPLkqiQoESNGgVL0aFEjQoECJGjRoymDNm__ymTJkzZv3_____-3bt27du3Thw8efPnz58-fPnz58-fP___QIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECA&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;edit.tf&amp;quot;&lt;br /&gt;
        }    &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
== Adding Content using Markup ==&lt;br /&gt;
&lt;br /&gt;
Content can be added directly to the JSON file using a very simple markup. For example consider the following frame definition.&lt;br /&gt;
&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;pid&amp;quot;: {&lt;br /&gt;
            &amp;quot;page-no&amp;quot;: 101,&lt;br /&gt;
            &amp;quot;frame-id&amp;quot;: &amp;quot;a&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;visible&amp;quot;: true,&lt;br /&gt;
        &amp;quot;frame-type&amp;quot;: &amp;quot;information&amp;quot;,&lt;br /&gt;
        &amp;quot;title&amp;quot;: {&lt;br /&gt;
            &amp;quot;data&amp;quot;: &amp;quot;[D]Welcome\r\n\r\n&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;markup&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;content&amp;quot;: {&lt;br /&gt;
            &amp;quot;data&amp;quot;: &amp;quot;[Y]Hello[C]Telstar[M]World&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;markup&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
This frame uses markup in the title and the content, The title is specified as [D]ouble height and the three words used in the content are coloured yellow, cyan and magenta respectively.&lt;br /&gt;
&lt;br /&gt;
Full details of markup can be found in the [[Markup]] section.&lt;br /&gt;
&lt;br /&gt;
== Complete Frame Description ==&lt;br /&gt;
&lt;br /&gt;
The frame below is a standard information page from the TELSTAR system shown in its JSON format. It represents the first frame of page 9. Taking this frame as an example, a description of the fields and their meaning is decribed below.&lt;br /&gt;
&lt;br /&gt;
''The full json schema can be found [[Frame Schema|here]].''&lt;br /&gt;
&lt;br /&gt;
     {&lt;br /&gt;
    	&amp;quot;pid&amp;quot;: {&lt;br /&gt;
    		&amp;quot;page-no&amp;quot;: 9,&lt;br /&gt;
    		&amp;quot;frame-id&amp;quot;: &amp;quot;a&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;visible&amp;quot;: true,&lt;br /&gt;
        &amp;quot;header-text&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;cost&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;frame-type&amp;quot;: &amp;quot;information&amp;quot;,&lt;br /&gt;
        &amp;quot;redirect&amp;quot;: {&lt;br /&gt;
            &amp;quot;page-no&amp;quot;: 0,&lt;br /&gt;
            &amp;quot;frame-id&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;content&amp;quot;: {&lt;br /&gt;
            &amp;quot;data&amp;quot;: &amp;quot;https://edit.tf/#0:QIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgc4UCBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQICixYsWLFixYsWLFixYsWLFixYsWLFixYsWLFixYsWLFixYgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAxQIIs6PJnRYtKTOjoKkWnUQUIMeLTQIECBAgQIECBAgQIEDRAgp2adSLNQSZ0aegQIECBAgQIECBAgQIECBAgQIECBAgQNkCCPBqRa8GygpxaVaTDi00CBAgQIECBAgQIECBAgQIECBA4QIIc-dUgw6iCJFqQZMymgQIECBAgQIECBAgQIECBAgQIEDlAgmT46CfOQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQMECCZPjoJ8aMgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQICixYsWLFixYsWLFixYsWLFixYsWLFixYsWLFixYsWLFixYgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECAFUQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgBVAMUNMQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIAVQDFDTAlMPUQIECBAgQIECBAgQIECBAgQIECBAgQIECAFUAxQ0wJTD1A0EHSQIECBAgQIECBAgQIECBAgQIECBAgQIECANMCUw9QNBB0kCBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECAPUDQQdJAgQIECBAgQIECBAgQIECAosWLFixYsWLFixYsQIECAHSQIECAosWLFixYsWLFixYsWIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECA&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;edit.tf'&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;title&amp;quot;: {&lt;br /&gt;
            &amp;quot;data&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
            &amp;quot;merge-data&amp;quot;: []&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;routing-table&amp;quot;: [&lt;br /&gt;
            90,&lt;br /&gt;
            91,&lt;br /&gt;
            92,&lt;br /&gt;
            93,&lt;br /&gt;
            94,&lt;br /&gt;
            95,&lt;br /&gt;
            96,&lt;br /&gt;
            97,&lt;br /&gt;
            98,&lt;br /&gt;
            990,&lt;br /&gt;
            0&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;cursor&amp;quot;: false,&lt;br /&gt;
        &amp;quot;connection&amp;quot;: {&lt;br /&gt;
            &amp;quot;address&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
            &amp;quot;mode&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
            &amp;quot;port&amp;quot;: 0&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;author-id&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;response-data&amp;quot;: {&lt;br /&gt;
            &amp;quot;responses&amp;quot;: null,&lt;br /&gt;
            &amp;quot;response-action&amp;quot;: {&lt;br /&gt;
                &amp;quot;exec&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
                &amp;quot;args&amp;quot;: null,&lt;br /&gt;
                &amp;quot;post-action-frame&amp;quot;: {&lt;br /&gt;
                    &amp;quot;page-no&amp;quot;: 0,&lt;br /&gt;
                    &amp;quot;frame-id&amp;quot;: ''&lt;br /&gt;
                },&lt;br /&gt;
                &amp;quot;post-cancel-frame&amp;quot;: {&lt;br /&gt;
                    &amp;quot;page-no&amp;quot;: 0,&lt;br /&gt;
                    &amp;quot;frame-id&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;navmessage-select&amp;quot;: &amp;quot;[B][n][Y]Select item or[W]*page# : [_+]&amp;quot;,&lt;br /&gt;
        &amp;quot;navmessage-notfound&amp;quot;: &amp;quot;[B][n][Y]Page not Found :[W]&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
=== pid ===&lt;br /&gt;
&lt;br /&gt;
Specifies the page number and frame id for the frame.&lt;br /&gt;
&lt;br /&gt;
    	&amp;quot;pid&amp;quot;: {&lt;br /&gt;
    		&amp;quot;page-no&amp;quot;: 9,&lt;br /&gt;
    		&amp;quot;frame-id&amp;quot;: &amp;quot;a&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
&lt;br /&gt;
=== visible ===&lt;br /&gt;
&lt;br /&gt;
When set to false, the frame will not be accessible and will return the ''not found'' system message to the user if an attempt is made to access it.&lt;br /&gt;
&lt;br /&gt;
      &amp;quot;visible&amp;quot;: true,&lt;br /&gt;
&lt;br /&gt;
=== header-text ===&lt;br /&gt;
&lt;br /&gt;
Allows the default header text to be ovwerridden at frame level. If this is left blank the default header will be used, see configuration.&lt;br /&gt;
&lt;br /&gt;
      &amp;quot;header-text&amp;quot;: &amp;quot;[Y]MICRONETn 800 (C)&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
=== cost ===&lt;br /&gt;
&lt;br /&gt;
      &amp;quot;cost&amp;quot;: 0,&lt;br /&gt;
&lt;br /&gt;
=== frame-type ===&lt;br /&gt;
&lt;br /&gt;
The API supports the following frame types ''initial'', ''mainindex'', ''information'', ''exit'', ''gateway'', ''test'' and ''response''.&lt;br /&gt;
&lt;br /&gt;
      &amp;quot;frame-type&amp;quot;: &amp;quot;information&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
* '''initial''': This frame type is used on the start page, see [[Configuration Options]]. Typically only one of these frames would exist within a system.&lt;br /&gt;
* '''mainindex''': This frame type is used on the main index page. , see [[Configuration Options]]. Only one of these frames should exist within a system.&lt;br /&gt;
* '''information''': This frame type is used for all normal content frames.&lt;br /&gt;
* '''exit''': This frame type is used for an exit page, any number of exit pages can be defined. When an exit page is rendered it will close the connection.&lt;br /&gt;
* '''gateway''': This page type is used to define a gateway page and is used in conjunction with the connection element (see below).&lt;br /&gt;
* '''test''': This page type indicates a test page and prevents navigation and system messages from being shown. this is typically used for frames that need to use the whole display such as 'test cards' etc.&lt;br /&gt;
* '''telesoftware''': Telesoftware frames (see [[Telesoftware]]).&lt;br /&gt;
* '''response''': This frame type is used for response frames. See [[Implementing Response Frames]].&lt;br /&gt;
* '''system''': Reserved for use internally.&lt;br /&gt;
* '''exception''': Reserved for use internally.&lt;br /&gt;
&lt;br /&gt;
=== redirect ===&lt;br /&gt;
 &lt;br /&gt;
If set it simply means that the user is redirected to the specified frame. This can be a useful alternative form of navigation to the routing table.&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;redirect&amp;quot;: {&lt;br /&gt;
            &amp;quot;page-no&amp;quot;: 9,&lt;br /&gt;
            &amp;quot;frame-id&amp;quot;: &amp;quot;a&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
&lt;br /&gt;
The following is an example of a complete redirect page.&lt;br /&gt;
&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;PID&amp;quot;: {&lt;br /&gt;
            &amp;quot;page-no&amp;quot;: 9,&lt;br /&gt;
            &amp;quot;frame-id&amp;quot;: &amp;quot;a&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;redirect&amp;quot;: {&lt;br /&gt;
            &amp;quot;page-no&amp;quot;: 9,&lt;br /&gt;
            &amp;quot;frame-id&amp;quot;: &amp;quot;a&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;visible&amp;quot;: true&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
=== content ===&lt;br /&gt;
&lt;br /&gt;
These elements define the content. The example below shows the content.type to be an edit.tf url. The available types are shown below.&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;content&amp;quot;: {&lt;br /&gt;
            &amp;quot;data&amp;quot;: &amp;quot;https://edit.tf/#0:QIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgc4UCBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQICixYsWLFixYsWLFixYsWLFixYsWLFixYsWLFixYsWLFixYgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAxQIIs6PJnRYtKTOjoKkWnUQUIMeLTQIECBAgQIECBAgQIEDRAgp2adSLNQSZ0aegQIECBAgQIECBAgQIECBAgQIECBAgQNkCCPBqRa8GygpxaVaTDi00CBAgQIECBAgQIECBAgQIECBA4QIIc-dUgw6iCJFqQZMymgQIECBAgQIECBAgQIECBAgQIEDlAgmT46CfOQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQMECCZPjoJ8aMgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQICixYsWLFixYsWLFixYsWLFixYsWLFixYsWLFixYsWLFixYgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECAFUQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgBVAMUNMQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIAVQDFDTAlMPUQIECBAgQIECBAgQIECBAgQIECBAgQIECAFUAxQ0wJTD1A0EHSQIECBAgQIECBAgQIECBAgQIECBAgQIECANMCUw9QNBB0kCBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECAPUDQQdJAgQIECBAgQIECBAgQIECAosWLFixYsWLFixYsQIECAHSQIECAosWLFixYsWLFixYsWIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECA&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;edit.tf'&lt;br /&gt;
        },&lt;br /&gt;
&lt;br /&gt;
Content types:&lt;br /&gt;
&lt;br /&gt;
* '''edit.tf''': If set, then the content will be treated as an edit.tf url. This is converted to RawV before being rendered.&lt;br /&gt;
* '''markup''': If set, then the content will be treated as ''markup'' content. Full details of ''markup'' can be found in the section [[Markup]]&lt;br /&gt;
* '''rawV''': If set, then the content will be treated as raw videotex data. This is 7bit (00-7F) videotex format with control chars between 00-1F and escaped codes for alpha and graphic attributes. Ideally rows should have any trailing spaces removed and replaced with with a CR/LF combination. This will be rendered as is.&lt;br /&gt;
* '''rawT''': If set, then the content will be treated as raw teletex data. This is a 24 x 40 block of 7 bits chars (960 chars) in Teletext format (range 00-7F). This format is used internally when manipulating page data. It will be converted to RawV before being rendered.&lt;br /&gt;
&lt;br /&gt;
=== title ===&lt;br /&gt;
&lt;br /&gt;
This sets the title of the page. In many cases this may be left blank with all of the content specified in the ''content'' section (see above) however, the ''title'' section gives additional flexibility when creating frames.&lt;br /&gt;
&lt;br /&gt;
Values for ''title-type'' are the same as defined for the content section, however, if the type ''edit-tf'' is used then only the first four (default) lines of the edit.tf defined page are used. &lt;br /&gt;
&lt;br /&gt;
Separating title from content in this way allows logos and header sections to be created for the title whilst using markup for the main content or visa-versa. &lt;br /&gt;
&lt;br /&gt;
==== Example 1 ====&lt;br /&gt;
&lt;br /&gt;
In thi example the fields are blank meaning that only the data in the ''content'' section is displayed.&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;title&amp;quot;: {&lt;br /&gt;
            &amp;quot;data&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
            &amp;quot;merge-data&amp;quot;: []&lt;br /&gt;
        },&lt;br /&gt;
&lt;br /&gt;
==== Example 2 ====&lt;br /&gt;
&lt;br /&gt;
In this example, the top 4 lines of the edit.tf content is displayed at the top of the page.&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;title&amp;quot;: {&lt;br /&gt;
            &amp;quot;data&amp;quot;: &amp;quot;https://edit.tf/#0:QIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECAvobotqBX__oECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIC_9AgQIEGv-gQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgL_0Cj4kQav6BAgQIECBAgQIECBAgQIECBAgQIECBAgQIECAuq64P6Dx__oECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECA&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;edit.tf&amp;quot;,&lt;br /&gt;
            &amp;quot;merge-data&amp;quot;: []&lt;br /&gt;
        },&lt;br /&gt;
&lt;br /&gt;
To take the top 5 lines, the ''type'' field can be extended as follows.&lt;br /&gt;
&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;edit.tf,5&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Note that this extended form of ''type'' only applies to edit.tf types.&lt;br /&gt;
&lt;br /&gt;
==== Example 3 ====&lt;br /&gt;
&lt;br /&gt;
The merge data field can be used to add ''layers'' of markup data to the title area. For example the example above shows the Guardian logo. To add some alphagraphics text to this, an additional layer could be used e.g.&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;title&amp;quot;: {&lt;br /&gt;
            &amp;quot;data&amp;quot;: &amp;quot;https://edit.tf/#0:QIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECAvobotqBX__oECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIC_9AgQIEGv-gQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgL_0Cj4kQav6BAgQIECBAgQIECBAgQIECBAgQIECBAgQIECAuq64P6Dx__oECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECA&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;edit.tf,5&amp;quot;,&lt;br /&gt;
            &amp;quot;merge-data&amp;quot;: [&lt;br /&gt;
                &amp;quot;[w[             UK News]]&amp;quot;&lt;br /&gt;
            ]&lt;br /&gt;
        },&lt;br /&gt;
&lt;br /&gt;
Note that any number of layers can be added, however, the merge layer must be defined as markup.&lt;br /&gt;
&lt;br /&gt;
=== routing table ===&lt;br /&gt;
&lt;br /&gt;
The routing table defines which pages are navigated to when a user presses a key whilst viewing the frame. The table has 11 entries with the first 10 representing the keys 0-9, the final entry refers to the ''hash'' (return) key.&lt;br /&gt;
&lt;br /&gt;
The example below shows the default routing table for frame 9a. If the user is viewing this frame and presses 1 the frame 91a will be loaded, assuming it exists. Pressing the ''hash'' (return) key will take the user back to frame 0a, the main index.&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;routing-table&amp;quot;: [&lt;br /&gt;
            90,&lt;br /&gt;
            91,&lt;br /&gt;
            92,&lt;br /&gt;
            93,&lt;br /&gt;
            94,&lt;br /&gt;
            95,&lt;br /&gt;
            96,&lt;br /&gt;
            97,&lt;br /&gt;
            98,&lt;br /&gt;
            99,&lt;br /&gt;
            0&lt;br /&gt;
        ],&lt;br /&gt;
&lt;br /&gt;
=== cursor ===&lt;br /&gt;
&lt;br /&gt;
This element determines whether a cursor is shown on the page. Typically a cursor would only be shown on response frames.&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;cursor&amp;quot;: false,&lt;br /&gt;
        &lt;br /&gt;
=== connection ===&lt;br /&gt;
&lt;br /&gt;
This elements specifies the connection object used for gateway pages.&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;connection&amp;quot;: {&lt;br /&gt;
            &amp;quot;address&amp;quot;: &amp;quot;fish.ccl4.org&amp;quot;,&lt;br /&gt;
            &amp;quot;mode&amp;quot;: &amp;quot;viewdata&amp;quot;,&lt;br /&gt;
            &amp;quot;port&amp;quot;: 23&lt;br /&gt;
        },&lt;br /&gt;
&lt;br /&gt;
The values for ''address and port'' represent the endpoint of the system being accessed and the value for ''mode'' determines how the system is accessed, the options are:&lt;br /&gt;
&lt;br /&gt;
    viewdata&lt;br /&gt;
    full_duplex&lt;br /&gt;
    full_duplex_no_echo&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== author-id ===&lt;br /&gt;
&lt;br /&gt;
This is an optional field that can be used to indicate the author of the page or other source.&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;author-id&amp;quot;: &amp;quot;john&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
=== response-data ===&lt;br /&gt;
&lt;br /&gt;
These fields should be used when the frame type is set to be a ''response-frame''. &lt;br /&gt;
&lt;br /&gt;
There are two main sections, ''response-data'' and ''response-action''. Below is an example of a response frame used for the Telstar weather page. The frame is created in the normal way using ''markup'' or ''edit.tf''. In this example the text ''Town/Cty'' has been positioned near the centre of the page. Immediately to the right of this is a field for the user to enter either a Town or City, the ''response-data'' section defines that field. Once the user submits the frame the section ''response-action'' determines what happens. In the example here a binary file (''telstar-openweather-linux-amd64''), stored in the containers volume directory is executed with a single argument (''myopenweatherapikey''). Note that the ''post-action-frame'' is set to 290b, in this example frame 290b is dynamically generated by the binary file ''telstar-openweather-linux-amd64'' and contains the weather forecast.&lt;br /&gt;
&lt;br /&gt;
Full details of how to implement response frames are detailed in the section [[Implementing Response Frames]].&lt;br /&gt;
    &amp;quot;response-data&amp;quot;: {&lt;br /&gt;
        &amp;quot;response-fields&amp;quot;: [&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;vpos&amp;quot;: 8,&lt;br /&gt;
                &amp;quot;hpos&amp;quot;: 4,&lt;br /&gt;
                &amp;quot;required&amp;quot;: true,&lt;br /&gt;
                &amp;quot;length&amp;quot;: 16,&lt;br /&gt;
                &amp;quot;type&amp;quot;: &amp;quot;alphanumeric&amp;quot;,&lt;br /&gt;
                &amp;quot;auto-submit&amp;quot;: false,&lt;br /&gt;
                &amp;quot;password&amp;quot;: false&lt;br /&gt;
            }&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;response-action&amp;quot;: {&lt;br /&gt;
            &amp;quot;exec&amp;quot;: &amp;quot;/opt/telstar/volume/telstar-openweather-linux-amd64&amp;quot;,&lt;br /&gt;
            &amp;quot;args&amp;quot;: [&lt;br /&gt;
                &amp;quot;myopenweatherapikey&amp;quot;&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;post-action-frame&amp;quot;: {&lt;br /&gt;
                &amp;quot;page-no&amp;quot;: 290,&lt;br /&gt;
                &amp;quot;frame-id&amp;quot;: &amp;quot;c&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
=== navmessage-select ===&lt;br /&gt;
&lt;br /&gt;
Allows the ''navigation'' system message to be customised at frame level. In most cases this can be left blank in order that the system default is used instead, see [[Configuration Options]].&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;navmessage-select&amp;quot;: &amp;quot;[B][n][Y]Select item or[W]*page# : [_+]&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
=== navmessage-notfound ===&lt;br /&gt;
&lt;br /&gt;
Allows the ''not found'' system message to be customised at frame level. In most cases this can be left blank in order that the system default is used instead, see [[Configuration Options]].&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;navmessage-notfound&amp;quot;: &amp;quot;[B][n][Y]Page not Found :[W]&amp;quot;&lt;/div&gt;</summary>
		<author><name>John</name></author>
	</entry>
	<entry>
		<id>https://wiki.glasstty.com/index.php?title=Frames&amp;diff=329</id>
		<title>Frames</title>
		<link rel="alternate" type="text/html" href="https://wiki.glasstty.com/index.php?title=Frames&amp;diff=329"/>
		<updated>2022-04-24T19:23:21Z</updated>

		<summary type="html">&lt;p&gt;John: /* redirect */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;As is typical with interactive videotex systems, pages are numbered from 0 to 999999999 and consist of one or more frames with the suffix a-z, for example the first frame for page 200 would be 200a, the second 200b and so on (see [[Routing]]) for more details). These frames are stored within TELSTAR's database as ''JSON'' objects (see https://www.json.org/) and uploaded to Telstar using a simple command line utility.&lt;br /&gt;
&lt;br /&gt;
The Telstar utility program simply interacts with the Telstar API which is a restful API. This can be used directly by any software making it simple to programitically manage pages and routing information.&lt;br /&gt;
&lt;br /&gt;
Frames are defined in JSON. The simplest frame that can be viewed on TELSTAR would be as follows. This would create a simple information frame with some flashing content. In this example [[Markup]] has been used within the content, however, other content types can be used including edi.tf urls, see below.&lt;br /&gt;
&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;pid&amp;quot;: {&lt;br /&gt;
        &amp;quot;page-no&amp;quot;: 101,&lt;br /&gt;
        &amp;quot;frame-id&amp;quot;: &amp;quot;a&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;visible&amp;quot;: true,&lt;br /&gt;
      &amp;quot;content&amp;quot;: {&lt;br /&gt;
        &amp;quot;data&amp;quot;: &amp;quot;[D]This is page[F]101a&amp;quot;,&lt;br /&gt;
         &amp;quot;type&amp;quot;: &amp;quot;markup&amp;quot;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Shown below is a more complete example of a JSON defined frame. With this particular frame, the actual viewdata content has been created using the editor at http://edit.tf, this can be seen in the ''content.data'' and ''content.type'' keys. The example below is a simple information page with some simple routing (see [[Routing]]). Clicking the ''content.data'' link, or pasteing the value into a browser will show the page and allow it to be edited. It is not necessary to use the http://edit.tf editor, this is just one possible option.&lt;br /&gt;
&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;pid&amp;quot;: {&lt;br /&gt;
        &amp;quot;page-no&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;frame-id&amp;quot;: &amp;quot;a&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;visible&amp;quot;: true,&lt;br /&gt;
      &amp;quot;frame-type&amp;quot;: &amp;quot;information&amp;quot;,&lt;br /&gt;
      &amp;quot;content&amp;quot;: {&lt;br /&gt;
        &amp;quot;data&amp;quot;: &amp;quot;http://edit.tf/#0:QIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQMMKAbNw6dyCTuyZfCBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgKJEiRIkSJEiRIkSJEiRIkSJEiRIkSJEiRIkSJEiRIkSJEiRAxQR4s6LSgzEEmdUi0otOogkzo0-lNg1JM-cCg8unNYgQIASBBj67OnXllWIMu7pl5dMOndty7uixBoy4dnTQsQIECBAgBIEHfLh2dNCDDuyINmnNl59POzKuQIECBAgQIECBAgQIECBAyQTotemggzoiCvFg1JEWkCnYemnfuw7EGHdkQIECBAgQIASBBp3dMvLdh6ad-7DsQbsvfmgw7siDvlw9NGXkuQIECBAgQM0EKrTkzotOmgkzo0-lNg1JM-cCh79vDDu8oMO7IgQIECAEgQYuvPTuy8-aDdl781wM6EjVKcVBMw9MvPogoctOPLzQIEDRBHn1otKdNizqiCTOjT6U2DUkz5wKlvw5OaxByw6dixAgBIEGHdkQUMPLZpw7cu7ouQIECBAgQIECBAgQIECBAgQIECBA2QR4NSLXg2UFOLSrSYcWmCnWKkWYsQVIsWNBsLEEOHMaIASBBh3ZEHTRlQQ9-zfz54diCHh7ZUGHJ2y7unXllXIECBAgQN0EifMkxINmmCqcsPbLsQYd2RBI37NOTD5QbsvfmuQIECBA4CHQc2TDpT50WogcMGCAScgoOnLTi69MqDpvQdNGnmgQIAaBBzy8u2nHlQd9PTQgqZdmXnvzdO-HllQYd2RBt38sq5AgQOQ0yfHQT40ZYgp2adSLNQSZ0aegTIKkWnUQUIMeLTQIECAokSJEiRIkSJEiRIkSJEiRIkSJEiRIkSJEiRIkSJEiRIkSJEFeLBqSItJBGn0osODTqIBIM6EQIEFDDnyoFTJywvoECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECA&amp;quot;,&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;edit.tf&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;routing-table&amp;quot;: [0,1,11,3,400,5,6,7,800,9,0],&lt;br /&gt;
      &amp;quot;cursor&amp;quot;: false,&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
== Adding Frames to the System ==&lt;br /&gt;
&lt;br /&gt;
Frames can be added to the system using either the Telstar API.&lt;br /&gt;
&lt;br /&gt;
The Telstar API, in conjunction with the cross platform Telstar Util software, provides a simple method of creating and managing pages.&lt;br /&gt;
&lt;br /&gt;
The API can be used to retrieve and update frames and configuring routing. The API is a restful API that uses the GET, PUT, POST and DELETE HTTP methods and as such can be used from any application.&lt;br /&gt;
&lt;br /&gt;
Data is passed to and from the API in JSON format, making the system very simple to use in any programming language. The whole API could be used without any programming at all by using a command line utility such as CURL.&lt;br /&gt;
&lt;br /&gt;
''Further details of the Telstar API can be found in the section [[The Telstar API]].''&lt;br /&gt;
&lt;br /&gt;
== Adding Content with the Edit.tf editor ==&lt;br /&gt;
&lt;br /&gt;
There are several ways to add content to a page. One of the easiest is to create the page in an editor such as http://edit.tf.&lt;br /&gt;
&lt;br /&gt;
The JSON file would look something like the one showm below. Note that the content type is set to editf and the content data contains the edit.tf url.&lt;br /&gt;
&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;pid&amp;quot;: {&lt;br /&gt;
            &amp;quot;page-no&amp;quot;: 101,&lt;br /&gt;
            &amp;quot;frame-id&amp;quot;: &amp;quot;a&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;visible&amp;quot;: true,&lt;br /&gt;
        &amp;quot;frame-type&amp;quot;: &amp;quot;information&amp;quot;,&lt;br /&gt;
        &amp;quot;content&amp;quot;: {&lt;br /&gt;
            &amp;quot;data&amp;quot;: &amp;quot;http://edit.tf/#0:QIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQICn_OmTJkSJApUqVKlSpUlcHApiTJkyZEiRIkyZMmTIkSJFmKf3JX58____RBg-fPnzog__2iBBo-fNX9qgQcOHDh8-fGiAp_zFf______2v7_____7X___oEGr__Qa0ur_________QoCn9ywK__6D__a__7dH__tf___1QIv_9AiQIkaPX_bo0aMpiKf_-Yr__oP_9r__tUH_-1____9og__yjnz5cldX9qUc-fPkp__uSv_-g__2v_-1Qf_7X__aIv____KZv_dIV__2pTN___yn__mK___z__a____5__tf_9qgVf__8o5_vWJX__alHP___Kf_7kr____6dBr_____-h__2qBBr__ymbPnSFf69CUzf__8pnz5iq9ejRoECBWvXr0KBGjQYOHBHz4cECBAgwcCily7__yqDhw4ePnzogQeP7RAg0fPiBB___9X___QYPH___-sCmb__KoP________3B__tUCDV__tUH___1f36XB-_______KOf_8qgRo__9B__v9X___QINX___Qav__B8-NNX_-jR___8pm__ymYrq______h_odX9qg1f___7q__9X_-h1f_5TBgwYM37__KOSur-_Ro0Pr_8_f_qDV_b___r__1f_6D___lFKlSpUu__8pmK_v7VAgwf______tNX9r______V__oP__-gQaPnwpm__yqDB__tUCD__QIEG___1f2qL____9X_-g____z5-__ymb__KoNX_-lQKl6VAgQav6_V__oNf___1f2qBX_____9-hKOf_8qgVJ0JRw4cOPLkqiQoESNGgVL0aFEjQoECJGjRoymDNm__ymTJkzZv3_____-3bt27du3Thw8efPnz58-fPnz58-fP___QIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECA&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;edit.tf&amp;quot;&lt;br /&gt;
        }    &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
== Adding Content using Markup ==&lt;br /&gt;
&lt;br /&gt;
Content can be added directly to the JSON file using a very simple markup. For example consider the following frame definition.&lt;br /&gt;
&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;pid&amp;quot;: {&lt;br /&gt;
            &amp;quot;page-no&amp;quot;: 101,&lt;br /&gt;
            &amp;quot;frame-id&amp;quot;: &amp;quot;a&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;visible&amp;quot;: true,&lt;br /&gt;
        &amp;quot;frame-type&amp;quot;: &amp;quot;information&amp;quot;,&lt;br /&gt;
        &amp;quot;title&amp;quot;: {&lt;br /&gt;
            &amp;quot;data&amp;quot;: &amp;quot;[D]Welcome\r\n\r\n&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;markup&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;content&amp;quot;: {&lt;br /&gt;
            &amp;quot;data&amp;quot;: &amp;quot;[Y]Hello[C]Telstar[M]World&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;markup&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
This frame uses markup in the title and the content, The title is specified as [D]ouble height and the three words used in the content are coloured yellow, cyan and magenta respectively.&lt;br /&gt;
&lt;br /&gt;
Full details of markup can be found in the [[Markup]] section.&lt;br /&gt;
&lt;br /&gt;
== Complete Frame Description ==&lt;br /&gt;
&lt;br /&gt;
The frame below is a standard information page from the TELSTAR system shown in its JSON format. It represents the first frame of page 9. Taking this frame as an example, a description of the fields and their meaning is decribed below.&lt;br /&gt;
&lt;br /&gt;
''The full json schema can be found [[Frame Schema|here]].''&lt;br /&gt;
&lt;br /&gt;
     {&lt;br /&gt;
    	&amp;quot;pid&amp;quot;: {&lt;br /&gt;
    		&amp;quot;page-no&amp;quot;: 9,&lt;br /&gt;
    		&amp;quot;frame-id&amp;quot;: &amp;quot;a&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;visible&amp;quot;: true,&lt;br /&gt;
        &amp;quot;header-text&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;cost&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;frame-type&amp;quot;: &amp;quot;information&amp;quot;,&lt;br /&gt;
        &amp;quot;redirect&amp;quot;: {&lt;br /&gt;
            &amp;quot;page-no&amp;quot;: 0,&lt;br /&gt;
            &amp;quot;frame-id&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;content&amp;quot;: {&lt;br /&gt;
            &amp;quot;data&amp;quot;: &amp;quot;https://edit.tf/#0:QIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgc4UCBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQICixYsWLFixYsWLFixYsWLFixYsWLFixYsWLFixYsWLFixYgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAxQIIs6PJnRYtKTOjoKkWnUQUIMeLTQIECBAgQIECBAgQIEDRAgp2adSLNQSZ0aegQIECBAgQIECBAgQIECBAgQIECBAgQNkCCPBqRa8GygpxaVaTDi00CBAgQIECBAgQIECBAgQIECBA4QIIc-dUgw6iCJFqQZMymgQIECBAgQIECBAgQIECBAgQIEDlAgmT46CfOQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQMECCZPjoJ8aMgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQICixYsWLFixYsWLFixYsWLFixYsWLFixYsWLFixYsWLFixYgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECAFUQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgBVAMUNMQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIAVQDFDTAlMPUQIECBAgQIECBAgQIECBAgQIECBAgQIECAFUAxQ0wJTD1A0EHSQIECBAgQIECBAgQIECBAgQIECBAgQIECANMCUw9QNBB0kCBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECAPUDQQdJAgQIECBAgQIECBAgQIECAosWLFixYsWLFixYsQIECAHSQIECAosWLFixYsWLFixYsWIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECA&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;edit.tf'&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;title&amp;quot;: {&lt;br /&gt;
            &amp;quot;data&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
            &amp;quot;merge-data&amp;quot;: []&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;routing-table&amp;quot;: [&lt;br /&gt;
            90,&lt;br /&gt;
            91,&lt;br /&gt;
            92,&lt;br /&gt;
            93,&lt;br /&gt;
            94,&lt;br /&gt;
            95,&lt;br /&gt;
            96,&lt;br /&gt;
            97,&lt;br /&gt;
            98,&lt;br /&gt;
            990,&lt;br /&gt;
            0&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;cursor&amp;quot;: false,&lt;br /&gt;
        &amp;quot;connection&amp;quot;: {&lt;br /&gt;
            &amp;quot;address&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
            &amp;quot;mode&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
            &amp;quot;port&amp;quot;: 0&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;author-id&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;response-data&amp;quot;: {&lt;br /&gt;
            &amp;quot;responses&amp;quot;: null,&lt;br /&gt;
            &amp;quot;response-action&amp;quot;: {&lt;br /&gt;
                &amp;quot;exec&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
                &amp;quot;args&amp;quot;: null,&lt;br /&gt;
                &amp;quot;post-action-frame&amp;quot;: {&lt;br /&gt;
                    &amp;quot;page-no&amp;quot;: 0,&lt;br /&gt;
                    &amp;quot;frame-id&amp;quot;: ''&lt;br /&gt;
                },&lt;br /&gt;
                &amp;quot;post-cancel-frame&amp;quot;: {&lt;br /&gt;
                    &amp;quot;page-no&amp;quot;: 0,&lt;br /&gt;
                    &amp;quot;frame-id&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;navmessage-select&amp;quot;: &amp;quot;[B][n][Y]Select item or[W]*page# : [_+]&amp;quot;,&lt;br /&gt;
        &amp;quot;navmessage-notfound&amp;quot;: &amp;quot;[B][n][Y]Page not Found :[W]&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
=== pid ===&lt;br /&gt;
&lt;br /&gt;
Specifies the page number and frame id for the frame.&lt;br /&gt;
&lt;br /&gt;
    	&amp;quot;pid&amp;quot;: {&lt;br /&gt;
    		&amp;quot;page-no&amp;quot;: 9,&lt;br /&gt;
    		&amp;quot;frame-id&amp;quot;: &amp;quot;a&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
&lt;br /&gt;
=== visible ===&lt;br /&gt;
&lt;br /&gt;
When set to false, the frame will not be accessible and will return the ''not found'' system message to the user if an attempt is made to access it.&lt;br /&gt;
&lt;br /&gt;
      &amp;quot;visible&amp;quot;: true,&lt;br /&gt;
&lt;br /&gt;
=== header-text ===&lt;br /&gt;
&lt;br /&gt;
Allows the default header text to be ovwerridden at frame level. If this is left blank the default header will be used, see configuration.&lt;br /&gt;
&lt;br /&gt;
      &amp;quot;header-text&amp;quot;: &amp;quot;[Y]MICRONETn 800 (C)&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
=== cost ===&lt;br /&gt;
&lt;br /&gt;
      &amp;quot;cost&amp;quot;: 0,&lt;br /&gt;
&lt;br /&gt;
=== frame-type ===&lt;br /&gt;
&lt;br /&gt;
The API supports the following frame types ''initial'', ''mainindex'', ''information'', ''exit'', ''gateway'', ''test'' and ''response''.&lt;br /&gt;
&lt;br /&gt;
      &amp;quot;frame-type&amp;quot;: &amp;quot;information&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
* '''initial''': This frame type is used on the start page, see [[Configuration Options]]. Typically only one of these frames would exist within a system.&lt;br /&gt;
* '''mainindex''': This frame type is used on the main index page. , see [[Configuration Options]]. Only one of these frames should exist within a system.&lt;br /&gt;
* '''information''': This frame type is used for all normal content frames.&lt;br /&gt;
* '''exit''': This frame type is used for an exit page, any number of exit pages can be defined. When an exit page is rendered it will close the connection.&lt;br /&gt;
* '''gateway''': This page type is used to define a gateway page and is used in conjunction with the connection element (see below).&lt;br /&gt;
* '''test''': This page type indicates a test page and prevents navigation and system messages from being shown. this is typically used for frames that need to use the whole display such as 'test cards' etc.&lt;br /&gt;
* '''telesoftware''': Telesoftware frames (see [[Telesoftware]]).&lt;br /&gt;
* '''response''': This frame type is used for response frames. See [[Implementing Response Frames]].&lt;br /&gt;
* '''system''': Reserved for use internally.&lt;br /&gt;
* '''exception''': Reserved for use internally.&lt;br /&gt;
&lt;br /&gt;
=== redirect ===&lt;br /&gt;
 &lt;br /&gt;
If set it simply means that the user is redirected to the specified frame. This can be a useful alternative form of navigation to the routing table.&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;redirect&amp;quot;: {&lt;br /&gt;
            &amp;quot;page-no&amp;quot;: 9,&lt;br /&gt;
            &amp;quot;frame-id&amp;quot;: &amp;quot;a&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
&lt;br /&gt;
The following is an example of a complete redirect page.&lt;br /&gt;
&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;PID&amp;quot;: {&lt;br /&gt;
            &amp;quot;page-no&amp;quot;: 9,&lt;br /&gt;
            &amp;quot;frame-id&amp;quot;: &amp;quot;a&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;redirect&amp;quot;: {&lt;br /&gt;
            &amp;quot;page-no&amp;quot;: 9,&lt;br /&gt;
            &amp;quot;frame-id&amp;quot;: &amp;quot;a&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;visible: true&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
=== content ===&lt;br /&gt;
&lt;br /&gt;
These elements define the content. The example below shows the content.type to be an edit.tf url. The available types are shown below.&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;content&amp;quot;: {&lt;br /&gt;
            &amp;quot;data&amp;quot;: &amp;quot;https://edit.tf/#0:QIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgc4UCBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQICixYsWLFixYsWLFixYsWLFixYsWLFixYsWLFixYsWLFixYgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAxQIIs6PJnRYtKTOjoKkWnUQUIMeLTQIECBAgQIECBAgQIEDRAgp2adSLNQSZ0aegQIECBAgQIECBAgQIECBAgQIECBAgQNkCCPBqRa8GygpxaVaTDi00CBAgQIECBAgQIECBAgQIECBA4QIIc-dUgw6iCJFqQZMymgQIECBAgQIECBAgQIECBAgQIEDlAgmT46CfOQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQMECCZPjoJ8aMgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQICixYsWLFixYsWLFixYsWLFixYsWLFixYsWLFixYsWLFixYgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECAFUQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgBVAMUNMQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIAVQDFDTAlMPUQIECBAgQIECBAgQIECBAgQIECBAgQIECAFUAxQ0wJTD1A0EHSQIECBAgQIECBAgQIECBAgQIECBAgQIECANMCUw9QNBB0kCBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECAPUDQQdJAgQIECBAgQIECBAgQIECAosWLFixYsWLFixYsQIECAHSQIECAosWLFixYsWLFixYsWIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECA&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;edit.tf'&lt;br /&gt;
        },&lt;br /&gt;
&lt;br /&gt;
Content types:&lt;br /&gt;
&lt;br /&gt;
* '''edit.tf''': If set, then the content will be treated as an edit.tf url. This is converted to RawV before being rendered.&lt;br /&gt;
* '''markup''': If set, then the content will be treated as ''markup'' content. Full details of ''markup'' can be found in the section [[Markup]]&lt;br /&gt;
* '''rawV''': If set, then the content will be treated as raw videotex data. This is 7bit (00-7F) videotex format with control chars between 00-1F and escaped codes for alpha and graphic attributes. Ideally rows should have any trailing spaces removed and replaced with with a CR/LF combination. This will be rendered as is.&lt;br /&gt;
* '''rawT''': If set, then the content will be treated as raw teletex data. This is a 24 x 40 block of 7 bits chars (960 chars) in Teletext format (range 00-7F). This format is used internally when manipulating page data. It will be converted to RawV before being rendered.&lt;br /&gt;
&lt;br /&gt;
=== title ===&lt;br /&gt;
&lt;br /&gt;
This sets the title of the page. In many cases this may be left blank with all of the content specified in the ''content'' section (see above) however, the ''title'' section gives additional flexibility when creating frames.&lt;br /&gt;
&lt;br /&gt;
Values for ''title-type'' are the same as defined for the content section, however, if the type ''edit-tf'' is used then only the first four (default) lines of the edit.tf defined page are used. &lt;br /&gt;
&lt;br /&gt;
Separating title from content in this way allows logos and header sections to be created for the title whilst using markup for the main content or visa-versa. &lt;br /&gt;
&lt;br /&gt;
==== Example 1 ====&lt;br /&gt;
&lt;br /&gt;
In thi example the fields are blank meaning that only the data in the ''content'' section is displayed.&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;title&amp;quot;: {&lt;br /&gt;
            &amp;quot;data&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
            &amp;quot;merge-data&amp;quot;: []&lt;br /&gt;
        },&lt;br /&gt;
&lt;br /&gt;
==== Example 2 ====&lt;br /&gt;
&lt;br /&gt;
In this example, the top 4 lines of the edit.tf content is displayed at the top of the page.&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;title&amp;quot;: {&lt;br /&gt;
            &amp;quot;data&amp;quot;: &amp;quot;https://edit.tf/#0:QIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECAvobotqBX__oECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIC_9AgQIEGv-gQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgL_0Cj4kQav6BAgQIECBAgQIECBAgQIECBAgQIECBAgQIECAuq64P6Dx__oECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECA&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;edit.tf&amp;quot;,&lt;br /&gt;
            &amp;quot;merge-data&amp;quot;: []&lt;br /&gt;
        },&lt;br /&gt;
&lt;br /&gt;
To take the top 5 lines, the ''type'' field can be extended as follows.&lt;br /&gt;
&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;edit.tf,5&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Note that this extended form of ''type'' only applies to edit.tf types.&lt;br /&gt;
&lt;br /&gt;
==== Example 3 ====&lt;br /&gt;
&lt;br /&gt;
The merge data field can be used to add ''layers'' of markup data to the title area. For example the example above shows the Guardian logo. To add some alphagraphics text to this, an additional layer could be used e.g.&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;title&amp;quot;: {&lt;br /&gt;
            &amp;quot;data&amp;quot;: &amp;quot;https://edit.tf/#0:QIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECAvobotqBX__oECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIC_9AgQIEGv-gQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgL_0Cj4kQav6BAgQIECBAgQIECBAgQIECBAgQIECBAgQIECAuq64P6Dx__oECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECA&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;edit.tf,5&amp;quot;,&lt;br /&gt;
            &amp;quot;merge-data&amp;quot;: [&lt;br /&gt;
                &amp;quot;[w[             UK News]]&amp;quot;&lt;br /&gt;
            ]&lt;br /&gt;
        },&lt;br /&gt;
&lt;br /&gt;
Note that any number of layers can be added, however, the merge layer must be defined as markup.&lt;br /&gt;
&lt;br /&gt;
=== routing table ===&lt;br /&gt;
&lt;br /&gt;
The routing table defines which pages are navigated to when a user presses a key whilst viewing the frame. The table has 11 entries with the first 10 representing the keys 0-9, the final entry refers to the ''hash'' (return) key.&lt;br /&gt;
&lt;br /&gt;
The example below shows the default routing table for frame 9a. If the user is viewing this frame and presses 1 the frame 91a will be loaded, assuming it exists. Pressing the ''hash'' (return) key will take the user back to frame 0a, the main index.&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;routing-table&amp;quot;: [&lt;br /&gt;
            90,&lt;br /&gt;
            91,&lt;br /&gt;
            92,&lt;br /&gt;
            93,&lt;br /&gt;
            94,&lt;br /&gt;
            95,&lt;br /&gt;
            96,&lt;br /&gt;
            97,&lt;br /&gt;
            98,&lt;br /&gt;
            99,&lt;br /&gt;
            0&lt;br /&gt;
        ],&lt;br /&gt;
&lt;br /&gt;
=== cursor ===&lt;br /&gt;
&lt;br /&gt;
This element determines whether a cursor is shown on the page. Typically a cursor would only be shown on response frames.&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;cursor&amp;quot;: false,&lt;br /&gt;
        &lt;br /&gt;
=== connection ===&lt;br /&gt;
&lt;br /&gt;
This elements specifies the connection object used for gateway pages.&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;connection&amp;quot;: {&lt;br /&gt;
            &amp;quot;address&amp;quot;: &amp;quot;fish.ccl4.org&amp;quot;,&lt;br /&gt;
            &amp;quot;mode&amp;quot;: &amp;quot;viewdata&amp;quot;,&lt;br /&gt;
            &amp;quot;port&amp;quot;: 23&lt;br /&gt;
        },&lt;br /&gt;
&lt;br /&gt;
The values for ''address and port'' represent the endpoint of the system being accessed and the value for ''mode'' determines how the system is accessed, the options are:&lt;br /&gt;
&lt;br /&gt;
    viewdata&lt;br /&gt;
    full_duplex&lt;br /&gt;
    full_duplex_no_echo&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== author-id ===&lt;br /&gt;
&lt;br /&gt;
This is an optional field that can be used to indicate the author of the page or other source.&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;author-id&amp;quot;: &amp;quot;john&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
=== response-data ===&lt;br /&gt;
&lt;br /&gt;
These fields should be used when the frame type is set to be a ''response-frame''. &lt;br /&gt;
&lt;br /&gt;
There are two main sections, ''response-data'' and ''response-action''. Below is an example of a response frame used for the Telstar weather page. The frame is created in the normal way using ''markup'' or ''edit.tf''. In this example the text ''Town/Cty'' has been positioned near the centre of the page. Immediately to the right of this is a field for the user to enter either a Town or City, the ''response-data'' section defines that field. Once the user submits the frame the section ''response-action'' determines what happens. In the example here a binary file (''telstar-openweather-linux-amd64''), stored in the containers volume directory is executed with a single argument (''myopenweatherapikey''). Note that the ''post-action-frame'' is set to 290b, in this example frame 290b is dynamically generated by the binary file ''telstar-openweather-linux-amd64'' and contains the weather forecast.&lt;br /&gt;
&lt;br /&gt;
Full details of how to implement response frames are detailed in the section [[Implementing Response Frames]].&lt;br /&gt;
    &amp;quot;response-data&amp;quot;: {&lt;br /&gt;
        &amp;quot;response-fields&amp;quot;: [&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;vpos&amp;quot;: 8,&lt;br /&gt;
                &amp;quot;hpos&amp;quot;: 4,&lt;br /&gt;
                &amp;quot;required&amp;quot;: true,&lt;br /&gt;
                &amp;quot;length&amp;quot;: 16,&lt;br /&gt;
                &amp;quot;type&amp;quot;: &amp;quot;alphanumeric&amp;quot;,&lt;br /&gt;
                &amp;quot;auto-submit&amp;quot;: false,&lt;br /&gt;
                &amp;quot;password&amp;quot;: false&lt;br /&gt;
            }&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;response-action&amp;quot;: {&lt;br /&gt;
            &amp;quot;exec&amp;quot;: &amp;quot;/opt/telstar/volume/telstar-openweather-linux-amd64&amp;quot;,&lt;br /&gt;
            &amp;quot;args&amp;quot;: [&lt;br /&gt;
                &amp;quot;myopenweatherapikey&amp;quot;&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;post-action-frame&amp;quot;: {&lt;br /&gt;
                &amp;quot;page-no&amp;quot;: 290,&lt;br /&gt;
                &amp;quot;frame-id&amp;quot;: &amp;quot;c&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
=== navmessage-select ===&lt;br /&gt;
&lt;br /&gt;
Allows the ''navigation'' system message to be customised at frame level. In most cases this can be left blank in order that the system default is used instead, see [[Configuration Options]].&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;navmessage-select&amp;quot;: &amp;quot;[B][n][Y]Select item or[W]*page# : [_+]&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
=== navmessage-notfound ===&lt;br /&gt;
&lt;br /&gt;
Allows the ''not found'' system message to be customised at frame level. In most cases this can be left blank in order that the system default is used instead, see [[Configuration Options]].&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;navmessage-notfound&amp;quot;: &amp;quot;[B][n][Y]Page not Found :[W]&amp;quot;&lt;/div&gt;</summary>
		<author><name>John</name></author>
	</entry>
	<entry>
		<id>https://wiki.glasstty.com/index.php?title=Frames&amp;diff=327</id>
		<title>Frames</title>
		<link rel="alternate" type="text/html" href="https://wiki.glasstty.com/index.php?title=Frames&amp;diff=327"/>
		<updated>2022-04-20T22:43:43Z</updated>

		<summary type="html">&lt;p&gt;John: /* = Example 3 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;As is typical with interactive videotex systems, pages are numbered from 0 to 999999999 and consist of one or more frames with the suffix a-z, for example the first frame for page 200 would be 200a, the second 200b and so on (see [[Routing]]) for more details). These frames are stored within TELSTAR's database as ''JSON'' objects (see https://www.json.org/) and uploaded to Telstar using a simple command line utility.&lt;br /&gt;
&lt;br /&gt;
The Telstar utility program simply interacts with the Telstar API which is a restful API. This can be used directly by any software making it simple to programitically manage pages and routing information.&lt;br /&gt;
&lt;br /&gt;
Frames are defined in JSON. The simplest frame that can be viewed on TELSTAR would be as follows. This would create a simple information frame with some flashing content. In this example [[Markup]] has been used within the content, however, other content types can be used including edi.tf urls, see below.&lt;br /&gt;
&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;pid&amp;quot;: {&lt;br /&gt;
        &amp;quot;page-no&amp;quot;: 101,&lt;br /&gt;
        &amp;quot;frame-id&amp;quot;: &amp;quot;a&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;visible&amp;quot;: true,&lt;br /&gt;
      &amp;quot;content&amp;quot;: {&lt;br /&gt;
        &amp;quot;data&amp;quot;: &amp;quot;[D]This is page[F]101a&amp;quot;,&lt;br /&gt;
         &amp;quot;type&amp;quot;: &amp;quot;markup&amp;quot;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Shown below is a more complete example of a JSON defined frame. With this particular frame, the actual viewdata content has been created using the editor at http://edit.tf, this can be seen in the ''content.data'' and ''content.type'' keys. The example below is a simple information page with some simple routing (see [[Routing]]). Clicking the ''content.data'' link, or pasteing the value into a browser will show the page and allow it to be edited. It is not necessary to use the http://edit.tf editor, this is just one possible option.&lt;br /&gt;
&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;pid&amp;quot;: {&lt;br /&gt;
        &amp;quot;page-no&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;frame-id&amp;quot;: &amp;quot;a&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;visible&amp;quot;: true,&lt;br /&gt;
      &amp;quot;frame-type&amp;quot;: &amp;quot;information&amp;quot;,&lt;br /&gt;
      &amp;quot;content&amp;quot;: {&lt;br /&gt;
        &amp;quot;data&amp;quot;: &amp;quot;http://edit.tf/#0:QIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQMMKAbNw6dyCTuyZfCBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgKJEiRIkSJEiRIkSJEiRIkSJEiRIkSJEiRIkSJEiRIkSJEiRAxQR4s6LSgzEEmdUi0otOogkzo0-lNg1JM-cCg8unNYgQIASBBj67OnXllWIMu7pl5dMOndty7uixBoy4dnTQsQIECBAgBIEHfLh2dNCDDuyINmnNl59POzKuQIECBAgQIECBAgQIECBAyQTotemggzoiCvFg1JEWkCnYemnfuw7EGHdkQIECBAgQIASBBp3dMvLdh6ad-7DsQbsvfmgw7siDvlw9NGXkuQIECBAgQM0EKrTkzotOmgkzo0-lNg1JM-cCh79vDDu8oMO7IgQIECAEgQYuvPTuy8-aDdl781wM6EjVKcVBMw9MvPogoctOPLzQIEDRBHn1otKdNizqiCTOjT6U2DUkz5wKlvw5OaxByw6dixAgBIEGHdkQUMPLZpw7cu7ouQIECBAgQIECBAgQIECBAgQIECBA2QR4NSLXg2UFOLSrSYcWmCnWKkWYsQVIsWNBsLEEOHMaIASBBh3ZEHTRlQQ9-zfz54diCHh7ZUGHJ2y7unXllXIECBAgQN0EifMkxINmmCqcsPbLsQYd2RBI37NOTD5QbsvfmuQIECBA4CHQc2TDpT50WogcMGCAScgoOnLTi69MqDpvQdNGnmgQIAaBBzy8u2nHlQd9PTQgqZdmXnvzdO-HllQYd2RBt38sq5AgQOQ0yfHQT40ZYgp2adSLNQSZ0aegTIKkWnUQUIMeLTQIECAokSJEiRIkSJEiRIkSJEiRIkSJEiRIkSJEiRIkSJEiRIkSJEFeLBqSItJBGn0osODTqIBIM6EQIEFDDnyoFTJywvoECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECA&amp;quot;,&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;edit.tf&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;routing-table&amp;quot;: [0,1,11,3,400,5,6,7,800,9,0],&lt;br /&gt;
      &amp;quot;cursor&amp;quot;: false,&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
== Adding Frames to the System ==&lt;br /&gt;
&lt;br /&gt;
Frames can be added to the system using either the Telstar API.&lt;br /&gt;
&lt;br /&gt;
The Telstar API, in conjunction with the cross platform Telstar Util software, provides a simple method of creating and managing pages.&lt;br /&gt;
&lt;br /&gt;
The API can be used to retrieve and update frames and configuring routing. The API is a restful API that uses the GET, PUT, POST and DELETE HTTP methods and as such can be used from any application.&lt;br /&gt;
&lt;br /&gt;
Data is passed to and from the API in JSON format, making the system very simple to use in any programming language. The whole API could be used without any programming at all by using a command line utility such as CURL.&lt;br /&gt;
&lt;br /&gt;
''Further details of the Telstar API can be found in the section [[The Telstar API]].''&lt;br /&gt;
&lt;br /&gt;
== Adding Content with the Edit.tf editor ==&lt;br /&gt;
&lt;br /&gt;
There are several ways to add content to a page. One of the easiest is to create the page in an editor such as http://edit.tf.&lt;br /&gt;
&lt;br /&gt;
The JSON file would look something like the one showm below. Note that the content type is set to editf and the content data contains the edit.tf url.&lt;br /&gt;
&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;pid&amp;quot;: {&lt;br /&gt;
            &amp;quot;page-no&amp;quot;: 101,&lt;br /&gt;
            &amp;quot;frame-id&amp;quot;: &amp;quot;a&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;visible&amp;quot;: true,&lt;br /&gt;
        &amp;quot;frame-type&amp;quot;: &amp;quot;information&amp;quot;,&lt;br /&gt;
        &amp;quot;content&amp;quot;: {&lt;br /&gt;
            &amp;quot;data&amp;quot;: &amp;quot;http://edit.tf/#0:QIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQICn_OmTJkSJApUqVKlSpUlcHApiTJkyZEiRIkyZMmTIkSJFmKf3JX58____RBg-fPnzog__2iBBo-fNX9qgQcOHDh8-fGiAp_zFf______2v7_____7X___oEGr__Qa0ur_________QoCn9ywK__6D__a__7dH__tf___1QIv_9AiQIkaPX_bo0aMpiKf_-Yr__oP_9r__tUH_-1____9og__yjnz5cldX9qUc-fPkp__uSv_-g__2v_-1Qf_7X__aIv____KZv_dIV__2pTN___yn__mK___z__a____5__tf_9qgVf__8o5_vWJX__alHP___Kf_7kr____6dBr_____-h__2qBBr__ymbPnSFf69CUzf__8pnz5iq9ejRoECBWvXr0KBGjQYOHBHz4cECBAgwcCily7__yqDhw4ePnzogQeP7RAg0fPiBB___9X___QYPH___-sCmb__KoP________3B__tUCDV__tUH___1f36XB-_______KOf_8qgRo__9B__v9X___QINX___Qav__B8-NNX_-jR___8pm__ymYrq______h_odX9qg1f___7q__9X_-h1f_5TBgwYM37__KOSur-_Ro0Pr_8_f_qDV_b___r__1f_6D___lFKlSpUu__8pmK_v7VAgwf______tNX9r______V__oP__-gQaPnwpm__yqDB__tUCD__QIEG___1f2qL____9X_-g____z5-__ymb__KoNX_-lQKl6VAgQav6_V__oNf___1f2qBX_____9-hKOf_8qgVJ0JRw4cOPLkqiQoESNGgVL0aFEjQoECJGjRoymDNm__ymTJkzZv3_____-3bt27du3Thw8efPnz58-fPnz58-fP___QIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECA&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;edit.tf&amp;quot;&lt;br /&gt;
        }    &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
== Adding Content using Markup ==&lt;br /&gt;
&lt;br /&gt;
Content can be added directly to the JSON file using a very simple markup. For example consider the following frame definition.&lt;br /&gt;
&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;pid&amp;quot;: {&lt;br /&gt;
            &amp;quot;page-no&amp;quot;: 101,&lt;br /&gt;
            &amp;quot;frame-id&amp;quot;: &amp;quot;a&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;visible&amp;quot;: true,&lt;br /&gt;
        &amp;quot;frame-type&amp;quot;: &amp;quot;information&amp;quot;,&lt;br /&gt;
        &amp;quot;title&amp;quot;: {&lt;br /&gt;
            &amp;quot;data&amp;quot;: &amp;quot;[D]Welcome\r\n\r\n&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;markup&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;content&amp;quot;: {&lt;br /&gt;
            &amp;quot;data&amp;quot;: &amp;quot;[Y]Hello[C]Telstar[M]World&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;markup&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
This frame uses markup in the title and the content, The title is specified as [D]ouble height and the three words used in the content are coloured yellow, cyan and magenta respectively.&lt;br /&gt;
&lt;br /&gt;
Full details of markup can be found in the [[Markup]] section.&lt;br /&gt;
&lt;br /&gt;
== Complete Frame Description ==&lt;br /&gt;
&lt;br /&gt;
The frame below is a standard information page from the TELSTAR system shown in its JSON format. It represents the first frame of page 9. Taking this frame as an example, a description of the fields and their meaning is decribed below.&lt;br /&gt;
&lt;br /&gt;
''The full json schema can be found [[Frame Schema|here]].''&lt;br /&gt;
&lt;br /&gt;
     {&lt;br /&gt;
    	&amp;quot;pid&amp;quot;: {&lt;br /&gt;
    		&amp;quot;page-no&amp;quot;: 9,&lt;br /&gt;
    		&amp;quot;frame-id&amp;quot;: &amp;quot;a&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;visible&amp;quot;: true,&lt;br /&gt;
        &amp;quot;header-text&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;cost&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;frame-type&amp;quot;: &amp;quot;information&amp;quot;,&lt;br /&gt;
        &amp;quot;redirect&amp;quot;: {&lt;br /&gt;
            &amp;quot;page-no&amp;quot;: 0,&lt;br /&gt;
            &amp;quot;frame-id&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;content&amp;quot;: {&lt;br /&gt;
            &amp;quot;data&amp;quot;: &amp;quot;https://edit.tf/#0:QIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgc4UCBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQICixYsWLFixYsWLFixYsWLFixYsWLFixYsWLFixYsWLFixYgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAxQIIs6PJnRYtKTOjoKkWnUQUIMeLTQIECBAgQIECBAgQIEDRAgp2adSLNQSZ0aegQIECBAgQIECBAgQIECBAgQIECBAgQNkCCPBqRa8GygpxaVaTDi00CBAgQIECBAgQIECBAgQIECBA4QIIc-dUgw6iCJFqQZMymgQIECBAgQIECBAgQIECBAgQIEDlAgmT46CfOQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQMECCZPjoJ8aMgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQICixYsWLFixYsWLFixYsWLFixYsWLFixYsWLFixYsWLFixYgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECAFUQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgBVAMUNMQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIAVQDFDTAlMPUQIECBAgQIECBAgQIECBAgQIECBAgQIECAFUAxQ0wJTD1A0EHSQIECBAgQIECBAgQIECBAgQIECBAgQIECANMCUw9QNBB0kCBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECAPUDQQdJAgQIECBAgQIECBAgQIECAosWLFixYsWLFixYsQIECAHSQIECAosWLFixYsWLFixYsWIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECA&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;edit.tf'&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;title&amp;quot;: {&lt;br /&gt;
            &amp;quot;data&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
            &amp;quot;merge-data&amp;quot;: []&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;routing-table&amp;quot;: [&lt;br /&gt;
            90,&lt;br /&gt;
            91,&lt;br /&gt;
            92,&lt;br /&gt;
            93,&lt;br /&gt;
            94,&lt;br /&gt;
            95,&lt;br /&gt;
            96,&lt;br /&gt;
            97,&lt;br /&gt;
            98,&lt;br /&gt;
            990,&lt;br /&gt;
            0&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;cursor&amp;quot;: false,&lt;br /&gt;
        &amp;quot;connection&amp;quot;: {&lt;br /&gt;
            &amp;quot;address&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
            &amp;quot;mode&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
            &amp;quot;port&amp;quot;: 0&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;author-id&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;response-data&amp;quot;: {&lt;br /&gt;
            &amp;quot;responses&amp;quot;: null,&lt;br /&gt;
            &amp;quot;response-action&amp;quot;: {&lt;br /&gt;
                &amp;quot;exec&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
                &amp;quot;args&amp;quot;: null,&lt;br /&gt;
                &amp;quot;post-action-frame&amp;quot;: {&lt;br /&gt;
                    &amp;quot;page-no&amp;quot;: 0,&lt;br /&gt;
                    &amp;quot;frame-id&amp;quot;: ''&lt;br /&gt;
                },&lt;br /&gt;
                &amp;quot;post-cancel-frame&amp;quot;: {&lt;br /&gt;
                    &amp;quot;page-no&amp;quot;: 0,&lt;br /&gt;
                    &amp;quot;frame-id&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;navmessage-select&amp;quot;: &amp;quot;[B][n][Y]Select item or[W]*page# : [_+]&amp;quot;,&lt;br /&gt;
        &amp;quot;navmessage-notfound&amp;quot;: &amp;quot;[B][n][Y]Page not Found :[W]&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
=== pid ===&lt;br /&gt;
&lt;br /&gt;
Specifies the page number and frame id for the frame.&lt;br /&gt;
&lt;br /&gt;
    	&amp;quot;pid&amp;quot;: {&lt;br /&gt;
    		&amp;quot;page-no&amp;quot;: 9,&lt;br /&gt;
    		&amp;quot;frame-id&amp;quot;: &amp;quot;a&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
&lt;br /&gt;
=== visible ===&lt;br /&gt;
&lt;br /&gt;
When set to false, the frame will not be accessible and will return the ''not found'' system message to the user if an attempt is made to access it.&lt;br /&gt;
&lt;br /&gt;
      &amp;quot;visible&amp;quot;: true,&lt;br /&gt;
&lt;br /&gt;
=== header-text ===&lt;br /&gt;
&lt;br /&gt;
Allows the default header text to be ovwerridden at frame level. If this is left blank the default header will be used, see configuration.&lt;br /&gt;
&lt;br /&gt;
      &amp;quot;header-text&amp;quot;: &amp;quot;[Y]MICRONETn 800 (C)&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
=== cost ===&lt;br /&gt;
&lt;br /&gt;
      &amp;quot;cost&amp;quot;: 0,&lt;br /&gt;
&lt;br /&gt;
=== frame-type ===&lt;br /&gt;
&lt;br /&gt;
The API supports the following frame types ''initial'', ''mainindex'', ''information'', ''exit'', ''gateway'', ''test'' and ''response''.&lt;br /&gt;
&lt;br /&gt;
      &amp;quot;frame-type&amp;quot;: &amp;quot;information&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
* '''initial''': This frame type is used on the start page, see [[Configuration Options]]. Typically only one of these frames would exist within a system.&lt;br /&gt;
* '''mainindex''': This frame type is used on the main index page. , see [[Configuration Options]]. Only one of these frames should exist within a system.&lt;br /&gt;
* '''information''': This frame type is used for all normal content frames.&lt;br /&gt;
* '''exit''': This frame type is used for an exit page, any number of exit pages can be defined. When an exit page is rendered it will close the connection.&lt;br /&gt;
* '''gateway''': This page type is used to define a gateway page and is used in conjunction with the connection element (see below).&lt;br /&gt;
* '''test''': This page type indicates a test page and prevents navigation and system messages from being shown. this is typically used for frames that need to use the whole display such as 'test cards' etc.&lt;br /&gt;
* '''telesoftware''': Telesoftware frames (see [[Telesoftware]]).&lt;br /&gt;
* '''response''': This frame type is used for response frames. See [[Implementing Response Frames]].&lt;br /&gt;
* '''system''': Reserved for use internally.&lt;br /&gt;
* '''exception''': Reserved for use internally.&lt;br /&gt;
&lt;br /&gt;
=== redirect ===&lt;br /&gt;
 &lt;br /&gt;
If set it simply means that the user is redirected to the specified frame. This can be a useful alternative form of navigation to the routing table.&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;redirect&amp;quot;: {&lt;br /&gt;
            &amp;quot;page-no&amp;quot;: 9,&lt;br /&gt;
            &amp;quot;frame-id&amp;quot;: &amp;quot;a&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
&lt;br /&gt;
=== content ===&lt;br /&gt;
&lt;br /&gt;
These elements define the content. The example below shows the content.type to be an edit.tf url. The available types are shown below.&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;content&amp;quot;: {&lt;br /&gt;
            &amp;quot;data&amp;quot;: &amp;quot;https://edit.tf/#0:QIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgc4UCBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQICixYsWLFixYsWLFixYsWLFixYsWLFixYsWLFixYsWLFixYgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAxQIIs6PJnRYtKTOjoKkWnUQUIMeLTQIECBAgQIECBAgQIEDRAgp2adSLNQSZ0aegQIECBAgQIECBAgQIECBAgQIECBAgQNkCCPBqRa8GygpxaVaTDi00CBAgQIECBAgQIECBAgQIECBA4QIIc-dUgw6iCJFqQZMymgQIECBAgQIECBAgQIECBAgQIEDlAgmT46CfOQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQMECCZPjoJ8aMgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQICixYsWLFixYsWLFixYsWLFixYsWLFixYsWLFixYsWLFixYgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECAFUQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgBVAMUNMQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIAVQDFDTAlMPUQIECBAgQIECBAgQIECBAgQIECBAgQIECAFUAxQ0wJTD1A0EHSQIECBAgQIECBAgQIECBAgQIECBAgQIECANMCUw9QNBB0kCBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECAPUDQQdJAgQIECBAgQIECBAgQIECAosWLFixYsWLFixYsQIECAHSQIECAosWLFixYsWLFixYsWIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECA&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;edit.tf'&lt;br /&gt;
        },&lt;br /&gt;
&lt;br /&gt;
Content types:&lt;br /&gt;
&lt;br /&gt;
* '''edit.tf''': If set, then the content will be treated as an edit.tf url. This is converted to RawV before being rendered.&lt;br /&gt;
* '''markup''': If set, then the content will be treated as ''markup'' content. Full details of ''markup'' can be found in the section [[Markup]]&lt;br /&gt;
* '''rawV''': If set, then the content will be treated as raw videotex data. This is 7bit (00-7F) videotex format with control chars between 00-1F and escaped codes for alpha and graphic attributes. Ideally rows should have any trailing spaces removed and replaced with with a CR/LF combination. This will be rendered as is.&lt;br /&gt;
* '''rawT''': If set, then the content will be treated as raw teletex data. This is a 24 x 40 block of 7 bits chars (960 chars) in Teletext format (range 00-7F). This format is used internally when manipulating page data. It will be converted to RawV before being rendered.&lt;br /&gt;
&lt;br /&gt;
=== title ===&lt;br /&gt;
&lt;br /&gt;
This sets the title of the page. In many cases this may be left blank with all of the content specified in the ''content'' section (see above) however, the ''title'' section gives additional flexibility when creating frames.&lt;br /&gt;
&lt;br /&gt;
Values for ''title-type'' are the same as defined for the content section, however, if the type ''edit-tf'' is used then only the first four (default) lines of the edit.tf defined page are used. &lt;br /&gt;
&lt;br /&gt;
Separating title from content in this way allows logos and header sections to be created for the title whilst using markup for the main content or visa-versa. &lt;br /&gt;
&lt;br /&gt;
==== Example 1 ====&lt;br /&gt;
&lt;br /&gt;
In thi example the fields are blank meaning that only the data in the ''content'' section is displayed.&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;title&amp;quot;: {&lt;br /&gt;
            &amp;quot;data&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
            &amp;quot;merge-data&amp;quot;: []&lt;br /&gt;
        },&lt;br /&gt;
&lt;br /&gt;
==== Example 2 ====&lt;br /&gt;
&lt;br /&gt;
In this example, the top 4 lines of the edit.tf content is displayed at the top of the page.&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;title&amp;quot;: {&lt;br /&gt;
            &amp;quot;data&amp;quot;: &amp;quot;https://edit.tf/#0:QIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECAvobotqBX__oECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIC_9AgQIEGv-gQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgL_0Cj4kQav6BAgQIECBAgQIECBAgQIECBAgQIECBAgQIECAuq64P6Dx__oECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECA&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;edit.tf&amp;quot;,&lt;br /&gt;
            &amp;quot;merge-data&amp;quot;: []&lt;br /&gt;
        },&lt;br /&gt;
&lt;br /&gt;
To take the top 5 lines, the ''type'' field can be extended as follows.&lt;br /&gt;
&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;edit.tf,5&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Note that this extended form of ''type'' only applies to edit.tf types.&lt;br /&gt;
&lt;br /&gt;
==== Example 3 ====&lt;br /&gt;
&lt;br /&gt;
The merge data field can be used to add ''layers'' of markup data to the title area. For example the example above shows the Guardian logo. To add some alphagraphics text to this, an additional layer could be used e.g.&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;title&amp;quot;: {&lt;br /&gt;
            &amp;quot;data&amp;quot;: &amp;quot;https://edit.tf/#0:QIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECAvobotqBX__oECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIC_9AgQIEGv-gQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgL_0Cj4kQav6BAgQIECBAgQIECBAgQIECBAgQIECBAgQIECAuq64P6Dx__oECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECA&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;edit.tf,5&amp;quot;,&lt;br /&gt;
            &amp;quot;merge-data&amp;quot;: [&lt;br /&gt;
                &amp;quot;[w[             UK News]]&amp;quot;&lt;br /&gt;
            ]&lt;br /&gt;
        },&lt;br /&gt;
&lt;br /&gt;
Note that any number of layers can be added, however, the merge layer must be defined as markup.&lt;br /&gt;
&lt;br /&gt;
=== routing table ===&lt;br /&gt;
&lt;br /&gt;
The routing table defines which pages are navigated to when a user presses a key whilst viewing the frame. The table has 11 entries with the first 10 representing the keys 0-9, the final entry refers to the ''hash'' (return) key.&lt;br /&gt;
&lt;br /&gt;
The example below shows the default routing table for frame 9a. If the user is viewing this frame and presses 1 the frame 91a will be loaded, assuming it exists. Pressing the ''hash'' (return) key will take the user back to frame 0a, the main index.&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;routing-table&amp;quot;: [&lt;br /&gt;
            90,&lt;br /&gt;
            91,&lt;br /&gt;
            92,&lt;br /&gt;
            93,&lt;br /&gt;
            94,&lt;br /&gt;
            95,&lt;br /&gt;
            96,&lt;br /&gt;
            97,&lt;br /&gt;
            98,&lt;br /&gt;
            99,&lt;br /&gt;
            0&lt;br /&gt;
        ],&lt;br /&gt;
&lt;br /&gt;
=== cursor ===&lt;br /&gt;
&lt;br /&gt;
This element determines whether a cursor is shown on the page. Typically a cursor would only be shown on response frames.&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;cursor&amp;quot;: false,&lt;br /&gt;
        &lt;br /&gt;
=== connection ===&lt;br /&gt;
&lt;br /&gt;
This elements specifies the connection object used for gateway pages.&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;connection&amp;quot;: {&lt;br /&gt;
            &amp;quot;address&amp;quot;: &amp;quot;fish.ccl4.org&amp;quot;,&lt;br /&gt;
            &amp;quot;mode&amp;quot;: &amp;quot;viewdata&amp;quot;,&lt;br /&gt;
            &amp;quot;port&amp;quot;: 23&lt;br /&gt;
        },&lt;br /&gt;
&lt;br /&gt;
The values for ''address and port'' represent the endpoint of the system being accessed and the value for ''mode'' determines how the system is accessed, the options are:&lt;br /&gt;
&lt;br /&gt;
    viewdata&lt;br /&gt;
    full_duplex&lt;br /&gt;
    full_duplex_no_echo&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== author-id ===&lt;br /&gt;
&lt;br /&gt;
This is an optional field that can be used to indicate the author of the page or other source.&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;author-id&amp;quot;: &amp;quot;john&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
=== response-data ===&lt;br /&gt;
&lt;br /&gt;
These fields should be used when the frame type is set to be a ''response-frame''. &lt;br /&gt;
&lt;br /&gt;
There are two main sections, ''response-data'' and ''response-action''. Below is an example of a response frame used for the Telstar weather page. The frame is created in the normal way using ''markup'' or ''edit.tf''. In this example the text ''Town/Cty'' has been positioned near the centre of the page. Immediately to the right of this is a field for the user to enter either a Town or City, the ''response-data'' section defines that field. Once the user submits the frame the section ''response-action'' determines what happens. In the example here a binary file (''telstar-openweather-linux-amd64''), stored in the containers volume directory is executed with a single argument (''myopenweatherapikey''). Note that the ''post-action-frame'' is set to 290b, in this example frame 290b is dynamically generated by the binary file ''telstar-openweather-linux-amd64'' and contains the weather forecast.&lt;br /&gt;
&lt;br /&gt;
Full details of how to implement response frames are detailed in the section [[Implementing Response Frames]].&lt;br /&gt;
    &amp;quot;response-data&amp;quot;: {&lt;br /&gt;
        &amp;quot;response-fields&amp;quot;: [&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;vpos&amp;quot;: 8,&lt;br /&gt;
                &amp;quot;hpos&amp;quot;: 4,&lt;br /&gt;
                &amp;quot;required&amp;quot;: true,&lt;br /&gt;
                &amp;quot;length&amp;quot;: 16,&lt;br /&gt;
                &amp;quot;type&amp;quot;: &amp;quot;alphanumeric&amp;quot;,&lt;br /&gt;
                &amp;quot;auto-submit&amp;quot;: false,&lt;br /&gt;
                &amp;quot;password&amp;quot;: false&lt;br /&gt;
            }&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;response-action&amp;quot;: {&lt;br /&gt;
            &amp;quot;exec&amp;quot;: &amp;quot;/opt/telstar/volume/telstar-openweather-linux-amd64&amp;quot;,&lt;br /&gt;
            &amp;quot;args&amp;quot;: [&lt;br /&gt;
                &amp;quot;myopenweatherapikey&amp;quot;&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;post-action-frame&amp;quot;: {&lt;br /&gt;
                &amp;quot;page-no&amp;quot;: 290,&lt;br /&gt;
                &amp;quot;frame-id&amp;quot;: &amp;quot;c&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
=== navmessage-select ===&lt;br /&gt;
&lt;br /&gt;
Allows the ''navigation'' system message to be customised at frame level. In most cases this can be left blank in order that the system default is used instead, see [[Configuration Options]].&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;navmessage-select&amp;quot;: &amp;quot;[B][n][Y]Select item or[W]*page# : [_+]&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
=== navmessage-notfound ===&lt;br /&gt;
&lt;br /&gt;
Allows the ''not found'' system message to be customised at frame level. In most cases this can be left blank in order that the system default is used instead, see [[Configuration Options]].&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;navmessage-notfound&amp;quot;: &amp;quot;[B][n][Y]Page not Found :[W]&amp;quot;&lt;/div&gt;</summary>
		<author><name>John</name></author>
	</entry>
	<entry>
		<id>https://wiki.glasstty.com/index.php?title=Frames&amp;diff=323</id>
		<title>Frames</title>
		<link rel="alternate" type="text/html" href="https://wiki.glasstty.com/index.php?title=Frames&amp;diff=323"/>
		<updated>2022-04-20T22:33:01Z</updated>

		<summary type="html">&lt;p&gt;John: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;As is typical with interactive videotex systems, pages are numbered from 0 to 999999999 and consist of one or more frames with the suffix a-z, for example the first frame for page 200 would be 200a, the second 200b and so on (see [[Routing]]) for more details). These frames are stored within TELSTAR's database as ''JSON'' objects (see https://www.json.org/) and uploaded to Telstar using a simple command line utility.&lt;br /&gt;
&lt;br /&gt;
The Telstar utility program simply interacts with the Telstar API which is a restful API. This can be used directly by any software making it simple to programitically manage pages and routing information.&lt;br /&gt;
&lt;br /&gt;
Frames are defined in JSON. The simplest frame that can be viewed on TELSTAR would be as follows. This would create a simple information frame with some flashing content. In this example [[Markup]] has been used within the content, however, other content types can be used including edi.tf urls, see below.&lt;br /&gt;
&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;pid&amp;quot;: {&lt;br /&gt;
        &amp;quot;page-no&amp;quot;: 101,&lt;br /&gt;
        &amp;quot;frame-id&amp;quot;: &amp;quot;a&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;visible&amp;quot;: true,&lt;br /&gt;
      &amp;quot;content&amp;quot;: {&lt;br /&gt;
        &amp;quot;data&amp;quot;: &amp;quot;[D]This is page[F]101a&amp;quot;,&lt;br /&gt;
         &amp;quot;type&amp;quot;: &amp;quot;markup&amp;quot;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Shown below is a more complete example of a JSON defined frame. With this particular frame, the actual viewdata content has been created using the editor at http://edit.tf, this can be seen in the ''content.data'' and ''content.type'' keys. The example below is a simple information page with some simple routing (see [[Routing]]). Clicking the ''content.data'' link, or pasteing the value into a browser will show the page and allow it to be edited. It is not necessary to use the http://edit.tf editor, this is just one possible option.&lt;br /&gt;
&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;pid&amp;quot;: {&lt;br /&gt;
        &amp;quot;page-no&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;frame-id&amp;quot;: &amp;quot;a&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;visible&amp;quot;: true,&lt;br /&gt;
      &amp;quot;frame-type&amp;quot;: &amp;quot;information&amp;quot;,&lt;br /&gt;
      &amp;quot;content&amp;quot;: {&lt;br /&gt;
        &amp;quot;data&amp;quot;: &amp;quot;http://edit.tf/#0:QIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQMMKAbNw6dyCTuyZfCBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgKJEiRIkSJEiRIkSJEiRIkSJEiRIkSJEiRIkSJEiRIkSJEiRAxQR4s6LSgzEEmdUi0otOogkzo0-lNg1JM-cCg8unNYgQIASBBj67OnXllWIMu7pl5dMOndty7uixBoy4dnTQsQIECBAgBIEHfLh2dNCDDuyINmnNl59POzKuQIECBAgQIECBAgQIECBAyQTotemggzoiCvFg1JEWkCnYemnfuw7EGHdkQIECBAgQIASBBp3dMvLdh6ad-7DsQbsvfmgw7siDvlw9NGXkuQIECBAgQM0EKrTkzotOmgkzo0-lNg1JM-cCh79vDDu8oMO7IgQIECAEgQYuvPTuy8-aDdl781wM6EjVKcVBMw9MvPogoctOPLzQIEDRBHn1otKdNizqiCTOjT6U2DUkz5wKlvw5OaxByw6dixAgBIEGHdkQUMPLZpw7cu7ouQIECBAgQIECBAgQIECBAgQIECBA2QR4NSLXg2UFOLSrSYcWmCnWKkWYsQVIsWNBsLEEOHMaIASBBh3ZEHTRlQQ9-zfz54diCHh7ZUGHJ2y7unXllXIECBAgQN0EifMkxINmmCqcsPbLsQYd2RBI37NOTD5QbsvfmuQIECBA4CHQc2TDpT50WogcMGCAScgoOnLTi69MqDpvQdNGnmgQIAaBBzy8u2nHlQd9PTQgqZdmXnvzdO-HllQYd2RBt38sq5AgQOQ0yfHQT40ZYgp2adSLNQSZ0aegTIKkWnUQUIMeLTQIECAokSJEiRIkSJEiRIkSJEiRIkSJEiRIkSJEiRIkSJEiRIkSJEFeLBqSItJBGn0osODTqIBIM6EQIEFDDnyoFTJywvoECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECA&amp;quot;,&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;edit.tf&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;routing-table&amp;quot;: [0,1,11,3,400,5,6,7,800,9,0],&lt;br /&gt;
      &amp;quot;cursor&amp;quot;: false,&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
== Adding Frames to the System ==&lt;br /&gt;
&lt;br /&gt;
Frames can be added to the system using either the Telstar API.&lt;br /&gt;
&lt;br /&gt;
The Telstar API, in conjunction with the cross platform Telstar Util software, provides a simple method of creating and managing pages.&lt;br /&gt;
&lt;br /&gt;
The API can be used to retrieve and update frames and configuring routing. The API is a restful API that uses the GET, PUT, POST and DELETE HTTP methods and as such can be used from any application.&lt;br /&gt;
&lt;br /&gt;
Data is passed to and from the API in JSON format, making the system very simple to use in any programming language. The whole API could be used without any programming at all by using a command line utility such as CURL.&lt;br /&gt;
&lt;br /&gt;
''Further details of the Telstar API can be found in the section [[The Telstar API]].''&lt;br /&gt;
&lt;br /&gt;
== Adding Content with the Edit.tf editor ==&lt;br /&gt;
&lt;br /&gt;
There are several ways to add content to a page. One of the easiest is to create the page in an editor such as http://edit.tf.&lt;br /&gt;
&lt;br /&gt;
The JSON file would look something like the one showm below. Note that the content type is set to editf and the content data contains the edit.tf url.&lt;br /&gt;
&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;pid&amp;quot;: {&lt;br /&gt;
            &amp;quot;page-no&amp;quot;: 101,&lt;br /&gt;
            &amp;quot;frame-id&amp;quot;: &amp;quot;a&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;visible&amp;quot;: true,&lt;br /&gt;
        &amp;quot;frame-type&amp;quot;: &amp;quot;information&amp;quot;,&lt;br /&gt;
        &amp;quot;content&amp;quot;: {&lt;br /&gt;
            &amp;quot;data&amp;quot;: &amp;quot;http://edit.tf/#0:QIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQICn_OmTJkSJApUqVKlSpUlcHApiTJkyZEiRIkyZMmTIkSJFmKf3JX58____RBg-fPnzog__2iBBo-fNX9qgQcOHDh8-fGiAp_zFf______2v7_____7X___oEGr__Qa0ur_________QoCn9ywK__6D__a__7dH__tf___1QIv_9AiQIkaPX_bo0aMpiKf_-Yr__oP_9r__tUH_-1____9og__yjnz5cldX9qUc-fPkp__uSv_-g__2v_-1Qf_7X__aIv____KZv_dIV__2pTN___yn__mK___z__a____5__tf_9qgVf__8o5_vWJX__alHP___Kf_7kr____6dBr_____-h__2qBBr__ymbPnSFf69CUzf__8pnz5iq9ejRoECBWvXr0KBGjQYOHBHz4cECBAgwcCily7__yqDhw4ePnzogQeP7RAg0fPiBB___9X___QYPH___-sCmb__KoP________3B__tUCDV__tUH___1f36XB-_______KOf_8qgRo__9B__v9X___QINX___Qav__B8-NNX_-jR___8pm__ymYrq______h_odX9qg1f___7q__9X_-h1f_5TBgwYM37__KOSur-_Ro0Pr_8_f_qDV_b___r__1f_6D___lFKlSpUu__8pmK_v7VAgwf______tNX9r______V__oP__-gQaPnwpm__yqDB__tUCD__QIEG___1f2qL____9X_-g____z5-__ymb__KoNX_-lQKl6VAgQav6_V__oNf___1f2qBX_____9-hKOf_8qgVJ0JRw4cOPLkqiQoESNGgVL0aFEjQoECJGjRoymDNm__ymTJkzZv3_____-3bt27du3Thw8efPnz58-fPnz58-fP___QIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECA&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;edit.tf&amp;quot;&lt;br /&gt;
        }    &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
== Adding Content using Markup ==&lt;br /&gt;
&lt;br /&gt;
Content can be added directly to the JSON file using a very simple markup. For example consider the following frame definition.&lt;br /&gt;
&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;pid&amp;quot;: {&lt;br /&gt;
            &amp;quot;page-no&amp;quot;: 101,&lt;br /&gt;
            &amp;quot;frame-id&amp;quot;: &amp;quot;a&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;visible&amp;quot;: true,&lt;br /&gt;
        &amp;quot;frame-type&amp;quot;: &amp;quot;information&amp;quot;,&lt;br /&gt;
        &amp;quot;title&amp;quot;: {&lt;br /&gt;
            &amp;quot;data&amp;quot;: &amp;quot;[D]Welcome\r\n\r\n&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;markup&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;content&amp;quot;: {&lt;br /&gt;
            &amp;quot;data&amp;quot;: &amp;quot;[Y]Hello[C]Telstar[M]World&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;markup&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
This frame uses markup in the title and the content, The title is specified as [D]ouble height and the three words used in the content are coloured yellow, cyan and magenta respectively.&lt;br /&gt;
&lt;br /&gt;
Full details of markup can be found in the [[Markup]] section.&lt;br /&gt;
&lt;br /&gt;
== Complete Frame Description ==&lt;br /&gt;
&lt;br /&gt;
The frame below is a standard information page from the TELSTAR system shown in its JSON format. It represents the first frame of page 9. Taking this frame as an example, a description of the fields and their meaning is decribed below.&lt;br /&gt;
&lt;br /&gt;
''The full json schema can be found [[Frame Schema|here]].''&lt;br /&gt;
&lt;br /&gt;
     {&lt;br /&gt;
    	&amp;quot;pid&amp;quot;: {&lt;br /&gt;
    		&amp;quot;page-no&amp;quot;: 9,&lt;br /&gt;
    		&amp;quot;frame-id&amp;quot;: &amp;quot;a&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;visible&amp;quot;: true,&lt;br /&gt;
        &amp;quot;header-text&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;cost&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;frame-type&amp;quot;: &amp;quot;information&amp;quot;,&lt;br /&gt;
        &amp;quot;redirect&amp;quot;: {&lt;br /&gt;
            &amp;quot;page-no&amp;quot;: 0,&lt;br /&gt;
            &amp;quot;frame-id&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;content&amp;quot;: {&lt;br /&gt;
            &amp;quot;data&amp;quot;: &amp;quot;https://edit.tf/#0:QIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgc4UCBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQICixYsWLFixYsWLFixYsWLFixYsWLFixYsWLFixYsWLFixYgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAxQIIs6PJnRYtKTOjoKkWnUQUIMeLTQIECBAgQIECBAgQIEDRAgp2adSLNQSZ0aegQIECBAgQIECBAgQIECBAgQIECBAgQNkCCPBqRa8GygpxaVaTDi00CBAgQIECBAgQIECBAgQIECBA4QIIc-dUgw6iCJFqQZMymgQIECBAgQIECBAgQIECBAgQIEDlAgmT46CfOQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQMECCZPjoJ8aMgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQICixYsWLFixYsWLFixYsWLFixYsWLFixYsWLFixYsWLFixYgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECAFUQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgBVAMUNMQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIAVQDFDTAlMPUQIECBAgQIECBAgQIECBAgQIECBAgQIECAFUAxQ0wJTD1A0EHSQIECBAgQIECBAgQIECBAgQIECBAgQIECANMCUw9QNBB0kCBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECAPUDQQdJAgQIECBAgQIECBAgQIECAosWLFixYsWLFixYsQIECAHSQIECAosWLFixYsWLFixYsWIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECA&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;edit.tf'&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;title&amp;quot;: {&lt;br /&gt;
            &amp;quot;data&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
            &amp;quot;merge-data&amp;quot;: []&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;routing-table&amp;quot;: [&lt;br /&gt;
            90,&lt;br /&gt;
            91,&lt;br /&gt;
            92,&lt;br /&gt;
            93,&lt;br /&gt;
            94,&lt;br /&gt;
            95,&lt;br /&gt;
            96,&lt;br /&gt;
            97,&lt;br /&gt;
            98,&lt;br /&gt;
            990,&lt;br /&gt;
            0&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;cursor&amp;quot;: false,&lt;br /&gt;
        &amp;quot;connection&amp;quot;: {&lt;br /&gt;
            &amp;quot;address&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
            &amp;quot;mode&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
            &amp;quot;port&amp;quot;: 0&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;author-id&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;response-data&amp;quot;: {&lt;br /&gt;
            &amp;quot;responses&amp;quot;: null,&lt;br /&gt;
            &amp;quot;response-action&amp;quot;: {&lt;br /&gt;
                &amp;quot;exec&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
                &amp;quot;args&amp;quot;: null,&lt;br /&gt;
                &amp;quot;post-action-frame&amp;quot;: {&lt;br /&gt;
                    &amp;quot;page-no&amp;quot;: 0,&lt;br /&gt;
                    &amp;quot;frame-id&amp;quot;: ''&lt;br /&gt;
                },&lt;br /&gt;
                &amp;quot;post-cancel-frame&amp;quot;: {&lt;br /&gt;
                    &amp;quot;page-no&amp;quot;: 0,&lt;br /&gt;
                    &amp;quot;frame-id&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;navmessage-select&amp;quot;: &amp;quot;[B][n][Y]Select item or[W]*page# : [_+]&amp;quot;,&lt;br /&gt;
        &amp;quot;navmessage-notfound&amp;quot;: &amp;quot;[B][n][Y]Page not Found :[W]&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
=== pid ===&lt;br /&gt;
&lt;br /&gt;
Specifies the page number and frame id for the frame.&lt;br /&gt;
&lt;br /&gt;
    	&amp;quot;pid&amp;quot;: {&lt;br /&gt;
    		&amp;quot;page-no&amp;quot;: 9,&lt;br /&gt;
    		&amp;quot;frame-id&amp;quot;: &amp;quot;a&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
&lt;br /&gt;
=== visible ===&lt;br /&gt;
&lt;br /&gt;
When set to false, the frame will not be accessible and will return the ''not found'' system message to the user if an attempt is made to access it.&lt;br /&gt;
&lt;br /&gt;
      &amp;quot;visible&amp;quot;: true,&lt;br /&gt;
&lt;br /&gt;
=== header-text ===&lt;br /&gt;
&lt;br /&gt;
Allows the default header text to be ovwerridden at frame level. If this is left blank the default header will be used, see configuration.&lt;br /&gt;
&lt;br /&gt;
      &amp;quot;header-text&amp;quot;: &amp;quot;[Y]MICRONETn 800 (C)&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
=== cost ===&lt;br /&gt;
&lt;br /&gt;
      &amp;quot;cost&amp;quot;: 0,&lt;br /&gt;
&lt;br /&gt;
=== frame-type ===&lt;br /&gt;
&lt;br /&gt;
The API supports the following frame types ''initial'', ''mainindex'', ''information'', ''exit'', ''gateway'', ''test'' and ''response''.&lt;br /&gt;
&lt;br /&gt;
      &amp;quot;frame-type&amp;quot;: &amp;quot;information&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
* '''initial''': This frame type is used on the start page, see [[Configuration Options]]. Typically only one of these frames would exist within a system.&lt;br /&gt;
* '''mainindex''': This frame type is used on the main index page. , see [[Configuration Options]]. Only one of these frames should exist within a system.&lt;br /&gt;
* '''information''': This frame type is used for all normal content frames.&lt;br /&gt;
* '''exit''': This frame type is used for an exit page, any number of exit pages can be defined. When an exit page is rendered it will close the connection.&lt;br /&gt;
* '''gateway''': This page type is used to define a gateway page and is used in conjunction with the connection element (see below).&lt;br /&gt;
* '''test''': This page type indicates a test page and prevents navigation and system messages from being shown. this is typically used for frames that need to use the whole display such as 'test cards' etc.&lt;br /&gt;
* '''telesoftware''': Telesoftware frames (see [[Telesoftware]]).&lt;br /&gt;
* '''response''': This frame type is used for response frames. See [[Implementing Response Frames]].&lt;br /&gt;
* '''system''': Reserved for use internally.&lt;br /&gt;
* '''exception''': Reserved for use internally.&lt;br /&gt;
&lt;br /&gt;
=== redirect ===&lt;br /&gt;
 &lt;br /&gt;
If set it simply means that the user is redirected to the specified frame. This can be a useful alternative form of navigation to the routing table.&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;redirect&amp;quot;: {&lt;br /&gt;
            &amp;quot;page-no&amp;quot;: 9,&lt;br /&gt;
            &amp;quot;frame-id&amp;quot;: &amp;quot;a&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
&lt;br /&gt;
=== content ===&lt;br /&gt;
&lt;br /&gt;
These elements define the content. The example below shows the content.type to be an edit.tf url. The available types are shown below.&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;content&amp;quot;: {&lt;br /&gt;
            &amp;quot;data&amp;quot;: &amp;quot;https://edit.tf/#0:QIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgc4UCBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQICixYsWLFixYsWLFixYsWLFixYsWLFixYsWLFixYsWLFixYgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAxQIIs6PJnRYtKTOjoKkWnUQUIMeLTQIECBAgQIECBAgQIEDRAgp2adSLNQSZ0aegQIECBAgQIECBAgQIECBAgQIECBAgQNkCCPBqRa8GygpxaVaTDi00CBAgQIECBAgQIECBAgQIECBA4QIIc-dUgw6iCJFqQZMymgQIECBAgQIECBAgQIECBAgQIEDlAgmT46CfOQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQMECCZPjoJ8aMgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQICixYsWLFixYsWLFixYsWLFixYsWLFixYsWLFixYsWLFixYgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECAFUQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgBVAMUNMQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIAVQDFDTAlMPUQIECBAgQIECBAgQIECBAgQIECBAgQIECAFUAxQ0wJTD1A0EHSQIECBAgQIECBAgQIECBAgQIECBAgQIECANMCUw9QNBB0kCBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECAPUDQQdJAgQIECBAgQIECBAgQIECAosWLFixYsWLFixYsQIECAHSQIECAosWLFixYsWLFixYsWIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECA&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;edit.tf'&lt;br /&gt;
        },&lt;br /&gt;
&lt;br /&gt;
Content types:&lt;br /&gt;
&lt;br /&gt;
* '''edit.tf''': If set, then the content will be treated as an edit.tf url. This is converted to RawV before being rendered.&lt;br /&gt;
* '''markup''': If set, then the content will be treated as ''markup'' content. Full details of ''markup'' can be found in the section [[Markup]]&lt;br /&gt;
* '''rawV''': If set, then the content will be treated as raw videotex data. This is 7bit (00-7F) videotex format with control chars between 00-1F and escaped codes for alpha and graphic attributes. Ideally rows should have any trailing spaces removed and replaced with with a CR/LF combination. This will be rendered as is.&lt;br /&gt;
* '''rawT''': If set, then the content will be treated as raw teletex data. This is a 24 x 40 block of 7 bits chars (960 chars) in Teletext format (range 00-7F). This format is used internally when manipulating page data. It will be converted to RawV before being rendered.&lt;br /&gt;
&lt;br /&gt;
=== title ===&lt;br /&gt;
&lt;br /&gt;
This sets the title of the page. In many cases this may be left blank with all of the content specified in the ''content'' section (see above) however, the ''title'' section gives additional flexibility when creating frames.&lt;br /&gt;
&lt;br /&gt;
Values for ''title-type'' are the same as defined for the content section, however, if the type ''edit-tf'' is used then only the first four (default) lines of the edit.tf defined page are used. &lt;br /&gt;
&lt;br /&gt;
Separating title from content in this way allows logos and header sections to be created for the title whilst using markup for the main content or visa-versa. &lt;br /&gt;
&lt;br /&gt;
==== Example 1 ====&lt;br /&gt;
&lt;br /&gt;
In thi example the fields are blank meaning that only the data in the ''content'' section is displayed.&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;title&amp;quot;: {&lt;br /&gt;
            &amp;quot;data&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
            &amp;quot;merge-data&amp;quot;: []&lt;br /&gt;
        },&lt;br /&gt;
&lt;br /&gt;
==== Example 2 ====&lt;br /&gt;
&lt;br /&gt;
In this example, the top 4 lines of the edit.tf content is displayed at the top of the page.&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;title&amp;quot;: {&lt;br /&gt;
            &amp;quot;data&amp;quot;: &amp;quot;https://edit.tf/#0:QIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECAvobotqBX__oECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIC_9AgQIEGv-gQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgL_0Cj4kQav6BAgQIECBAgQIECBAgQIECBAgQIECBAgQIECAuq64P6Dx__oECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECA&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;edit.tf&amp;quot;,&lt;br /&gt;
            &amp;quot;merge-data&amp;quot;: []&lt;br /&gt;
        },&lt;br /&gt;
&lt;br /&gt;
To take the top 5 lines, the ''type'' field can be extended as follows.&lt;br /&gt;
&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;edit.tf,5&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Note that this extended form of ''type'' only applies to edit.tf types.&lt;br /&gt;
&lt;br /&gt;
==== Example 3 ===&lt;br /&gt;
&lt;br /&gt;
The merge data field can be used to add ''layers'' of markup data to the title area. For example the example above shows the Guardian logo. To add some alphagraphics text to this, an additional layer could be used e.g.&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;title&amp;quot;: {&lt;br /&gt;
            &amp;quot;data&amp;quot;: &amp;quot;https://edit.tf/#0:QIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECAvobotqBX__oECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIC_9AgQIEGv-gQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgL_0Cj4kQav6BAgQIECBAgQIECBAgQIECBAgQIECBAgQIECAuq64P6Dx__oECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECA&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;edit.tf,5&amp;quot;,&lt;br /&gt;
            &amp;quot;merge-data&amp;quot;: [&lt;br /&gt;
                &amp;quot;[w[             UK News]]&amp;quot;&lt;br /&gt;
            ]&lt;br /&gt;
        },&lt;br /&gt;
&lt;br /&gt;
Note that any number of layers can be added, however, the merge layer must be defined as markup.&lt;br /&gt;
&lt;br /&gt;
=== routing table ===&lt;br /&gt;
&lt;br /&gt;
The routing table defines which pages are navigated to when a user presses a key whilst viewing the frame. The table has 11 entries with the first 10 representing the keys 0-9, the final entry refers to the ''hash'' (return) key.&lt;br /&gt;
&lt;br /&gt;
The example below shows the default routing table for frame 9a. If the user is viewing this frame and presses 1 the frame 91a will be loaded, assuming it exists. Pressing the ''hash'' (return) key will take the user back to frame 0a, the main index.&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;routing-table&amp;quot;: [&lt;br /&gt;
            90,&lt;br /&gt;
            91,&lt;br /&gt;
            92,&lt;br /&gt;
            93,&lt;br /&gt;
            94,&lt;br /&gt;
            95,&lt;br /&gt;
            96,&lt;br /&gt;
            97,&lt;br /&gt;
            98,&lt;br /&gt;
            99,&lt;br /&gt;
            0&lt;br /&gt;
        ],&lt;br /&gt;
&lt;br /&gt;
=== cursor ===&lt;br /&gt;
&lt;br /&gt;
This element determines whether a cursor is shown on the page. Typically a cursor would only be shown on response frames.&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;cursor&amp;quot;: false,&lt;br /&gt;
        &lt;br /&gt;
=== connection ===&lt;br /&gt;
&lt;br /&gt;
This elements specifies the connection object used for gateway pages.&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;connection&amp;quot;: {&lt;br /&gt;
            &amp;quot;address&amp;quot;: &amp;quot;fish.ccl4.org&amp;quot;,&lt;br /&gt;
            &amp;quot;mode&amp;quot;: &amp;quot;viewdata&amp;quot;,&lt;br /&gt;
            &amp;quot;port&amp;quot;: 23&lt;br /&gt;
        },&lt;br /&gt;
&lt;br /&gt;
The values for ''address and port'' represent the endpoint of the system being accessed and the value for ''mode'' determines how the system is accessed, the options are:&lt;br /&gt;
&lt;br /&gt;
    viewdata&lt;br /&gt;
    full_duplex&lt;br /&gt;
    full_duplex_no_echo&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== author-id ===&lt;br /&gt;
&lt;br /&gt;
This is an optional field that can be used to indicate the author of the page or other source.&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;author-id&amp;quot;: &amp;quot;john&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
=== response-data ===&lt;br /&gt;
&lt;br /&gt;
These fields should be used when the frame type is set to be a ''response-frame''. &lt;br /&gt;
&lt;br /&gt;
There are two main sections, ''response-data'' and ''response-action''. Below is an example of a response frame used for the Telstar weather page. The frame is created in the normal way using ''markup'' or ''edit.tf''. In this example the text ''Town/Cty'' has been positioned near the centre of the page. Immediately to the right of this is a field for the user to enter either a Town or City, the ''response-data'' section defines that field. Once the user submits the frame the section ''response-action'' determines what happens. In the example here a binary file (''telstar-openweather-linux-amd64''), stored in the containers volume directory is executed with a single argument (''myopenweatherapikey''). Note that the ''post-action-frame'' is set to 290b, in this example frame 290b is dynamically generated by the binary file ''telstar-openweather-linux-amd64'' and contains the weather forecast.&lt;br /&gt;
&lt;br /&gt;
Full details of how to implement response frames are detailed in the section [[Implementing Response Frames]].&lt;br /&gt;
    &amp;quot;response-data&amp;quot;: {&lt;br /&gt;
        &amp;quot;response-fields&amp;quot;: [&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;vpos&amp;quot;: 8,&lt;br /&gt;
                &amp;quot;hpos&amp;quot;: 4,&lt;br /&gt;
                &amp;quot;required&amp;quot;: true,&lt;br /&gt;
                &amp;quot;length&amp;quot;: 16,&lt;br /&gt;
                &amp;quot;type&amp;quot;: &amp;quot;alphanumeric&amp;quot;,&lt;br /&gt;
                &amp;quot;auto-submit&amp;quot;: false,&lt;br /&gt;
                &amp;quot;password&amp;quot;: false&lt;br /&gt;
            }&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;response-action&amp;quot;: {&lt;br /&gt;
            &amp;quot;exec&amp;quot;: &amp;quot;/opt/telstar/volume/telstar-openweather-linux-amd64&amp;quot;,&lt;br /&gt;
            &amp;quot;args&amp;quot;: [&lt;br /&gt;
                &amp;quot;myopenweatherapikey&amp;quot;&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;post-action-frame&amp;quot;: {&lt;br /&gt;
                &amp;quot;page-no&amp;quot;: 290,&lt;br /&gt;
                &amp;quot;frame-id&amp;quot;: &amp;quot;c&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
=== navmessage-select ===&lt;br /&gt;
&lt;br /&gt;
Allows the ''navigation'' system message to be customised at frame level. In most cases this can be left blank in order that the system default is used instead, see [[Configuration Options]].&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;navmessage-select&amp;quot;: &amp;quot;[B][n][Y]Select item or[W]*page# : [_+]&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
=== navmessage-notfound ===&lt;br /&gt;
&lt;br /&gt;
Allows the ''not found'' system message to be customised at frame level. In most cases this can be left blank in order that the system default is used instead, see [[Configuration Options]].&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;navmessage-notfound&amp;quot;: &amp;quot;[B][n][Y]Page not Found :[W]&amp;quot;&lt;/div&gt;</summary>
		<author><name>John</name></author>
	</entry>
	<entry>
		<id>https://wiki.glasstty.com/index.php?title=The_Telstar_API&amp;diff=322</id>
		<title>The Telstar API</title>
		<link rel="alternate" type="text/html" href="https://wiki.glasstty.com/index.php?title=The_Telstar_API&amp;diff=322"/>
		<updated>2022-04-16T08:46:52Z</updated>

		<summary type="html">&lt;p&gt;John: /* Creating the SSH Tunnel */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
Frames can be added to the system using either the Telstar API or by using a plug-in (see [[Implementing Response Frames]])&lt;br /&gt;
&lt;br /&gt;
The Telstar API, in conjunction with the cross platform Telstar Util software, provides a simple method of creating and managing pages. Data is passed to and from the API in JSON format, making the system very simple to use in any programming language.&lt;br /&gt;
&lt;br /&gt;
The API is a restful API that uses the GET, PUT and DELETE HTTP methods. This makes it a simple process to add new frames and update existing frames. In order to use the system a username and password combination is used to create a security token. This token is then used for subsequent requests to access the API (see below).&lt;br /&gt;
&lt;br /&gt;
Data is passed to and from the API in JSON format, making the system very simple to use in any programming language. The whole API could be used without any programming at all by using a command line utility such as CURL. To make things even simpler a *bash* utility called *telstar-util* is available that wraps *curl* making things even simpler.&lt;br /&gt;
&lt;br /&gt;
The utility ''telstar-util'' can be downloaded from a running server container (in this example called ''telstar-server'') using the following command&lt;br /&gt;
&lt;br /&gt;
    docker cp telstar-server:/opt/telstar/telstar-util-2.0.zip .&lt;br /&gt;
&lt;br /&gt;
Versions exist for Linux and MacOS (amd64 and arm64), and Windows (32 and 64 bit). Note that the MacOS version may need to have the quarantine attribute reset. e.g.&lt;br /&gt;
&lt;br /&gt;
    xattr -d com.apple.quarantine telstar-util&lt;br /&gt;
&lt;br /&gt;
The examples in this documentation demonstrate using the ''telstar-util'' command line utility.&lt;br /&gt;
&lt;br /&gt;
'''NOTE:'''&lt;br /&gt;
&lt;br /&gt;
The API will perform its actions on the secondary database of a Telstar system. Once a page has been created, updated or deleted on the secondary database, the API can be used to publish the changes to the primary database if required (see ''Publish'' below).&lt;br /&gt;
&lt;br /&gt;
== Initialising the API ==&lt;br /&gt;
&lt;br /&gt;
The Telstar API runs in a separate container. This uses the same base image but is started with a different parameter. e.g.&lt;br /&gt;
&lt;br /&gt;
    docker run --rm -d --name telstar-api --network telstar-network -p 8001:8001 -e TELSTAR_API_USERID=2222222222 -e TELSTAR_API_PASSWORD=1234 -e TELSTAR_COOKIE_SECRET=b6c7a826-96d6-4f45-88c4-3cf27cc2c647 johnnewcombe/telstar:amd64-2.0-RC3.4 api --port 8001 --init&lt;br /&gt;
&lt;br /&gt;
This will start an api server listening on port 8001. the --init parameter will create the root user (user 0) based on the specified environment variables.&lt;br /&gt;
&lt;br /&gt;
'''Remember to use a unique cookie secret for your system and keep it safe.''' The cookie secret is used to encrypt and decrypt the secure cookie within the telstar API. If this is made public, it may allow someone to create a valid authorisation cookie and impersonate a user of the system.&lt;br /&gt;
&lt;br /&gt;
== Authentication ==&lt;br /&gt;
&lt;br /&gt;
The docker command used above included the *--init* parameter, this parameter creates a user based on the values specified in the following environment variables.&lt;br /&gt;
&lt;br /&gt;
    TELSTAR_API_USERID&lt;br /&gt;
    TELSTAR_API_PASSWORD&lt;br /&gt;
&lt;br /&gt;
Typically this will be used to create the ''root'' user (user 0) and this is demonstrated in the docker-compose example ([[Orchestrating Telstar with Docker Compose]]) User ''0'' is a special user that has read, write and delete accesss to all pages within the system. Other users can be defined that have access to a specific group of pages.&lt;br /&gt;
&lt;br /&gt;
All API users are common across primary and secondary databases. For example the user ID 500, will have access to pages 500 including all decendants e.g. 5001-5009, 50011, 50021, 500111 etc. on both primary and secondary databases.&lt;br /&gt;
&lt;br /&gt;
Once a User ID has been created it can be used to obtain a token. This token is then used in subsequent calls to the API. For example to access the API running on the local host, with the user ID specified above, the following ''telstar-util'' command could be used.&lt;br /&gt;
&lt;br /&gt;
    telstar-util login localhost:8080 0 telstarapisecret&lt;br /&gt;
&lt;br /&gt;
The important thing to note here is that cookies are saved to the file ''telstar-util.tok''. This file contains the secure token. Subsequent requests to the API will forward the token in the request.&lt;br /&gt;
&lt;br /&gt;
## Retrievings Frames (GET)&lt;br /&gt;
&lt;br /&gt;
Once authorised, any frame can be retrieved with a simple GET request.&lt;br /&gt;
&lt;br /&gt;
The frame will be returned and redirected to the file *500a.json*.&lt;br /&gt;
&lt;br /&gt;
    telstar-util getframe localhost:8080 500a &amp;gt; 500a.json&lt;br /&gt;
&lt;br /&gt;
== Frames and JSON ==&lt;br /&gt;
&lt;br /&gt;
The simplest frame that can be viewed on TELSTAR could be defined as follows.&lt;br /&gt;
&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;pid&amp;quot;: {&lt;br /&gt;
            &amp;quot;page-no&amp;quot;: 101,&lt;br /&gt;
            &amp;quot;frame-id&amp;quot;: &amp;quot;a&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;visible&amp;quot;: true&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
This frame, is so basic that it doesn't even have content. The frame below includes some flashing content.&lt;br /&gt;
&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;pid&amp;quot;: {&lt;br /&gt;
        &amp;quot;page-no&amp;quot;: 101,&lt;br /&gt;
        &amp;quot;frame-id&amp;quot;: &amp;quot;a&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;visible&amp;quot;: true,&lt;br /&gt;
      &amp;quot;content&amp;quot;: {&lt;br /&gt;
        &amp;quot;data&amp;quot;: &amp;quot;[D]This is page[F]101a&amp;quot;,&lt;br /&gt;
         &amp;quot;type&amp;quot;: &amp;quot;markup&amp;quot;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Shown below is a more complete example of a JSON defined frame. With this particular frame, the actual viewdata content has been created using the editor at [http://edit.tf](http://edit.tf), this can be seen in the *content.data* and *content.type* keys. However, there are several ways to create frames other than using [http://edit.tf](http://edit.tf). For more details of the frame structure and the various settings please see [Frames in Detail](frames.md).&lt;br /&gt;
&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;pid&amp;quot;: {&lt;br /&gt;
        &amp;quot;page-no&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;frame-id&amp;quot;: &amp;quot;a&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;visible&amp;quot;: true,&lt;br /&gt;
      &amp;quot;frame-type&amp;quot;: &amp;quot;information&amp;quot;,&lt;br /&gt;
      &amp;quot;content&amp;quot;: {&lt;br /&gt;
        &amp;quot;data&amp;quot;: &amp;quot;http://edit.tf/#0:QIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQMMKAbNw6dyCTuyZfCBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgKJEiRIkSJEiRIkSJEiRIkSJEiRIkSJEiRIkSJEiRIkSJEiRAxQR4s6LSgzEEmdUi0otOogkzo0-lNg1JM-cCg8unNYgQIASBBj67OnXllWIMu7pl5dMOndty7uixBoy4dnTQsQIECBAgBIEHfLh2dNCDDuyINmnNl59POzKuQIECBAgQIECBAgQIECBAyQTotemggzoiCvFg1JEWkCnYemnfuw7EGHdkQIECBAgQIASBBp3dMvLdh6ad-7DsQbsvfmgw7siDvlw9NGXkuQIECBAgQM0EKrTkzotOmgkzo0-lNg1JM-cCh79vDDu8oMO7IgQIECAEgQYuvPTuy8-aDdl781wM6EjVKcVBMw9MvPogoctOPLzQIEDRBHn1otKdNizqiCTOjT6U2DUkz5wKlvw5OaxByw6dixAgBIEGHdkQUMPLZpw7cu7ouQIECBAgQIECBAgQIECBAgQIECBA2QR4NSLXg2UFOLSrSYcWmCnWKkWYsQVIsWNBsLEEOHMaIASBBh3ZEHTRlQQ9-zfz54diCHh7ZUGHJ2y7unXllXIECBAgQN0EifMkxINmmCqcsPbLsQYd2RBI37NOTD5QbsvfmuQIECBA4CHQc2TDpT50WogcMGCAScgoOnLTi69MqDpvQdNGnmgQIAaBBzy8u2nHlQd9PTQgqZdmXnvzdO-HllQYd2RBt38sq5AgQOQ0yfHQT40ZYgp2adSLNQSZ0aegTIKkWnUQUIMeLTQIECAokSJEiRIkSJEiRIkSJEiRIkSJEiRIkSJEiRIkSJEiRIkSJEFeLBqSItJBGn0osODTqIBIM6EQIEFDDnyoFTJywvoECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECA&amp;quot;,&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;edit.tf&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;routing-table&amp;quot;: [0,1,11,3,400,5,6,7,800,9,0],&lt;br /&gt;
      &amp;quot;cursor&amp;quot;: false,&lt;br /&gt;
      &amp;quot;author-id&amp;quot;: &amp;quot;editf-frame-generator&amp;quot;,&lt;br /&gt;
      &amp;quot;navmsg-forecolour&amp;quot;: &amp;quot;yellow&amp;quot;,&lt;br /&gt;
      &amp;quot;navmsg-backcolour&amp;quot;: &amp;quot;blue&amp;quot;,&lt;br /&gt;
      &amp;quot;navmsg-highlight&amp;quot;: &amp;quot;white&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
== Adding/Updating a Frame ==&lt;br /&gt;
&lt;br /&gt;
To add or update a frame the HTTP PUT request is used. If the frame already exists on TELSTAR the frame will be updated, if it does not exist then it will be created.&lt;br /&gt;
&lt;br /&gt;
The following *telstar-utility* command will send the json frame stored in the file *500a.json* to the Telstar API using the Http PUT method.&lt;br /&gt;
&lt;br /&gt;
    telstar-util addframe localhost:8080 500a.json&lt;br /&gt;
&lt;br /&gt;
== Deleting a Frame ==&lt;br /&gt;
&lt;br /&gt;
A frame can be deleted using the HTTP DELETE method.&lt;br /&gt;
&lt;br /&gt;
The following *telstar-utility* example will delete the frame 500a.&lt;br /&gt;
&lt;br /&gt;
    telstar-util deleteframe localhost:8080/frame/500a&lt;br /&gt;
&lt;br /&gt;
== Publish Changes ==&lt;br /&gt;
&lt;br /&gt;
As described previously, the API will perform its actions on the secondary database of a Telstar system.&lt;br /&gt;
&lt;br /&gt;
Once a page has been created, updated or deleted on the secondary database, the API can be used to *publish* the changes to the primary database if required.&lt;br /&gt;
&lt;br /&gt;
Publishing will update the primary database to that of the secondary for the specified frame. If the frame is deleted in the secondary and then published, it will be deleted in the primary also.&lt;br /&gt;
&lt;br /&gt;
The following *telstar-utility* command will publish the frame 500a.&lt;br /&gt;
&lt;br /&gt;
    telstar-util publish localhost:8080/frame/500a&lt;br /&gt;
&lt;br /&gt;
== Adding/Updating a User ==&lt;br /&gt;
&lt;br /&gt;
Each user ID typically gives access to a single information provider page. In the case of major providers this could be one of the three digit page numbers and everything beneath it. For example the user ID 500, will have access to pages 500 including all decendants e.g. 5001-5009, 50011, 50021, 500111 etc. but not 501 or 502.&lt;br /&gt;
&lt;br /&gt;
To add or update a user the HTTP PUT request is used. If the user already exists on TELSTAR the user will be updated, if it does not exist then it will be created.&lt;br /&gt;
&lt;br /&gt;
The following examples add the user 800800 to the system. Note that only the *root* user (user 0) can make user changes. All passwords are stored in hashed form.&lt;br /&gt;
&lt;br /&gt;
The following *telstar-utility* command will create the user *800800* with the password *mysecretpassword*.&lt;br /&gt;
&lt;br /&gt;
    telstar-util adduser localhost:8080 800800 mysecretpassword&lt;br /&gt;
&lt;br /&gt;
== Deleting a User ==&lt;br /&gt;
&lt;br /&gt;
The following examples delete the user 800800 from the system using the HTTP DELETE method. Note that only the *root* user (user 0) can make user changes.&lt;br /&gt;
&lt;br /&gt;
The following *telstar-utility* command will delete the user *800800*.&lt;br /&gt;
&lt;br /&gt;
    telstar-util deleteuser localhost:8080 800800&lt;br /&gt;
&lt;br /&gt;
== Using an SSH Tunnel ==&lt;br /&gt;
&lt;br /&gt;
The API could be kept private from the public and accessed using an SSH tunnel.&lt;br /&gt;
&lt;br /&gt;
From a local machine execute the following command, changing the user and server to suit your own setup.&lt;br /&gt;
&lt;br /&gt;
    ssh -L [LOCAL_IP:]LOCAL_PORT:DESTINATION:DESTINATION_PORT [USER@]SSH_SERVER&lt;br /&gt;
&lt;br /&gt;
For example if the Telstar server was myserver.co.uk, you could use.&lt;br /&gt;
&lt;br /&gt;
    ssh -L 8002:myserver.co.uk:8001 john@myserver.co.uk&lt;br /&gt;
&lt;br /&gt;
The above example creates an SSH connection to a server at ''myserver.co.uk'' using the username ''john''. An SSH certificate is used to access the server so no password is needed. In the command the ports are mapped such that the local port 8002, is mapped to the remote port 8001.&lt;br /&gt;
&lt;br /&gt;
The API is listening by default on port 8001 on the remote server. After executing the above command, the API can be accessed using the url http//localhost:8002 on the local machine.&lt;/div&gt;</summary>
		<author><name>John</name></author>
	</entry>
	<entry>
		<id>https://wiki.glasstty.com/index.php?title=The_Telstar_API&amp;diff=321</id>
		<title>The Telstar API</title>
		<link rel="alternate" type="text/html" href="https://wiki.glasstty.com/index.php?title=The_Telstar_API&amp;diff=321"/>
		<updated>2022-04-16T08:46:32Z</updated>

		<summary type="html">&lt;p&gt;John: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
Frames can be added to the system using either the Telstar API or by using a plug-in (see [[Implementing Response Frames]])&lt;br /&gt;
&lt;br /&gt;
The Telstar API, in conjunction with the cross platform Telstar Util software, provides a simple method of creating and managing pages. Data is passed to and from the API in JSON format, making the system very simple to use in any programming language.&lt;br /&gt;
&lt;br /&gt;
The API is a restful API that uses the GET, PUT and DELETE HTTP methods. This makes it a simple process to add new frames and update existing frames. In order to use the system a username and password combination is used to create a security token. This token is then used for subsequent requests to access the API (see below).&lt;br /&gt;
&lt;br /&gt;
Data is passed to and from the API in JSON format, making the system very simple to use in any programming language. The whole API could be used without any programming at all by using a command line utility such as CURL. To make things even simpler a *bash* utility called *telstar-util* is available that wraps *curl* making things even simpler.&lt;br /&gt;
&lt;br /&gt;
The utility ''telstar-util'' can be downloaded from a running server container (in this example called ''telstar-server'') using the following command&lt;br /&gt;
&lt;br /&gt;
    docker cp telstar-server:/opt/telstar/telstar-util-2.0.zip .&lt;br /&gt;
&lt;br /&gt;
Versions exist for Linux and MacOS (amd64 and arm64), and Windows (32 and 64 bit). Note that the MacOS version may need to have the quarantine attribute reset. e.g.&lt;br /&gt;
&lt;br /&gt;
    xattr -d com.apple.quarantine telstar-util&lt;br /&gt;
&lt;br /&gt;
The examples in this documentation demonstrate using the ''telstar-util'' command line utility.&lt;br /&gt;
&lt;br /&gt;
'''NOTE:'''&lt;br /&gt;
&lt;br /&gt;
The API will perform its actions on the secondary database of a Telstar system. Once a page has been created, updated or deleted on the secondary database, the API can be used to publish the changes to the primary database if required (see ''Publish'' below).&lt;br /&gt;
&lt;br /&gt;
== Initialising the API ==&lt;br /&gt;
&lt;br /&gt;
The Telstar API runs in a separate container. This uses the same base image but is started with a different parameter. e.g.&lt;br /&gt;
&lt;br /&gt;
    docker run --rm -d --name telstar-api --network telstar-network -p 8001:8001 -e TELSTAR_API_USERID=2222222222 -e TELSTAR_API_PASSWORD=1234 -e TELSTAR_COOKIE_SECRET=b6c7a826-96d6-4f45-88c4-3cf27cc2c647 johnnewcombe/telstar:amd64-2.0-RC3.4 api --port 8001 --init&lt;br /&gt;
&lt;br /&gt;
This will start an api server listening on port 8001. the --init parameter will create the root user (user 0) based on the specified environment variables.&lt;br /&gt;
&lt;br /&gt;
'''Remember to use a unique cookie secret for your system and keep it safe.''' The cookie secret is used to encrypt and decrypt the secure cookie within the telstar API. If this is made public, it may allow someone to create a valid authorisation cookie and impersonate a user of the system.&lt;br /&gt;
&lt;br /&gt;
== Authentication ==&lt;br /&gt;
&lt;br /&gt;
The docker command used above included the *--init* parameter, this parameter creates a user based on the values specified in the following environment variables.&lt;br /&gt;
&lt;br /&gt;
    TELSTAR_API_USERID&lt;br /&gt;
    TELSTAR_API_PASSWORD&lt;br /&gt;
&lt;br /&gt;
Typically this will be used to create the ''root'' user (user 0) and this is demonstrated in the docker-compose example ([[Orchestrating Telstar with Docker Compose]]) User ''0'' is a special user that has read, write and delete accesss to all pages within the system. Other users can be defined that have access to a specific group of pages.&lt;br /&gt;
&lt;br /&gt;
All API users are common across primary and secondary databases. For example the user ID 500, will have access to pages 500 including all decendants e.g. 5001-5009, 50011, 50021, 500111 etc. on both primary and secondary databases.&lt;br /&gt;
&lt;br /&gt;
Once a User ID has been created it can be used to obtain a token. This token is then used in subsequent calls to the API. For example to access the API running on the local host, with the user ID specified above, the following ''telstar-util'' command could be used.&lt;br /&gt;
&lt;br /&gt;
    telstar-util login localhost:8080 0 telstarapisecret&lt;br /&gt;
&lt;br /&gt;
The important thing to note here is that cookies are saved to the file ''telstar-util.tok''. This file contains the secure token. Subsequent requests to the API will forward the token in the request.&lt;br /&gt;
&lt;br /&gt;
## Retrievings Frames (GET)&lt;br /&gt;
&lt;br /&gt;
Once authorised, any frame can be retrieved with a simple GET request.&lt;br /&gt;
&lt;br /&gt;
The frame will be returned and redirected to the file *500a.json*.&lt;br /&gt;
&lt;br /&gt;
    telstar-util getframe localhost:8080 500a &amp;gt; 500a.json&lt;br /&gt;
&lt;br /&gt;
== Frames and JSON ==&lt;br /&gt;
&lt;br /&gt;
The simplest frame that can be viewed on TELSTAR could be defined as follows.&lt;br /&gt;
&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;pid&amp;quot;: {&lt;br /&gt;
            &amp;quot;page-no&amp;quot;: 101,&lt;br /&gt;
            &amp;quot;frame-id&amp;quot;: &amp;quot;a&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;visible&amp;quot;: true&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
This frame, is so basic that it doesn't even have content. The frame below includes some flashing content.&lt;br /&gt;
&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;pid&amp;quot;: {&lt;br /&gt;
        &amp;quot;page-no&amp;quot;: 101,&lt;br /&gt;
        &amp;quot;frame-id&amp;quot;: &amp;quot;a&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;visible&amp;quot;: true,&lt;br /&gt;
      &amp;quot;content&amp;quot;: {&lt;br /&gt;
        &amp;quot;data&amp;quot;: &amp;quot;[D]This is page[F]101a&amp;quot;,&lt;br /&gt;
         &amp;quot;type&amp;quot;: &amp;quot;markup&amp;quot;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Shown below is a more complete example of a JSON defined frame. With this particular frame, the actual viewdata content has been created using the editor at [http://edit.tf](http://edit.tf), this can be seen in the *content.data* and *content.type* keys. However, there are several ways to create frames other than using [http://edit.tf](http://edit.tf). For more details of the frame structure and the various settings please see [Frames in Detail](frames.md).&lt;br /&gt;
&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;pid&amp;quot;: {&lt;br /&gt;
        &amp;quot;page-no&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;frame-id&amp;quot;: &amp;quot;a&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;visible&amp;quot;: true,&lt;br /&gt;
      &amp;quot;frame-type&amp;quot;: &amp;quot;information&amp;quot;,&lt;br /&gt;
      &amp;quot;content&amp;quot;: {&lt;br /&gt;
        &amp;quot;data&amp;quot;: &amp;quot;http://edit.tf/#0:QIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQMMKAbNw6dyCTuyZfCBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgKJEiRIkSJEiRIkSJEiRIkSJEiRIkSJEiRIkSJEiRIkSJEiRAxQR4s6LSgzEEmdUi0otOogkzo0-lNg1JM-cCg8unNYgQIASBBj67OnXllWIMu7pl5dMOndty7uixBoy4dnTQsQIECBAgBIEHfLh2dNCDDuyINmnNl59POzKuQIECBAgQIECBAgQIECBAyQTotemggzoiCvFg1JEWkCnYemnfuw7EGHdkQIECBAgQIASBBp3dMvLdh6ad-7DsQbsvfmgw7siDvlw9NGXkuQIECBAgQM0EKrTkzotOmgkzo0-lNg1JM-cCh79vDDu8oMO7IgQIECAEgQYuvPTuy8-aDdl781wM6EjVKcVBMw9MvPogoctOPLzQIEDRBHn1otKdNizqiCTOjT6U2DUkz5wKlvw5OaxByw6dixAgBIEGHdkQUMPLZpw7cu7ouQIECBAgQIECBAgQIECBAgQIECBA2QR4NSLXg2UFOLSrSYcWmCnWKkWYsQVIsWNBsLEEOHMaIASBBh3ZEHTRlQQ9-zfz54diCHh7ZUGHJ2y7unXllXIECBAgQN0EifMkxINmmCqcsPbLsQYd2RBI37NOTD5QbsvfmuQIECBA4CHQc2TDpT50WogcMGCAScgoOnLTi69MqDpvQdNGnmgQIAaBBzy8u2nHlQd9PTQgqZdmXnvzdO-HllQYd2RBt38sq5AgQOQ0yfHQT40ZYgp2adSLNQSZ0aegTIKkWnUQUIMeLTQIECAokSJEiRIkSJEiRIkSJEiRIkSJEiRIkSJEiRIkSJEiRIkSJEFeLBqSItJBGn0osODTqIBIM6EQIEFDDnyoFTJywvoECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECA&amp;quot;,&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;edit.tf&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;routing-table&amp;quot;: [0,1,11,3,400,5,6,7,800,9,0],&lt;br /&gt;
      &amp;quot;cursor&amp;quot;: false,&lt;br /&gt;
      &amp;quot;author-id&amp;quot;: &amp;quot;editf-frame-generator&amp;quot;,&lt;br /&gt;
      &amp;quot;navmsg-forecolour&amp;quot;: &amp;quot;yellow&amp;quot;,&lt;br /&gt;
      &amp;quot;navmsg-backcolour&amp;quot;: &amp;quot;blue&amp;quot;,&lt;br /&gt;
      &amp;quot;navmsg-highlight&amp;quot;: &amp;quot;white&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
== Adding/Updating a Frame ==&lt;br /&gt;
&lt;br /&gt;
To add or update a frame the HTTP PUT request is used. If the frame already exists on TELSTAR the frame will be updated, if it does not exist then it will be created.&lt;br /&gt;
&lt;br /&gt;
The following *telstar-utility* command will send the json frame stored in the file *500a.json* to the Telstar API using the Http PUT method.&lt;br /&gt;
&lt;br /&gt;
    telstar-util addframe localhost:8080 500a.json&lt;br /&gt;
&lt;br /&gt;
== Deleting a Frame ==&lt;br /&gt;
&lt;br /&gt;
A frame can be deleted using the HTTP DELETE method.&lt;br /&gt;
&lt;br /&gt;
The following *telstar-utility* example will delete the frame 500a.&lt;br /&gt;
&lt;br /&gt;
    telstar-util deleteframe localhost:8080/frame/500a&lt;br /&gt;
&lt;br /&gt;
== Publish Changes ==&lt;br /&gt;
&lt;br /&gt;
As described previously, the API will perform its actions on the secondary database of a Telstar system.&lt;br /&gt;
&lt;br /&gt;
Once a page has been created, updated or deleted on the secondary database, the API can be used to *publish* the changes to the primary database if required.&lt;br /&gt;
&lt;br /&gt;
Publishing will update the primary database to that of the secondary for the specified frame. If the frame is deleted in the secondary and then published, it will be deleted in the primary also.&lt;br /&gt;
&lt;br /&gt;
The following *telstar-utility* command will publish the frame 500a.&lt;br /&gt;
&lt;br /&gt;
    telstar-util publish localhost:8080/frame/500a&lt;br /&gt;
&lt;br /&gt;
== Adding/Updating a User ==&lt;br /&gt;
&lt;br /&gt;
Each user ID typically gives access to a single information provider page. In the case of major providers this could be one of the three digit page numbers and everything beneath it. For example the user ID 500, will have access to pages 500 including all decendants e.g. 5001-5009, 50011, 50021, 500111 etc. but not 501 or 502.&lt;br /&gt;
&lt;br /&gt;
To add or update a user the HTTP PUT request is used. If the user already exists on TELSTAR the user will be updated, if it does not exist then it will be created.&lt;br /&gt;
&lt;br /&gt;
The following examples add the user 800800 to the system. Note that only the *root* user (user 0) can make user changes. All passwords are stored in hashed form.&lt;br /&gt;
&lt;br /&gt;
The following *telstar-utility* command will create the user *800800* with the password *mysecretpassword*.&lt;br /&gt;
&lt;br /&gt;
    telstar-util adduser localhost:8080 800800 mysecretpassword&lt;br /&gt;
&lt;br /&gt;
== Deleting a User ==&lt;br /&gt;
&lt;br /&gt;
The following examples delete the user 800800 from the system using the HTTP DELETE method. Note that only the *root* user (user 0) can make user changes.&lt;br /&gt;
&lt;br /&gt;
The following *telstar-utility* command will delete the user *800800*.&lt;br /&gt;
&lt;br /&gt;
    telstar-util deleteuser localhost:8080 800800&lt;br /&gt;
&lt;br /&gt;
== Creating the SSH Tunnel ==&lt;br /&gt;
&lt;br /&gt;
The API could be kept private from the public and accessed using an SSH tunnel.&lt;br /&gt;
&lt;br /&gt;
From a local machine execute the following command, changing the user and server to suit your own setup.&lt;br /&gt;
&lt;br /&gt;
    ssh -L [LOCAL_IP:]LOCAL_PORT:DESTINATION:DESTINATION_PORT [USER@]SSH_SERVER&lt;br /&gt;
&lt;br /&gt;
For example if the Telstar server was myserver.co.uk, you could use.&lt;br /&gt;
&lt;br /&gt;
    ssh -L 8002:myserver.co.uk:8001 john@myserver.co.uk&lt;br /&gt;
&lt;br /&gt;
The above example creates an SSH connection to a server at ''myserver.co.uk'' using the username ''john''. An SSH certificate is used to access the server so no password is needed. In the command the ports are mapped such that the local port 8002, is mapped to the remote port 8001.&lt;br /&gt;
&lt;br /&gt;
The API is listening by default on port 8001 on the remote server. After executing the above command, the API can be accessed using the url http//localhost:8002 on the local machine.&lt;/div&gt;</summary>
		<author><name>John</name></author>
	</entry>
	<entry>
		<id>https://wiki.glasstty.com/index.php?title=Orchestrating_Telstar_with_Docker_Compose&amp;diff=316</id>
		<title>Orchestrating Telstar with Docker Compose</title>
		<link rel="alternate" type="text/html" href="https://wiki.glasstty.com/index.php?title=Orchestrating_Telstar_with_Docker_Compose&amp;diff=316"/>
		<updated>2022-04-16T08:14:17Z</updated>

		<summary type="html">&lt;p&gt;John: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Docker Compose is a tool for defining and running multi-container Docker applications. With Compose, you use a YAML file to configure your application’s services. Then, with a single command, you create and start all the services from your configuration. Given that a YAML file has been defined and stored in ''docker-compoe.ymal'', the following command will start the docker containers.&lt;br /&gt;
&lt;br /&gt;
    $ docker-compose up -d&lt;br /&gt;
&lt;br /&gt;
To stop the containers, the following command can be used.&lt;br /&gt;
&lt;br /&gt;
    $ docker-compose down&lt;br /&gt;
&lt;br /&gt;
Full details of Docker Compose can be found at https://docs.docker.com/compose/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Example Docker Compose Yaml Files ==&lt;br /&gt;
&lt;br /&gt;
The following docker-compose yaml file can be used to manage the Telstar application and associated ''mongo'' database.&lt;br /&gt;
&lt;br /&gt;
    version: &amp;quot;3.8&amp;quot;&lt;br /&gt;
    services:&lt;br /&gt;
      telstar-01:&lt;br /&gt;
        container_name: &amp;quot;telstar-server&amp;quot;&lt;br /&gt;
        image: &amp;quot;johnnewcombe/telstar:amd64-2.0-RC3.4&amp;quot;&lt;br /&gt;
        command: &amp;quot;server --port 6512 --init&amp;quot;&lt;br /&gt;
        ports:&lt;br /&gt;
          - target: 6512&lt;br /&gt;
            published: 6512&lt;br /&gt;
        networks:&lt;br /&gt;
          - telstar-network&lt;br /&gt;
        volumes:&lt;br /&gt;
          - type: volume&lt;br /&gt;
          source: telstar-volume&lt;br /&gt;
          target: /opt/telstar/volume&lt;br /&gt;
        depends_on:&lt;br /&gt;
          - mongodb&lt;br /&gt;
        environment:&lt;br /&gt;
          - TELSTAR_SERVER_DISPLAY_NAME=AUSTEN&lt;br /&gt;
      mongodb:&lt;br /&gt;
        container_name: &amp;quot;telstar-mongo&amp;quot;&lt;br /&gt;
        image: &amp;quot;mongo&amp;quot;&lt;br /&gt;
        ports:&lt;br /&gt;
          - target: 27017&lt;br /&gt;
            published: 27017&lt;br /&gt;
        networks:&lt;br /&gt;
          telstar-network:&lt;br /&gt;
        environment:&lt;br /&gt;
          - MONGO_INITDB_ROOT_USERNAME=mongoadmin&lt;br /&gt;
          - MONGO_INITDB_ROOT_PASSWORD=secret&lt;br /&gt;
    networks:&lt;br /&gt;
      telstar-network:&lt;br /&gt;
        name: telstar-network&lt;br /&gt;
    volumes:&lt;br /&gt;
      telstar-volume:&lt;br /&gt;
        name: telstar-volume&lt;br /&gt;
&lt;br /&gt;
The following docker-compose file starts three Telstar servers all talking to the same database server, however the third server (telstar-server-03) includes an environment variable that ensures that it uses the ''secondary'' database. This ''secondary'' database collection is typically used to test content before publishing it to the primary database collection. Further details of all of the available environment variables can be found in the section [[Configuration Options]]. In addition, the Telstar API is launched as a separate container.&lt;br /&gt;
&lt;br /&gt;
    version: &amp;quot;3.8&amp;quot;&lt;br /&gt;
    services:&lt;br /&gt;
      telstar-01:&lt;br /&gt;
        container_name: &amp;quot;telstar-server-01&amp;quot;&lt;br /&gt;
        build: .&lt;br /&gt;
        image: &amp;quot;johnnewcombe/telstar:amd64-2.0-RC3.4&amp;quot;&lt;br /&gt;
        command: &amp;quot;server --port 6512 --init&amp;quot; # install to the primary database&lt;br /&gt;
        ports:&lt;br /&gt;
          - target: 6512&lt;br /&gt;
            published: 6512&lt;br /&gt;
        networks:&lt;br /&gt;
          - telstar-network&lt;br /&gt;
        volumes:&lt;br /&gt;
          - type: volume&lt;br /&gt;
          source: telstar-volume&lt;br /&gt;
          target: /opt/telstar/volume&lt;br /&gt;
        depends_on:&lt;br /&gt;
          - mongodb&lt;br /&gt;
        environment:&lt;br /&gt;
          - TELSTAR_SERVER_DISPLAY_NAME=AUSTEN&lt;br /&gt;
      telstar-02:&lt;br /&gt;
        container_name: &amp;quot;telstar-server-02&amp;quot;&lt;br /&gt;
        image: &amp;quot;johnnewcombe/telstar:amd64-2.0-RC3.4&amp;quot;&lt;br /&gt;
        command: &amp;quot;server --port 6513&amp;quot;&lt;br /&gt;
        ports:&lt;br /&gt;
          - target: 6513&lt;br /&gt;
            published: 6513&lt;br /&gt;
        networks:&lt;br /&gt;
          - telstar-network&lt;br /&gt;
        volumes:&lt;br /&gt;
          - type: volume&lt;br /&gt;
            source: telstar-volume&lt;br /&gt;
            target: /opt/telstar/volume&lt;br /&gt;
        depends_on:&lt;br /&gt;
          - mongodb&lt;br /&gt;
        environment:&lt;br /&gt;
          - TELSTAR_SERVER_DISPLAY_NAME=ELIOT&lt;br /&gt;
      telstar-03:&lt;br /&gt;
        container_name: &amp;quot;telstar-server-03&amp;quot;&lt;br /&gt;
        image: &amp;quot;johnnewcombe/telstar:amd64-2.0-RC3.4&amp;quot;&lt;br /&gt;
        command: &amp;quot;server --port 6514 --init&amp;quot; # install to the secondary database&lt;br /&gt;
        ports:&lt;br /&gt;
          - target: 6514&lt;br /&gt;
            published: 6514&lt;br /&gt;
        networks:&lt;br /&gt;
          - telstar-network&lt;br /&gt;
        volumes:&lt;br /&gt;
          - type: volume&lt;br /&gt;
            source: telstar-volume&lt;br /&gt;
            target: /opt/telstar/volume&lt;br /&gt;
        depends_on:&lt;br /&gt;
          - mongodb&lt;br /&gt;
        environment:&lt;br /&gt;
          - TELSTAR_SERVER_DISPLAY_NAME=HARDY&lt;br /&gt;
          - TELSTAR_DBCOLLECTION=SECONDARY&lt;br /&gt;
      telstar-api:&lt;br /&gt;
        container_name: &amp;quot;telstar-api&amp;quot;&lt;br /&gt;
        image: &amp;quot;johnnewcombe/telstar:amd64-2.0-RC3.4&amp;quot;&lt;br /&gt;
        command: &amp;quot;api --port 8001 --init&amp;quot;&lt;br /&gt;
        ports:&lt;br /&gt;
          - target: 8001&lt;br /&gt;
            published: 8001&lt;br /&gt;
        networks:&lt;br /&gt;
          - telstar-network&lt;br /&gt;
        depends_on:&lt;br /&gt;
          - mongodb&lt;br /&gt;
    environment:&lt;br /&gt;
      - TELSTAR_API_USERID=2222222222&lt;br /&gt;
      - TELSTAR_API_PASSWORD=1234&lt;br /&gt;
      - TELSTAR_COOKIE_SECRET=&amp;lt;place yout secret here&amp;gt; # define this for yourself and keep it secret, a GUID is a good option.&lt;br /&gt;
    mongodb:&lt;br /&gt;
      container_name: &amp;quot;telstar-mongo&amp;quot;&lt;br /&gt;
      image: &amp;quot;mongo&amp;quot;&lt;br /&gt;
      ports:&lt;br /&gt;
        - target: 27017&lt;br /&gt;
          published: 27017&lt;br /&gt;
      networks:&lt;br /&gt;
        telstar-network:&lt;br /&gt;
      environment:&lt;br /&gt;
        - MONGO_INITDB_ROOT_USERNAME=mongoadmin&lt;br /&gt;
        - MONGO_INITDB_ROOT_PASSWORD=secret&lt;br /&gt;
    networks:&lt;br /&gt;
      telstar-network:&lt;br /&gt;
        name: telstar-network&lt;br /&gt;
    volumes:&lt;br /&gt;
      telstar-volume:&lt;br /&gt;
        name: telstar-volume&lt;/div&gt;</summary>
		<author><name>John</name></author>
	</entry>
	<entry>
		<id>https://wiki.glasstty.com/index.php?title=Orchestrating_Telstar_with_Docker_Compose&amp;diff=313</id>
		<title>Orchestrating Telstar with Docker Compose</title>
		<link rel="alternate" type="text/html" href="https://wiki.glasstty.com/index.php?title=Orchestrating_Telstar_with_Docker_Compose&amp;diff=313"/>
		<updated>2022-04-15T08:17:01Z</updated>

		<summary type="html">&lt;p&gt;John: /* Example Docker Compose Yaml Files */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Example Docker Compose Yaml Files ==&lt;br /&gt;
&lt;br /&gt;
The following docker-compose yaml file can be used to manage the Telstar application and associated ''mongo'' database.&lt;br /&gt;
&lt;br /&gt;
    version: &amp;quot;3.8&amp;quot;&lt;br /&gt;
    services:&lt;br /&gt;
      telstar-01:&lt;br /&gt;
        container_name: &amp;quot;telstar-server&amp;quot;&lt;br /&gt;
        image: &amp;quot;johnnewcombe/telstar:amd64-2.0-RC3.4&amp;quot;&lt;br /&gt;
        command: &amp;quot;server --port 6512 --init&amp;quot;&lt;br /&gt;
        ports:&lt;br /&gt;
          - target: 6512&lt;br /&gt;
            published: 6512&lt;br /&gt;
        networks:&lt;br /&gt;
          - telstar-network&lt;br /&gt;
        volumes:&lt;br /&gt;
          - type: volume&lt;br /&gt;
          source: telstar-volume&lt;br /&gt;
          target: /opt/telstar/volume&lt;br /&gt;
        depends_on:&lt;br /&gt;
          - mongodb&lt;br /&gt;
        environment:&lt;br /&gt;
          - TELSTAR_SERVER_DISPLAY_NAME=AUSTEN&lt;br /&gt;
      mongodb:&lt;br /&gt;
        container_name: &amp;quot;telstar-mongo&amp;quot;&lt;br /&gt;
        image: &amp;quot;mongo&amp;quot;&lt;br /&gt;
        ports:&lt;br /&gt;
          - target: 27017&lt;br /&gt;
            published: 27017&lt;br /&gt;
        networks:&lt;br /&gt;
          telstar-network:&lt;br /&gt;
        environment:&lt;br /&gt;
          - MONGO_INITDB_ROOT_USERNAME=mongoadmin&lt;br /&gt;
          - MONGO_INITDB_ROOT_PASSWORD=secret&lt;br /&gt;
    networks:&lt;br /&gt;
      telstar-network:&lt;br /&gt;
        name: telstar-network&lt;br /&gt;
    volumes:&lt;br /&gt;
      telstar-volume:&lt;br /&gt;
        name: telstar-volume&lt;br /&gt;
&lt;br /&gt;
The following docker-compose file starts three Telstar servers all talking to the same database server, however the third server (telstar-server-03) includes an environment variable that ensures that it uses the ''secondary'' database. This ''secondary'' database collection is typically used to test content before publishing it to the primary database collection. Further details of all of the available environment variables can be found in the section [[Configuration Options]]. In addition, the Telstar API is launched as a separate container.&lt;br /&gt;
&lt;br /&gt;
    version: &amp;quot;3.8&amp;quot;&lt;br /&gt;
    services:&lt;br /&gt;
      telstar-01:&lt;br /&gt;
        container_name: &amp;quot;telstar-server-01&amp;quot;&lt;br /&gt;
        build: .&lt;br /&gt;
        image: &amp;quot;johnnewcombe/telstar:amd64-2.0-RC3.4&amp;quot;&lt;br /&gt;
        command: &amp;quot;server --port 6512 --init&amp;quot; # install to the primary database&lt;br /&gt;
        ports:&lt;br /&gt;
          - target: 6512&lt;br /&gt;
            published: 6512&lt;br /&gt;
        networks:&lt;br /&gt;
          - telstar-network&lt;br /&gt;
        volumes:&lt;br /&gt;
          - type: volume&lt;br /&gt;
          source: telstar-volume&lt;br /&gt;
          target: /opt/telstar/volume&lt;br /&gt;
        depends_on:&lt;br /&gt;
          - mongodb&lt;br /&gt;
        environment:&lt;br /&gt;
          - TELSTAR_SERVER_DISPLAY_NAME=AUSTEN&lt;br /&gt;
      telstar-02:&lt;br /&gt;
        container_name: &amp;quot;telstar-server-02&amp;quot;&lt;br /&gt;
        image: &amp;quot;johnnewcombe/telstar:amd64-2.0-RC3.4&amp;quot;&lt;br /&gt;
        command: &amp;quot;server --port 6513&amp;quot;&lt;br /&gt;
        ports:&lt;br /&gt;
          - target: 6513&lt;br /&gt;
            published: 6513&lt;br /&gt;
        networks:&lt;br /&gt;
          - telstar-network&lt;br /&gt;
        volumes:&lt;br /&gt;
          - type: volume&lt;br /&gt;
            source: telstar-volume&lt;br /&gt;
            target: /opt/telstar/volume&lt;br /&gt;
        depends_on:&lt;br /&gt;
          - mongodb&lt;br /&gt;
        environment:&lt;br /&gt;
          - TELSTAR_SERVER_DISPLAY_NAME=ELIOT&lt;br /&gt;
      telstar-03:&lt;br /&gt;
        container_name: &amp;quot;telstar-server-03&amp;quot;&lt;br /&gt;
        image: &amp;quot;johnnewcombe/telstar:amd64-2.0-RC3.4&amp;quot;&lt;br /&gt;
        command: &amp;quot;server --port 6514 --init&amp;quot; # install to the secondary database&lt;br /&gt;
        ports:&lt;br /&gt;
          - target: 6514&lt;br /&gt;
            published: 6514&lt;br /&gt;
        networks:&lt;br /&gt;
          - telstar-network&lt;br /&gt;
        volumes:&lt;br /&gt;
          - type: volume&lt;br /&gt;
            source: telstar-volume&lt;br /&gt;
            target: /opt/telstar/volume&lt;br /&gt;
        depends_on:&lt;br /&gt;
          - mongodb&lt;br /&gt;
        environment:&lt;br /&gt;
          - TELSTAR_SERVER_DISPLAY_NAME=HARDY&lt;br /&gt;
          - TELSTAR_DBCOLLECTION=SECONDARY&lt;br /&gt;
      telstar-api:&lt;br /&gt;
        container_name: &amp;quot;telstar-api&amp;quot;&lt;br /&gt;
        image: &amp;quot;johnnewcombe/telstar:amd64-2.0-RC3.4&amp;quot;&lt;br /&gt;
        command: &amp;quot;api --port 8001 --init&amp;quot;&lt;br /&gt;
        ports:&lt;br /&gt;
          - target: 8001&lt;br /&gt;
            published: 8001&lt;br /&gt;
        networks:&lt;br /&gt;
          - telstar-network&lt;br /&gt;
        depends_on:&lt;br /&gt;
          - mongodb&lt;br /&gt;
    environment:&lt;br /&gt;
      - TELSTAR_API_USERID=2222222222&lt;br /&gt;
      - TELSTAR_API_PASSWORD=1234&lt;br /&gt;
      - TELSTAR_COOKIE_SECRET=&amp;lt;place yout secret here&amp;gt; # define this for yourself and keep it secret, a GUID is a good option.&lt;br /&gt;
    mongodb:&lt;br /&gt;
      container_name: &amp;quot;telstar-mongo&amp;quot;&lt;br /&gt;
      image: &amp;quot;mongo&amp;quot;&lt;br /&gt;
      ports:&lt;br /&gt;
        - target: 27017&lt;br /&gt;
          published: 27017&lt;br /&gt;
      networks:&lt;br /&gt;
        telstar-network:&lt;br /&gt;
      environment:&lt;br /&gt;
        - MONGO_INITDB_ROOT_USERNAME=mongoadmin&lt;br /&gt;
        - MONGO_INITDB_ROOT_PASSWORD=secret&lt;br /&gt;
    networks:&lt;br /&gt;
      telstar-network:&lt;br /&gt;
        name: telstar-network&lt;br /&gt;
    volumes:&lt;br /&gt;
      telstar-volume:&lt;br /&gt;
        name: telstar-volume&lt;/div&gt;</summary>
		<author><name>John</name></author>
	</entry>
	<entry>
		<id>https://wiki.glasstty.com/index.php?title=Orchestrating_Telstar_with_Docker_Compose&amp;diff=312</id>
		<title>Orchestrating Telstar with Docker Compose</title>
		<link rel="alternate" type="text/html" href="https://wiki.glasstty.com/index.php?title=Orchestrating_Telstar_with_Docker_Compose&amp;diff=312"/>
		<updated>2022-04-15T08:14:46Z</updated>

		<summary type="html">&lt;p&gt;John: /* Example Docker Compose Yaml Files */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Example Docker Compose Yaml Files ==&lt;br /&gt;
&lt;br /&gt;
The following docker-compose yaml file can be used to manage the Telstar application and associated ''mongo'' database.&lt;br /&gt;
&lt;br /&gt;
    version: &amp;quot;3.8&amp;quot;&lt;br /&gt;
    services:&lt;br /&gt;
      telstar-01:&lt;br /&gt;
        container_name: &amp;quot;telstar-server&amp;quot;&lt;br /&gt;
        image: &amp;quot;johnnewcombe/telstar:amd64-2.0-RC3.4&amp;quot;&lt;br /&gt;
        command: &amp;quot;server --port 6512 --init&amp;quot;&lt;br /&gt;
        ports:&lt;br /&gt;
          - target: 6512&lt;br /&gt;
            published: 6512&lt;br /&gt;
        networks:&lt;br /&gt;
          - telstar-network&lt;br /&gt;
        volumes:&lt;br /&gt;
          - type: volume&lt;br /&gt;
          source: telstar-volume&lt;br /&gt;
          target: /opt/telstar/volume&lt;br /&gt;
        depends_on:&lt;br /&gt;
          - mongodb&lt;br /&gt;
        environment:&lt;br /&gt;
          - TELSTAR_SERVER_DISPLAY_NAME=AUSTEN&lt;br /&gt;
      mongodb:&lt;br /&gt;
        container_name: &amp;quot;telstar-mongo&amp;quot;&lt;br /&gt;
        image: &amp;quot;mongo&amp;quot;&lt;br /&gt;
        ports:&lt;br /&gt;
          - target: 27017&lt;br /&gt;
            published: 27017&lt;br /&gt;
        networks:&lt;br /&gt;
          telstar-network:&lt;br /&gt;
        environment:&lt;br /&gt;
          - MONGO_INITDB_ROOT_USERNAME=mongoadmin&lt;br /&gt;
          - MONGO_INITDB_ROOT_PASSWORD=secret&lt;br /&gt;
    networks:&lt;br /&gt;
      telstar-network:&lt;br /&gt;
        name: telstar-network&lt;br /&gt;
    volumes:&lt;br /&gt;
      telstar-volume:&lt;br /&gt;
        name: telstar-volume&lt;br /&gt;
&lt;br /&gt;
The following docker-compose file starts three Telstar servers all talking to the same database server, however the third server (telstar-server-03) includes an environment variable that ensures that it uses the ''secondary'' database. This ''secondary'' database collection is typically used to test content before publishing it to the primary database collection. Further details of all of the available environment variables can be found in the section [[Configuration Options]]. In addition, the Telstar API is launched as a separate container.&lt;br /&gt;
&lt;br /&gt;
    version: &amp;quot;3.8&amp;quot;&lt;br /&gt;
    services:&lt;br /&gt;
      telstar-01:&lt;br /&gt;
        container_name: &amp;quot;telstar-server-01&amp;quot;&lt;br /&gt;
        build: .&lt;br /&gt;
        image: &amp;quot;johnnewcombe/telstar:amd64-2.0-RC3.4&amp;quot;&lt;br /&gt;
        command: &amp;quot;server --port 6512 --init&amp;quot; # install to the primary database&lt;br /&gt;
        ports:&lt;br /&gt;
          - target: 6512&lt;br /&gt;
            published: 6512&lt;br /&gt;
        networks:&lt;br /&gt;
          - telstar-network&lt;br /&gt;
        volumes:&lt;br /&gt;
          - type: volume&lt;br /&gt;
          source: telstar-volume&lt;br /&gt;
          target: /opt/telstar/volume&lt;br /&gt;
        depends_on:&lt;br /&gt;
          - mongodb&lt;br /&gt;
        environment:&lt;br /&gt;
          - TELSTAR_SERVER_DISPLAY_NAME=AUSTEN&lt;br /&gt;
      telstar-02:&lt;br /&gt;
        container_name: &amp;quot;telstar-server-02&amp;quot;&lt;br /&gt;
        image: &amp;quot;johnnewcombe/telstar:amd64-2.0-RC3.4&amp;quot;&lt;br /&gt;
        command: &amp;quot;server --port 6513&amp;quot;&lt;br /&gt;
        ports:&lt;br /&gt;
          - target: 6513&lt;br /&gt;
            published: 6513&lt;br /&gt;
        networks:&lt;br /&gt;
          - telstar-network&lt;br /&gt;
        volumes:&lt;br /&gt;
          - type: volume&lt;br /&gt;
            source: telstar-volume&lt;br /&gt;
            target: /opt/telstar/volume&lt;br /&gt;
        depends_on:&lt;br /&gt;
          - mongodb&lt;br /&gt;
        environment:&lt;br /&gt;
          - TELSTAR_SERVER_DISPLAY_NAME=ELIOT&lt;br /&gt;
      telstar-03:&lt;br /&gt;
        container_name: &amp;quot;telstar-server-03&amp;quot;&lt;br /&gt;
        image: &amp;quot;johnnewcombe/telstar:amd64-2.0-RC3.4&amp;quot;&lt;br /&gt;
        command: &amp;quot;server --port 6514 --init&amp;quot; # install to the secondary database&lt;br /&gt;
        ports:&lt;br /&gt;
          - target: 6514&lt;br /&gt;
            published: 6514&lt;br /&gt;
        networks:&lt;br /&gt;
          - telstar-network&lt;br /&gt;
        volumes:&lt;br /&gt;
          - type: volume&lt;br /&gt;
            source: telstar-volume&lt;br /&gt;
            target: /opt/telstar/volume&lt;br /&gt;
        depends_on:&lt;br /&gt;
          - mongodb&lt;br /&gt;
        environment:&lt;br /&gt;
          - TELSTAR_SERVER_DISPLAY_NAME=HARDY&lt;br /&gt;
          - TELSTAR_DBCOLLECTION=SECONDARY&lt;br /&gt;
      telstar-api:&lt;br /&gt;
        container_name: &amp;quot;telstar-api&amp;quot;&lt;br /&gt;
        image: &amp;quot;johnnewcombe/telstar:amd64-2.0-RC3.4&amp;quot;&lt;br /&gt;
        command: &amp;quot;api --port 8001 --init&amp;quot;&lt;br /&gt;
        ports:&lt;br /&gt;
          - target: 8001&lt;br /&gt;
            published: 8001&lt;br /&gt;
        networks:&lt;br /&gt;
          - telstar-network&lt;br /&gt;
        depends_on:&lt;br /&gt;
          - mongodb&lt;br /&gt;
    environment:&lt;br /&gt;
      - TELSTAR_API_USERID=0 # User 0 has access to all pages&lt;br /&gt;
      - TELSTAR_API_PASSWORD=telstarapisecret&lt;br /&gt;
      - TELSTAR_COOKIE_SECRET=&amp;lt;place yout secret here&amp;gt; # define this for yourself and keep it secret!&lt;br /&gt;
    mongodb:&lt;br /&gt;
      container_name: &amp;quot;telstar-mongo&amp;quot;&lt;br /&gt;
      image: &amp;quot;mongo&amp;quot;&lt;br /&gt;
      ports:&lt;br /&gt;
        - target: 27017&lt;br /&gt;
          published: 27017&lt;br /&gt;
      networks:&lt;br /&gt;
        telstar-network:&lt;br /&gt;
      environment:&lt;br /&gt;
        - MONGO_INITDB_ROOT_USERNAME=mongoadmin&lt;br /&gt;
        - MONGO_INITDB_ROOT_PASSWORD=secret&lt;br /&gt;
    networks:&lt;br /&gt;
      telstar-network:&lt;br /&gt;
        name: telstar-network&lt;br /&gt;
    volumes:&lt;br /&gt;
      telstar-volume:&lt;br /&gt;
        name: telstar-volume&lt;/div&gt;</summary>
		<author><name>John</name></author>
	</entry>
	<entry>
		<id>https://wiki.glasstty.com/index.php?title=Frames&amp;diff=310</id>
		<title>Frames</title>
		<link rel="alternate" type="text/html" href="https://wiki.glasstty.com/index.php?title=Frames&amp;diff=310"/>
		<updated>2022-04-15T08:06:45Z</updated>

		<summary type="html">&lt;p&gt;John: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;As is typical with interactive videotex systems, pages are numbered from 0 to 999999999 and consist of one or more frames with the suffix a-z, for example the first frame for page 200 would be 200a, the second 200b and so on (see [[Routing]]) for more details). These frames are stored within TELSTAR's database as ''JSON'' objects (see https://www.json.org/) and uploaded to Telstar using a simple command line utility.&lt;br /&gt;
&lt;br /&gt;
The Telstar utility program simply interacts with the Telstar API which is a restful API. This can be used directly by any software making it simple to programitically manage pages and routing information.&lt;br /&gt;
&lt;br /&gt;
Frames are defined in JSON. The simplest frame that can be viewed on TELSTAR would be as follows. This would create a simple information frame with some flashing content. In this example [[Markup]] has been used within the content, however, other content types can be used including edi.tf urls, see below.&lt;br /&gt;
&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;pid&amp;quot;: {&lt;br /&gt;
        &amp;quot;page-no&amp;quot;: 101,&lt;br /&gt;
        &amp;quot;frame-id&amp;quot;: &amp;quot;a&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;visible&amp;quot;: true,&lt;br /&gt;
      &amp;quot;content&amp;quot;: {&lt;br /&gt;
        &amp;quot;data&amp;quot;: &amp;quot;[D]This is page[F]101a&amp;quot;,&lt;br /&gt;
         &amp;quot;type&amp;quot;: &amp;quot;markup&amp;quot;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Shown below is a more complete example of a JSON defined frame. With this particular frame, the actual viewdata content has been created using the editor at http://edit.tf, this can be seen in the ''content.data'' and ''content.type'' keys. The example below is a simple information page with some simple routing (see [[Routing]]). Clicking the ''content.data'' link, or pasteing the value into a browser will show the page and allow it to be edited. It is not necessary to use the http://edit.tf editor, this is just one possible option.&lt;br /&gt;
&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;pid&amp;quot;: {&lt;br /&gt;
        &amp;quot;page-no&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;frame-id&amp;quot;: &amp;quot;a&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;visible&amp;quot;: true,&lt;br /&gt;
      &amp;quot;frame-type&amp;quot;: &amp;quot;information&amp;quot;,&lt;br /&gt;
      &amp;quot;content&amp;quot;: {&lt;br /&gt;
        &amp;quot;data&amp;quot;: &amp;quot;http://edit.tf/#0:QIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQMMKAbNw6dyCTuyZfCBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgKJEiRIkSJEiRIkSJEiRIkSJEiRIkSJEiRIkSJEiRIkSJEiRAxQR4s6LSgzEEmdUi0otOogkzo0-lNg1JM-cCg8unNYgQIASBBj67OnXllWIMu7pl5dMOndty7uixBoy4dnTQsQIECBAgBIEHfLh2dNCDDuyINmnNl59POzKuQIECBAgQIECBAgQIECBAyQTotemggzoiCvFg1JEWkCnYemnfuw7EGHdkQIECBAgQIASBBp3dMvLdh6ad-7DsQbsvfmgw7siDvlw9NGXkuQIECBAgQM0EKrTkzotOmgkzo0-lNg1JM-cCh79vDDu8oMO7IgQIECAEgQYuvPTuy8-aDdl781wM6EjVKcVBMw9MvPogoctOPLzQIEDRBHn1otKdNizqiCTOjT6U2DUkz5wKlvw5OaxByw6dixAgBIEGHdkQUMPLZpw7cu7ouQIECBAgQIECBAgQIECBAgQIECBA2QR4NSLXg2UFOLSrSYcWmCnWKkWYsQVIsWNBsLEEOHMaIASBBh3ZEHTRlQQ9-zfz54diCHh7ZUGHJ2y7unXllXIECBAgQN0EifMkxINmmCqcsPbLsQYd2RBI37NOTD5QbsvfmuQIECBA4CHQc2TDpT50WogcMGCAScgoOnLTi69MqDpvQdNGnmgQIAaBBzy8u2nHlQd9PTQgqZdmXnvzdO-HllQYd2RBt38sq5AgQOQ0yfHQT40ZYgp2adSLNQSZ0aegTIKkWnUQUIMeLTQIECAokSJEiRIkSJEiRIkSJEiRIkSJEiRIkSJEiRIkSJEiRIkSJEFeLBqSItJBGn0osODTqIBIM6EQIEFDDnyoFTJywvoECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECA&amp;quot;,&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;edit.tf&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;routing-table&amp;quot;: [0,1,11,3,400,5,6,7,800,9,0],&lt;br /&gt;
      &amp;quot;cursor&amp;quot;: false,&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
== Adding Frames to the System ==&lt;br /&gt;
&lt;br /&gt;
Frames can be added to the system using either the Telstar API.&lt;br /&gt;
&lt;br /&gt;
The Telstar API, in conjunction with the cross platform Telstar Util software, provides a simple method of creating and managing pages.&lt;br /&gt;
&lt;br /&gt;
The API can be used to retrieve and update frames and configuring routing. The API is a restful API that uses the GET, PUT, POST and DELETE HTTP methods and as such can be used from any application.&lt;br /&gt;
&lt;br /&gt;
Data is passed to and from the API in JSON format, making the system very simple to use in any programming language. The whole API could be used without any programming at all by using a command line utility such as CURL.&lt;br /&gt;
&lt;br /&gt;
''Further details of the Telstar API can be found in the section [[The Telstar API]].''&lt;br /&gt;
&lt;br /&gt;
== Adding Content with the Edit.tf editor ==&lt;br /&gt;
&lt;br /&gt;
There are several ways to add content to a page. One of the easiest is to create the page in an editor such as http://edit.tf.&lt;br /&gt;
&lt;br /&gt;
The JSON file would look something like the one showm below. Note that the content type is set to editf and the content data contains the edit.tf url.&lt;br /&gt;
&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;pid&amp;quot;: {&lt;br /&gt;
            &amp;quot;page-no&amp;quot;: 101,&lt;br /&gt;
            &amp;quot;frame-id&amp;quot;: &amp;quot;a&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;visible&amp;quot;: true,&lt;br /&gt;
        &amp;quot;frame-type&amp;quot;: &amp;quot;information&amp;quot;,&lt;br /&gt;
        &amp;quot;content&amp;quot;: {&lt;br /&gt;
            &amp;quot;data&amp;quot;: &amp;quot;http://edit.tf/#0:QIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQICn_OmTJkSJApUqVKlSpUlcHApiTJkyZEiRIkyZMmTIkSJFmKf3JX58____RBg-fPnzog__2iBBo-fNX9qgQcOHDh8-fGiAp_zFf______2v7_____7X___oEGr__Qa0ur_________QoCn9ywK__6D__a__7dH__tf___1QIv_9AiQIkaPX_bo0aMpiKf_-Yr__oP_9r__tUH_-1____9og__yjnz5cldX9qUc-fPkp__uSv_-g__2v_-1Qf_7X__aIv____KZv_dIV__2pTN___yn__mK___z__a____5__tf_9qgVf__8o5_vWJX__alHP___Kf_7kr____6dBr_____-h__2qBBr__ymbPnSFf69CUzf__8pnz5iq9ejRoECBWvXr0KBGjQYOHBHz4cECBAgwcCily7__yqDhw4ePnzogQeP7RAg0fPiBB___9X___QYPH___-sCmb__KoP________3B__tUCDV__tUH___1f36XB-_______KOf_8qgRo__9B__v9X___QINX___Qav__B8-NNX_-jR___8pm__ymYrq______h_odX9qg1f___7q__9X_-h1f_5TBgwYM37__KOSur-_Ro0Pr_8_f_qDV_b___r__1f_6D___lFKlSpUu__8pmK_v7VAgwf______tNX9r______V__oP__-gQaPnwpm__yqDB__tUCD__QIEG___1f2qL____9X_-g____z5-__ymb__KoNX_-lQKl6VAgQav6_V__oNf___1f2qBX_____9-hKOf_8qgVJ0JRw4cOPLkqiQoESNGgVL0aFEjQoECJGjRoymDNm__ymTJkzZv3_____-3bt27du3Thw8efPnz58-fPnz58-fP___QIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECA&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;edit.tf&amp;quot;&lt;br /&gt;
        }    &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
== Adding Content using Markup ==&lt;br /&gt;
&lt;br /&gt;
Content can be added directly to the JSON file using a very simple markup. For example consider the following frame definition.&lt;br /&gt;
&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;pid&amp;quot;: {&lt;br /&gt;
            &amp;quot;page-no&amp;quot;: 101,&lt;br /&gt;
            &amp;quot;frame-id&amp;quot;: &amp;quot;a&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;visible&amp;quot;: true,&lt;br /&gt;
        &amp;quot;frame-type&amp;quot;: &amp;quot;information&amp;quot;,&lt;br /&gt;
        &amp;quot;title&amp;quot;: {&lt;br /&gt;
            &amp;quot;data&amp;quot;: &amp;quot;[D]Welcome\r\n\r\n&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;markup&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;content&amp;quot;: {&lt;br /&gt;
            &amp;quot;data&amp;quot;: &amp;quot;[Y]Hello[C]Telstar[M]World&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;markup&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
This frame uses markup in the title and the content, The title is specified as [D]ouble height and the three words used in the content are coloured yellow, cyan and magenta respectively.&lt;br /&gt;
&lt;br /&gt;
Full details of markup can be found in the [[Markup]] section.&lt;br /&gt;
&lt;br /&gt;
== Complete Frame Description ==&lt;br /&gt;
&lt;br /&gt;
The frame below is a standard information page from the TELSTAR system shown in its JSON format. It represents the first frame of page 9. Taking this frame as an example, a description of the fields and their meaning is decribed below.&lt;br /&gt;
&lt;br /&gt;
''The full json schema can be found [[Frame Schema|here]].''&lt;br /&gt;
&lt;br /&gt;
     {&lt;br /&gt;
    	&amp;quot;pid&amp;quot;: {&lt;br /&gt;
    		&amp;quot;page-no&amp;quot;: 9,&lt;br /&gt;
    		&amp;quot;frame-id&amp;quot;: &amp;quot;a&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;visible&amp;quot;: true,&lt;br /&gt;
        &amp;quot;header-text&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;cost&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;frame-type&amp;quot;: &amp;quot;information&amp;quot;,&lt;br /&gt;
        &amp;quot;redirect&amp;quot;: {&lt;br /&gt;
            &amp;quot;page-no&amp;quot;: 0,&lt;br /&gt;
            &amp;quot;frame-id&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;content&amp;quot;: {&lt;br /&gt;
            &amp;quot;data&amp;quot;: &amp;quot;https://edit.tf/#0:QIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgc4UCBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQICixYsWLFixYsWLFixYsWLFixYsWLFixYsWLFixYsWLFixYgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAxQIIs6PJnRYtKTOjoKkWnUQUIMeLTQIECBAgQIECBAgQIEDRAgp2adSLNQSZ0aegQIECBAgQIECBAgQIECBAgQIECBAgQNkCCPBqRa8GygpxaVaTDi00CBAgQIECBAgQIECBAgQIECBA4QIIc-dUgw6iCJFqQZMymgQIECBAgQIECBAgQIECBAgQIEDlAgmT46CfOQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQMECCZPjoJ8aMgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQICixYsWLFixYsWLFixYsWLFixYsWLFixYsWLFixYsWLFixYgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECAFUQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgBVAMUNMQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIAVQDFDTAlMPUQIECBAgQIECBAgQIECBAgQIECBAgQIECAFUAxQ0wJTD1A0EHSQIECBAgQIECBAgQIECBAgQIECBAgQIECANMCUw9QNBB0kCBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECAPUDQQdJAgQIECBAgQIECBAgQIECAosWLFixYsWLFixYsQIECAHSQIECAosWLFixYsWLFixYsWIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECA&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;edit.tf'&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;title&amp;quot;: {&lt;br /&gt;
            &amp;quot;data&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;routing-table&amp;quot;: [&lt;br /&gt;
            90,&lt;br /&gt;
            91,&lt;br /&gt;
            92,&lt;br /&gt;
            93,&lt;br /&gt;
            94,&lt;br /&gt;
            95,&lt;br /&gt;
            96,&lt;br /&gt;
            97,&lt;br /&gt;
            98,&lt;br /&gt;
            990,&lt;br /&gt;
            0&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;cursor&amp;quot;: false,&lt;br /&gt;
        &amp;quot;connection&amp;quot;: {&lt;br /&gt;
            &amp;quot;address&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
            &amp;quot;mode&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
            &amp;quot;port&amp;quot;: 0&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;author-id&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;response-data&amp;quot;: {&lt;br /&gt;
            &amp;quot;responses&amp;quot;: null,&lt;br /&gt;
            &amp;quot;response-action&amp;quot;: {&lt;br /&gt;
                &amp;quot;exec&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
                &amp;quot;args&amp;quot;: null,&lt;br /&gt;
                &amp;quot;post-action-frame&amp;quot;: {&lt;br /&gt;
                    &amp;quot;page-no&amp;quot;: 0,&lt;br /&gt;
                    &amp;quot;frame-id&amp;quot;: ''&lt;br /&gt;
                },&lt;br /&gt;
                &amp;quot;post-cancel-frame&amp;quot;: {&lt;br /&gt;
                    &amp;quot;page-no&amp;quot;: 0,&lt;br /&gt;
                    &amp;quot;frame-id&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;navmessage-select&amp;quot;: &amp;quot;[B][n][Y]Select item or[W]*page# : [_+]&amp;quot;,&lt;br /&gt;
        &amp;quot;navmessage-notfound&amp;quot;: &amp;quot;[B][n][Y]Page not Found :[W]&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
=== pid ===&lt;br /&gt;
&lt;br /&gt;
Specifies the page number and frame id for the frame.&lt;br /&gt;
&lt;br /&gt;
    	&amp;quot;pid&amp;quot;: {&lt;br /&gt;
    		&amp;quot;page-no&amp;quot;: 9,&lt;br /&gt;
    		&amp;quot;frame-id&amp;quot;: &amp;quot;a&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
&lt;br /&gt;
=== visible ===&lt;br /&gt;
&lt;br /&gt;
When set to false, the frame will not be accessible and will return the ''not found'' system message to the user if an attempt is made to access it.&lt;br /&gt;
&lt;br /&gt;
      &amp;quot;visible&amp;quot;: true,&lt;br /&gt;
&lt;br /&gt;
=== header-text ===&lt;br /&gt;
&lt;br /&gt;
Allows the default header text to be ovwerridden at frame level. If this is left blank the default header will be used, see configuration.&lt;br /&gt;
&lt;br /&gt;
      &amp;quot;header-text&amp;quot;: &amp;quot;[Y]MICRONETn 800 (C)&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
=== cost ===&lt;br /&gt;
&lt;br /&gt;
      &amp;quot;cost&amp;quot;: 0,&lt;br /&gt;
&lt;br /&gt;
=== frame-type ===&lt;br /&gt;
&lt;br /&gt;
The API supports the following frame types ''initial'', ''mainindex'', ''information'', ''exit'', ''gateway'', ''test'' and ''response''.&lt;br /&gt;
&lt;br /&gt;
      &amp;quot;frame-type&amp;quot;: &amp;quot;information&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
* '''initial''': This frame type is used on the start page, see [[Configuration Options]]. Typically only one of these frames would exist within a system.&lt;br /&gt;
* '''mainindex''': This frame type is used on the main index page. , see [[Configuration Options]]. Only one of these frames should exist within a system.&lt;br /&gt;
* '''information''': This frame type is used for all normal content frames.&lt;br /&gt;
* '''exit''': This frame type is used for an exit page, any number of exit pages can be defined. When an exit page is rendered it will close the connection.&lt;br /&gt;
* '''gateway''': This page type is used to define a gateway page and is used in conjunction with the connection element (see below).&lt;br /&gt;
* '''test''': This page type indicates a test page and prevents navigation and system messages from being shown. this is typically used for frames that need to use the whole display such as 'test cards' etc.&lt;br /&gt;
* '''telesoftware''': Telesoftware frames (see [[Telesoftware]]).&lt;br /&gt;
* '''response''': This frame type is used for response frames. See [[Implementing Response Frames]].&lt;br /&gt;
* '''system''': Reserved for use internally.&lt;br /&gt;
* '''exception''': Reserved for use internally.&lt;br /&gt;
&lt;br /&gt;
=== redirect ===&lt;br /&gt;
 &lt;br /&gt;
If set it simply means that the user is redirected to the specified frame. This can be a useful alternative form of navigation to the routing table.&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;redirect&amp;quot;: {&lt;br /&gt;
            &amp;quot;page-no&amp;quot;: 9,&lt;br /&gt;
            &amp;quot;frame-id&amp;quot;: &amp;quot;a&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
&lt;br /&gt;
=== content ===&lt;br /&gt;
&lt;br /&gt;
These elements define the content. The example below shows the content.type to be an edit.tf url. The available types are shown below.&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;content&amp;quot;: {&lt;br /&gt;
            &amp;quot;data&amp;quot;: &amp;quot;https://edit.tf/#0:QIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgc4UCBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQICixYsWLFixYsWLFixYsWLFixYsWLFixYsWLFixYsWLFixYgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAxQIIs6PJnRYtKTOjoKkWnUQUIMeLTQIECBAgQIECBAgQIEDRAgp2adSLNQSZ0aegQIECBAgQIECBAgQIECBAgQIECBAgQNkCCPBqRa8GygpxaVaTDi00CBAgQIECBAgQIECBAgQIECBA4QIIc-dUgw6iCJFqQZMymgQIECBAgQIECBAgQIECBAgQIEDlAgmT46CfOQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQMECCZPjoJ8aMgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQICixYsWLFixYsWLFixYsWLFixYsWLFixYsWLFixYsWLFixYgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECAFUQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgBVAMUNMQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIAVQDFDTAlMPUQIECBAgQIECBAgQIECBAgQIECBAgQIECAFUAxQ0wJTD1A0EHSQIECBAgQIECBAgQIECBAgQIECBAgQIECANMCUw9QNBB0kCBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECAPUDQQdJAgQIECBAgQIECBAgQIECAosWLFixYsWLFixYsQIECAHSQIECAosWLFixYsWLFixYsWIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECA&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;edit.tf'&lt;br /&gt;
        },&lt;br /&gt;
&lt;br /&gt;
Content types:&lt;br /&gt;
&lt;br /&gt;
* '''edit.tf''': If set, then the content will be treated as an edit.tf url. This is converted to RawV before being rendered.&lt;br /&gt;
* '''markup''': If set, then the content will be treated as ''markup'' content. Full details of ''markup'' can be found in the section [[Markup]]&lt;br /&gt;
* '''rawV''': If set, then the content will be treated as raw videotex data. This is 7bit (00-7F) videotex format with control chars between 00-1F and escaped codes for alpha and graphic attributes. Ideally rows should have any trailing spaces removed and replaced with with a CR/LF combination. This will be rendered as is.&lt;br /&gt;
* '''rawT''': If set, then the content will be treated as raw teletex data. This is a 24 x 40 block of 7 bits chars (960 chars) in Teletext format (range 00-7F). This format is used internally when manipulating page data. It will be converted to RawV before being rendered.&lt;br /&gt;
&lt;br /&gt;
=== title ===&lt;br /&gt;
&lt;br /&gt;
This sets the title of the page. In many cases this may be left blank with all of the content specified in the ''content'' section (see above) however, the ''title'' section gives additional flexibility when creating frames.&lt;br /&gt;
&lt;br /&gt;
Values for ''title-type'' are the same as defined for the content section, however, if the type ''edit-tf'' is used then only the first four (default) lines of the edit.tf defined page are used. &lt;br /&gt;
&lt;br /&gt;
Separating title from content in this way allows logos and header sections to be created for the title whilst using markup for the main content or visa-versa. &lt;br /&gt;
&lt;br /&gt;
The example here is shown blank meaning that only the data in the ''content'' section is displayed.&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;title&amp;quot;: {&lt;br /&gt;
            &amp;quot;data&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
&lt;br /&gt;
=== routing table ===&lt;br /&gt;
&lt;br /&gt;
The routing table defines which pages are navigated towhen a user presses a key whilst viewing the frame. The table has 11 entries with the first 10 representing the keys 0-9, the final entry refers to the ''hash'' (return) key.&lt;br /&gt;
&lt;br /&gt;
The example below shows the default routing table for frame 9a. If the user is viewing this frame and presses 1 the frame 91a will be loaded, assuming it exists. Pressing the ''hash'' (return) key will take the user back to frame 0a, the main index.&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;routing-table&amp;quot;: [&lt;br /&gt;
            90,&lt;br /&gt;
            91,&lt;br /&gt;
            92,&lt;br /&gt;
            93,&lt;br /&gt;
            94,&lt;br /&gt;
            95,&lt;br /&gt;
            96,&lt;br /&gt;
            97,&lt;br /&gt;
            98,&lt;br /&gt;
            99,&lt;br /&gt;
            0&lt;br /&gt;
        ],&lt;br /&gt;
&lt;br /&gt;
=== cursor ===&lt;br /&gt;
&lt;br /&gt;
This element determines whether a cursor is shown on the page. Typically a cursor would only be shown on response frames.&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;cursor&amp;quot;: false,&lt;br /&gt;
        &lt;br /&gt;
=== connection ===&lt;br /&gt;
&lt;br /&gt;
This elements specifies the connection object used for gateway pages.&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;connection&amp;quot;: {&lt;br /&gt;
            &amp;quot;address&amp;quot;: &amp;quot;fish.ccl4.org&amp;quot;,&lt;br /&gt;
            &amp;quot;mode&amp;quot;: &amp;quot;viewdata&amp;quot;,&lt;br /&gt;
            &amp;quot;port&amp;quot;: 23&lt;br /&gt;
        },&lt;br /&gt;
&lt;br /&gt;
The values for ''address and port'' represent the endpoint of the system being accessed and the value for ''mode'' determines how the system is accessed, the options are:&lt;br /&gt;
&lt;br /&gt;
    viewdata&lt;br /&gt;
    full_duplex&lt;br /&gt;
    full_duplex_no_echo&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== author-id ===&lt;br /&gt;
&lt;br /&gt;
This is an optional field that can be used to indicate the author of the page or other source.&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;author-id&amp;quot;: &amp;quot;john&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
=== response-data ===&lt;br /&gt;
&lt;br /&gt;
These fields should be used when the frame type is set to be a ''response-frame''. &lt;br /&gt;
&lt;br /&gt;
There are two main sections, ''response-data'' and ''response-action''. Below is an example of a response frame used for the Telstar weather page. The frame is created in the normal way using ''markup'' or ''edit.tf''. In this example the text ''Town/Cty'' has been positioned near the centre of the page. Immediately to the right of this is a field for the user to enter either a Town or City, the ''response-data'' section defines that field. Once the user submits the frame the section ''response-action'' determines what happens. In the example here a binary file (''telstar-openweather-linux-amd64''), stored in the containers volume directory is executed with a single argument (''myopenweatherapikey''). Note that the ''post-action-frame'' is set to 290b, in this example frame 290b is dynamically generated by the binary file ''telstar-openweather-linux-amd64'' and contains the weather forecast.&lt;br /&gt;
&lt;br /&gt;
Full details of how to implement response frames are detailed in the section [[Implementing Response Frames]].&lt;br /&gt;
    &amp;quot;response-data&amp;quot;: {&lt;br /&gt;
        &amp;quot;response-fields&amp;quot;: [&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;vpos&amp;quot;: 8,&lt;br /&gt;
                &amp;quot;hpos&amp;quot;: 4,&lt;br /&gt;
                &amp;quot;required&amp;quot;: true,&lt;br /&gt;
                &amp;quot;length&amp;quot;: 16,&lt;br /&gt;
                &amp;quot;type&amp;quot;: &amp;quot;alphanumeric&amp;quot;,&lt;br /&gt;
                &amp;quot;auto-submit&amp;quot;: false,&lt;br /&gt;
                &amp;quot;password&amp;quot;: false&lt;br /&gt;
            }&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;response-action&amp;quot;: {&lt;br /&gt;
            &amp;quot;exec&amp;quot;: &amp;quot;/opt/telstar/volume/telstar-openweather-linux-amd64&amp;quot;,&lt;br /&gt;
            &amp;quot;args&amp;quot;: [&lt;br /&gt;
                &amp;quot;myopenweatherapikey&amp;quot;&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;post-action-frame&amp;quot;: {&lt;br /&gt;
                &amp;quot;page-no&amp;quot;: 290,&lt;br /&gt;
                &amp;quot;frame-id&amp;quot;: &amp;quot;c&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
=== navmessage-select ===&lt;br /&gt;
&lt;br /&gt;
Allows the ''navigation'' system message to be customised at frame level. In most cases this can be left blank in order that the system default is used instead, see [[Configuration Options]].&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;navmessage-select&amp;quot;: &amp;quot;[B][n][Y]Select item or[W]*page# : [_+]&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
=== navmessage-notfound ===&lt;br /&gt;
&lt;br /&gt;
Allows the ''not found'' system message to be customised at frame level. In most cases this can be left blank in order that the system default is used instead, see [[Configuration Options]].&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;navmessage-notfound&amp;quot;: &amp;quot;[B][n][Y]Page not Found :[W]&amp;quot;&lt;/div&gt;</summary>
		<author><name>John</name></author>
	</entry>
	<entry>
		<id>https://wiki.glasstty.com/index.php?title=Frames&amp;diff=308</id>
		<title>Frames</title>
		<link rel="alternate" type="text/html" href="https://wiki.glasstty.com/index.php?title=Frames&amp;diff=308"/>
		<updated>2022-04-15T08:06:06Z</updated>

		<summary type="html">&lt;p&gt;John: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;As is typical with interactive videotex systems, pages are numbered from 0 to 999999999 and consist of one or more frames with the suffix a-z, for example the first frame for page 200 would be 200a, the second 200b and so on (see [[Routing]]) for more details). These frames are stored within TELSTAR's database as ''JSON'' objects (see https://www.json.org/) and uploaded to Telstar using a simple command line utility.&lt;br /&gt;
&lt;br /&gt;
The Telstar utility program simply interacts with the Telstar API which is a restful API. This can be used directly by any software making it simple to programitically manage pages and routing information.&lt;br /&gt;
&lt;br /&gt;
Frames are defined in JSON. The simplest frame that can be viewed on TELSTAR would be as follows. This would create a simple information frame with some flashing content. In this example [[Markup]] has been used within the content, however, other contant types can be used including edi.tf urls, see below.&lt;br /&gt;
&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;pid&amp;quot;: {&lt;br /&gt;
        &amp;quot;page-no&amp;quot;: 101,&lt;br /&gt;
        &amp;quot;frame-id&amp;quot;: &amp;quot;a&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;visible&amp;quot;: true,&lt;br /&gt;
      &amp;quot;content&amp;quot;: {&lt;br /&gt;
        &amp;quot;data&amp;quot;: &amp;quot;[D]This is page[F]101a&amp;quot;,&lt;br /&gt;
         &amp;quot;type&amp;quot;: &amp;quot;markup&amp;quot;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Shown below is a more complete example of a JSON defined frame. With this particular frame, the actual viewdata content has been created using the editor at http://edit.tf, this can be seen in the ''content.data'' and ''content.type'' keys. The example below is a simple information page with some simple routing (see [[Routing]]). Clicking the ''content.data'' link, or pasteing the value into a browser will show the page and allow it to be edited. It is not necessary to use the http://edit.tf editor, this is just one possible option.&lt;br /&gt;
&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;pid&amp;quot;: {&lt;br /&gt;
        &amp;quot;page-no&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;frame-id&amp;quot;: &amp;quot;a&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;visible&amp;quot;: true,&lt;br /&gt;
      &amp;quot;frame-type&amp;quot;: &amp;quot;information&amp;quot;,&lt;br /&gt;
      &amp;quot;content&amp;quot;: {&lt;br /&gt;
        &amp;quot;data&amp;quot;: &amp;quot;http://edit.tf/#0:QIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQMMKAbNw6dyCTuyZfCBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgKJEiRIkSJEiRIkSJEiRIkSJEiRIkSJEiRIkSJEiRIkSJEiRAxQR4s6LSgzEEmdUi0otOogkzo0-lNg1JM-cCg8unNYgQIASBBj67OnXllWIMu7pl5dMOndty7uixBoy4dnTQsQIECBAgBIEHfLh2dNCDDuyINmnNl59POzKuQIECBAgQIECBAgQIECBAyQTotemggzoiCvFg1JEWkCnYemnfuw7EGHdkQIECBAgQIASBBp3dMvLdh6ad-7DsQbsvfmgw7siDvlw9NGXkuQIECBAgQM0EKrTkzotOmgkzo0-lNg1JM-cCh79vDDu8oMO7IgQIECAEgQYuvPTuy8-aDdl781wM6EjVKcVBMw9MvPogoctOPLzQIEDRBHn1otKdNizqiCTOjT6U2DUkz5wKlvw5OaxByw6dixAgBIEGHdkQUMPLZpw7cu7ouQIECBAgQIECBAgQIECBAgQIECBA2QR4NSLXg2UFOLSrSYcWmCnWKkWYsQVIsWNBsLEEOHMaIASBBh3ZEHTRlQQ9-zfz54diCHh7ZUGHJ2y7unXllXIECBAgQN0EifMkxINmmCqcsPbLsQYd2RBI37NOTD5QbsvfmuQIECBA4CHQc2TDpT50WogcMGCAScgoOnLTi69MqDpvQdNGnmgQIAaBBzy8u2nHlQd9PTQgqZdmXnvzdO-HllQYd2RBt38sq5AgQOQ0yfHQT40ZYgp2adSLNQSZ0aegTIKkWnUQUIMeLTQIECAokSJEiRIkSJEiRIkSJEiRIkSJEiRIkSJEiRIkSJEiRIkSJEFeLBqSItJBGn0osODTqIBIM6EQIEFDDnyoFTJywvoECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECA&amp;quot;,&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;edit.tf&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;routing-table&amp;quot;: [0,1,11,3,400,5,6,7,800,9,0],&lt;br /&gt;
      &amp;quot;cursor&amp;quot;: false,&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
== Adding Frames to the System ==&lt;br /&gt;
&lt;br /&gt;
Frames can be added to the system using either the Telstar API.&lt;br /&gt;
&lt;br /&gt;
The Telstar API, in conjunction with the cross platform Telstar Util software, provides a simple method of creating and managing pages.&lt;br /&gt;
&lt;br /&gt;
The API can be used to retrieve and update frames and configuring routing. The API is a restful API that uses the GET, PUT, POST and DELETE HTTP methods and as such can be used from any application.&lt;br /&gt;
&lt;br /&gt;
Data is passed to and from the API in JSON format, making the system very simple to use in any programming language. The whole API could be used without any programming at all by using a command line utility such as CURL.&lt;br /&gt;
&lt;br /&gt;
''Further details of the Telstar API can be found in the section [[The Telstar API]].''&lt;br /&gt;
&lt;br /&gt;
== Adding Content with the Edit.tf editor ==&lt;br /&gt;
&lt;br /&gt;
There are several ways to add content to a page. One of the easiest is to create the page in an editor such as http://edit.tf.&lt;br /&gt;
&lt;br /&gt;
The JSON file would look something like the one showm below. Note that the content type is set to editf and the content data contains the edit.tf url.&lt;br /&gt;
&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;pid&amp;quot;: {&lt;br /&gt;
            &amp;quot;page-no&amp;quot;: 101,&lt;br /&gt;
            &amp;quot;frame-id&amp;quot;: &amp;quot;a&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;visible&amp;quot;: true,&lt;br /&gt;
        &amp;quot;frame-type&amp;quot;: &amp;quot;information&amp;quot;,&lt;br /&gt;
        &amp;quot;content&amp;quot;: {&lt;br /&gt;
            &amp;quot;data&amp;quot;: &amp;quot;http://edit.tf/#0:QIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQICn_OmTJkSJApUqVKlSpUlcHApiTJkyZEiRIkyZMmTIkSJFmKf3JX58____RBg-fPnzog__2iBBo-fNX9qgQcOHDh8-fGiAp_zFf______2v7_____7X___oEGr__Qa0ur_________QoCn9ywK__6D__a__7dH__tf___1QIv_9AiQIkaPX_bo0aMpiKf_-Yr__oP_9r__tUH_-1____9og__yjnz5cldX9qUc-fPkp__uSv_-g__2v_-1Qf_7X__aIv____KZv_dIV__2pTN___yn__mK___z__a____5__tf_9qgVf__8o5_vWJX__alHP___Kf_7kr____6dBr_____-h__2qBBr__ymbPnSFf69CUzf__8pnz5iq9ejRoECBWvXr0KBGjQYOHBHz4cECBAgwcCily7__yqDhw4ePnzogQeP7RAg0fPiBB___9X___QYPH___-sCmb__KoP________3B__tUCDV__tUH___1f36XB-_______KOf_8qgRo__9B__v9X___QINX___Qav__B8-NNX_-jR___8pm__ymYrq______h_odX9qg1f___7q__9X_-h1f_5TBgwYM37__KOSur-_Ro0Pr_8_f_qDV_b___r__1f_6D___lFKlSpUu__8pmK_v7VAgwf______tNX9r______V__oP__-gQaPnwpm__yqDB__tUCD__QIEG___1f2qL____9X_-g____z5-__ymb__KoNX_-lQKl6VAgQav6_V__oNf___1f2qBX_____9-hKOf_8qgVJ0JRw4cOPLkqiQoESNGgVL0aFEjQoECJGjRoymDNm__ymTJkzZv3_____-3bt27du3Thw8efPnz58-fPnz58-fP___QIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECA&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;edit.tf&amp;quot;&lt;br /&gt;
        }    &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
== Adding Content using Markup ==&lt;br /&gt;
&lt;br /&gt;
Content can be added directly to the JSON file using a very simple markup. For example consider the following frame definition.&lt;br /&gt;
&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;pid&amp;quot;: {&lt;br /&gt;
            &amp;quot;page-no&amp;quot;: 101,&lt;br /&gt;
            &amp;quot;frame-id&amp;quot;: &amp;quot;a&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;visible&amp;quot;: true,&lt;br /&gt;
        &amp;quot;frame-type&amp;quot;: &amp;quot;information&amp;quot;,&lt;br /&gt;
        &amp;quot;title&amp;quot;: {&lt;br /&gt;
            &amp;quot;data&amp;quot;: &amp;quot;[D]Welcome\r\n\r\n&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;markup&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;content&amp;quot;: {&lt;br /&gt;
            &amp;quot;data&amp;quot;: &amp;quot;[Y]Hello[C]Telstar[M]World&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;markup&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
This frame uses markup in the title and the content, The title is specified as [D]ouble height and the three words used in the content are coloured yellow, cyan and magenta respectively.&lt;br /&gt;
&lt;br /&gt;
Full details of markup can be found in the [[Markup]] section.&lt;br /&gt;
&lt;br /&gt;
== Complete Frame Description ==&lt;br /&gt;
&lt;br /&gt;
The frame below is a standard information page from the TELSTAR system shown in its JSON format. It represents the first frame of page 9. Taking this frame as an example, a description of the fields and their meaning is decribed below.&lt;br /&gt;
&lt;br /&gt;
''The full json schema can be found [[Frame Schema|here]].''&lt;br /&gt;
&lt;br /&gt;
     {&lt;br /&gt;
    	&amp;quot;pid&amp;quot;: {&lt;br /&gt;
    		&amp;quot;page-no&amp;quot;: 9,&lt;br /&gt;
    		&amp;quot;frame-id&amp;quot;: &amp;quot;a&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;visible&amp;quot;: true,&lt;br /&gt;
        &amp;quot;header-text&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;cost&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;frame-type&amp;quot;: &amp;quot;information&amp;quot;,&lt;br /&gt;
        &amp;quot;redirect&amp;quot;: {&lt;br /&gt;
            &amp;quot;page-no&amp;quot;: 0,&lt;br /&gt;
            &amp;quot;frame-id&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;content&amp;quot;: {&lt;br /&gt;
            &amp;quot;data&amp;quot;: &amp;quot;https://edit.tf/#0:QIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgc4UCBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQICixYsWLFixYsWLFixYsWLFixYsWLFixYsWLFixYsWLFixYgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAxQIIs6PJnRYtKTOjoKkWnUQUIMeLTQIECBAgQIECBAgQIEDRAgp2adSLNQSZ0aegQIECBAgQIECBAgQIECBAgQIECBAgQNkCCPBqRa8GygpxaVaTDi00CBAgQIECBAgQIECBAgQIECBA4QIIc-dUgw6iCJFqQZMymgQIECBAgQIECBAgQIECBAgQIEDlAgmT46CfOQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQMECCZPjoJ8aMgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQICixYsWLFixYsWLFixYsWLFixYsWLFixYsWLFixYsWLFixYgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECAFUQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgBVAMUNMQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIAVQDFDTAlMPUQIECBAgQIECBAgQIECBAgQIECBAgQIECAFUAxQ0wJTD1A0EHSQIECBAgQIECBAgQIECBAgQIECBAgQIECANMCUw9QNBB0kCBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECAPUDQQdJAgQIECBAgQIECBAgQIECAosWLFixYsWLFixYsQIECAHSQIECAosWLFixYsWLFixYsWIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECA&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;edit.tf'&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;title&amp;quot;: {&lt;br /&gt;
            &amp;quot;data&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;routing-table&amp;quot;: [&lt;br /&gt;
            90,&lt;br /&gt;
            91,&lt;br /&gt;
            92,&lt;br /&gt;
            93,&lt;br /&gt;
            94,&lt;br /&gt;
            95,&lt;br /&gt;
            96,&lt;br /&gt;
            97,&lt;br /&gt;
            98,&lt;br /&gt;
            990,&lt;br /&gt;
            0&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;cursor&amp;quot;: false,&lt;br /&gt;
        &amp;quot;connection&amp;quot;: {&lt;br /&gt;
            &amp;quot;address&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
            &amp;quot;mode&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
            &amp;quot;port&amp;quot;: 0&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;author-id&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;response-data&amp;quot;: {&lt;br /&gt;
            &amp;quot;responses&amp;quot;: null,&lt;br /&gt;
            &amp;quot;response-action&amp;quot;: {&lt;br /&gt;
                &amp;quot;exec&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
                &amp;quot;args&amp;quot;: null,&lt;br /&gt;
                &amp;quot;post-action-frame&amp;quot;: {&lt;br /&gt;
                    &amp;quot;page-no&amp;quot;: 0,&lt;br /&gt;
                    &amp;quot;frame-id&amp;quot;: ''&lt;br /&gt;
                },&lt;br /&gt;
                &amp;quot;post-cancel-frame&amp;quot;: {&lt;br /&gt;
                    &amp;quot;page-no&amp;quot;: 0,&lt;br /&gt;
                    &amp;quot;frame-id&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;navmessage-select&amp;quot;: &amp;quot;[B][n][Y]Select item or[W]*page# : [_+]&amp;quot;,&lt;br /&gt;
        &amp;quot;navmessage-notfound&amp;quot;: &amp;quot;[B][n][Y]Page not Found :[W]&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
=== pid ===&lt;br /&gt;
&lt;br /&gt;
Specifies the page number and frame id for the frame.&lt;br /&gt;
&lt;br /&gt;
    	&amp;quot;pid&amp;quot;: {&lt;br /&gt;
    		&amp;quot;page-no&amp;quot;: 9,&lt;br /&gt;
    		&amp;quot;frame-id&amp;quot;: &amp;quot;a&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
&lt;br /&gt;
=== visible ===&lt;br /&gt;
&lt;br /&gt;
When set to false, the frame will not be accessible and will return the ''not found'' system message to the user if an attempt is made to access it.&lt;br /&gt;
&lt;br /&gt;
      &amp;quot;visible&amp;quot;: true,&lt;br /&gt;
&lt;br /&gt;
=== header-text ===&lt;br /&gt;
&lt;br /&gt;
Allows the default header text to be ovwerridden at frame level. If this is left blank the default header will be used, see configuration.&lt;br /&gt;
&lt;br /&gt;
      &amp;quot;header-text&amp;quot;: &amp;quot;[Y]MICRONETn 800 (C)&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
=== cost ===&lt;br /&gt;
&lt;br /&gt;
      &amp;quot;cost&amp;quot;: 0,&lt;br /&gt;
&lt;br /&gt;
=== frame-type ===&lt;br /&gt;
&lt;br /&gt;
The API supports the following frame types ''initial'', ''mainindex'', ''information'', ''exit'', ''gateway'', ''test'' and ''response''.&lt;br /&gt;
&lt;br /&gt;
      &amp;quot;frame-type&amp;quot;: &amp;quot;information&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
* '''initial''': This frame type is used on the start page, see [[Configuration Options]]. Typically only one of these frames would exist within a system.&lt;br /&gt;
* '''mainindex''': This frame type is used on the main index page. , see [[Configuration Options]]. Only one of these frames should exist within a system.&lt;br /&gt;
* '''information''': This frame type is used for all normal content frames.&lt;br /&gt;
* '''exit''': This frame type is used for an exit page, any number of exit pages can be defined. When an exit page is rendered it will close the connection.&lt;br /&gt;
* '''gateway''': This page type is used to define a gateway page and is used in conjunction with the connection element (see below).&lt;br /&gt;
* '''test''': This page type indicates a test page and prevents navigation and system messages from being shown. this is typically used for frames that need to use the whole display such as 'test cards' etc.&lt;br /&gt;
* '''telesoftware''': Telesoftware frames (see [[Telesoftware]]).&lt;br /&gt;
* '''response''': This frame type is used for response frames. See [[Implementing Response Frames]].&lt;br /&gt;
* '''system''': Reserved for use internally.&lt;br /&gt;
* '''exception''': Reserved for use internally.&lt;br /&gt;
&lt;br /&gt;
=== redirect ===&lt;br /&gt;
 &lt;br /&gt;
If set it simply means that the user is redirected to the specified frame. This can be a useful alternative form of navigation to the routing table.&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;redirect&amp;quot;: {&lt;br /&gt;
            &amp;quot;page-no&amp;quot;: 9,&lt;br /&gt;
            &amp;quot;frame-id&amp;quot;: &amp;quot;a&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
&lt;br /&gt;
=== content ===&lt;br /&gt;
&lt;br /&gt;
These elements define the content. The example below shows the content.type to be an edit.tf url. The available types are shown below.&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;content&amp;quot;: {&lt;br /&gt;
            &amp;quot;data&amp;quot;: &amp;quot;https://edit.tf/#0:QIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgc4UCBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQICixYsWLFixYsWLFixYsWLFixYsWLFixYsWLFixYsWLFixYgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAxQIIs6PJnRYtKTOjoKkWnUQUIMeLTQIECBAgQIECBAgQIEDRAgp2adSLNQSZ0aegQIECBAgQIECBAgQIECBAgQIECBAgQNkCCPBqRa8GygpxaVaTDi00CBAgQIECBAgQIECBAgQIECBA4QIIc-dUgw6iCJFqQZMymgQIECBAgQIECBAgQIECBAgQIEDlAgmT46CfOQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQMECCZPjoJ8aMgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQICixYsWLFixYsWLFixYsWLFixYsWLFixYsWLFixYsWLFixYgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECAFUQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgBVAMUNMQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIAVQDFDTAlMPUQIECBAgQIECBAgQIECBAgQIECBAgQIECAFUAxQ0wJTD1A0EHSQIECBAgQIECBAgQIECBAgQIECBAgQIECANMCUw9QNBB0kCBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECAPUDQQdJAgQIECBAgQIECBAgQIECAosWLFixYsWLFixYsQIECAHSQIECAosWLFixYsWLFixYsWIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECA&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;edit.tf'&lt;br /&gt;
        },&lt;br /&gt;
&lt;br /&gt;
Content types:&lt;br /&gt;
&lt;br /&gt;
* '''edit.tf''': If set, then the content will be treated as an edit.tf url. This is converted to RawV before being rendered.&lt;br /&gt;
* '''markup''': If set, then the content will be treated as ''markup'' content. Full details of ''markup'' can be found in the section [[Markup]]&lt;br /&gt;
* '''rawV''': If set, then the content will be treated as raw videotex data. This is 7bit (00-7F) videotex format with control chars between 00-1F and escaped codes for alpha and graphic attributes. Ideally rows should have any trailing spaces removed and replaced with with a CR/LF combination. This will be rendered as is.&lt;br /&gt;
* '''rawT''': If set, then the content will be treated as raw teletex data. This is a 24 x 40 block of 7 bits chars (960 chars) in Teletext format (range 00-7F). This format is used internally when manipulating page data. It will be converted to RawV before being rendered.&lt;br /&gt;
&lt;br /&gt;
=== title ===&lt;br /&gt;
&lt;br /&gt;
This sets the title of the page. In many cases this may be left blank with all of the content specified in the ''content'' section (see above) however, the ''title'' section gives additional flexibility when creating frames.&lt;br /&gt;
&lt;br /&gt;
Values for ''title-type'' are the same as defined for the content section, however, if the type ''edit-tf'' is used then only the first four (default) lines of the edit.tf defined page are used. &lt;br /&gt;
&lt;br /&gt;
Separating title from content in this way allows logos and header sections to be created for the title whilst using markup for the main content or visa-versa. &lt;br /&gt;
&lt;br /&gt;
The example here is shown blank meaning that only the data in the ''content'' section is displayed.&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;title&amp;quot;: {&lt;br /&gt;
            &amp;quot;data&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
&lt;br /&gt;
=== routing table ===&lt;br /&gt;
&lt;br /&gt;
The routing table defines which pages are navigated towhen a user presses a key whilst viewing the frame. The table has 11 entries with the first 10 representing the keys 0-9, the final entry refers to the ''hash'' (return) key.&lt;br /&gt;
&lt;br /&gt;
The example below shows the default routing table for frame 9a. If the user is viewing this frame and presses 1 the frame 91a will be loaded, assuming it exists. Pressing the ''hash'' (return) key will take the user back to frame 0a, the main index.&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;routing-table&amp;quot;: [&lt;br /&gt;
            90,&lt;br /&gt;
            91,&lt;br /&gt;
            92,&lt;br /&gt;
            93,&lt;br /&gt;
            94,&lt;br /&gt;
            95,&lt;br /&gt;
            96,&lt;br /&gt;
            97,&lt;br /&gt;
            98,&lt;br /&gt;
            99,&lt;br /&gt;
            0&lt;br /&gt;
        ],&lt;br /&gt;
&lt;br /&gt;
=== cursor ===&lt;br /&gt;
&lt;br /&gt;
This element determines whether a cursor is shown on the page. Typically a cursor would only be shown on response frames.&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;cursor&amp;quot;: false,&lt;br /&gt;
        &lt;br /&gt;
=== connection ===&lt;br /&gt;
&lt;br /&gt;
This elements specifies the connection object used for gateway pages.&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;connection&amp;quot;: {&lt;br /&gt;
            &amp;quot;address&amp;quot;: &amp;quot;fish.ccl4.org&amp;quot;,&lt;br /&gt;
            &amp;quot;mode&amp;quot;: &amp;quot;viewdata&amp;quot;,&lt;br /&gt;
            &amp;quot;port&amp;quot;: 23&lt;br /&gt;
        },&lt;br /&gt;
&lt;br /&gt;
The values for ''address and port'' represent the endpoint of the system being accessed and the value for ''mode'' determines how the system is accessed, the options are:&lt;br /&gt;
&lt;br /&gt;
    viewdata&lt;br /&gt;
    full_duplex&lt;br /&gt;
    full_duplex_no_echo&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== author-id ===&lt;br /&gt;
&lt;br /&gt;
This is an optional field that can be used to indicate the author of the page or other source.&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;author-id&amp;quot;: &amp;quot;john&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
=== response-data ===&lt;br /&gt;
&lt;br /&gt;
These fields should be used when the frame type is set to be a ''response-frame''. &lt;br /&gt;
&lt;br /&gt;
There are two main sections, ''response-data'' and ''response-action''. Below is an example of a response frame used for the Telstar weather page. The frame is created in the normal way using ''markup'' or ''edit.tf''. In this example the text ''Town/Cty'' has been positioned near the centre of the page. Immediately to the right of this is a field for the user to enter either a Town or City, the ''response-data'' section defines that field. Once the user submits the frame the section ''response-action'' determines what happens. In the example here a binary file (''telstar-openweather-linux-amd64''), stored in the containers volume directory is executed with a single argument (''myopenweatherapikey''). Note that the ''post-action-frame'' is set to 290b, in this example frame 290b is dynamically generated by the binary file ''telstar-openweather-linux-amd64'' and contains the weather forecast.&lt;br /&gt;
&lt;br /&gt;
Full details of how to implement response frames are detailed in the section [[Implementing Response Frames]].&lt;br /&gt;
    &amp;quot;response-data&amp;quot;: {&lt;br /&gt;
        &amp;quot;response-fields&amp;quot;: [&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;vpos&amp;quot;: 8,&lt;br /&gt;
                &amp;quot;hpos&amp;quot;: 4,&lt;br /&gt;
                &amp;quot;required&amp;quot;: true,&lt;br /&gt;
                &amp;quot;length&amp;quot;: 16,&lt;br /&gt;
                &amp;quot;type&amp;quot;: &amp;quot;alphanumeric&amp;quot;,&lt;br /&gt;
                &amp;quot;auto-submit&amp;quot;: false,&lt;br /&gt;
                &amp;quot;password&amp;quot;: false&lt;br /&gt;
            }&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;response-action&amp;quot;: {&lt;br /&gt;
            &amp;quot;exec&amp;quot;: &amp;quot;/opt/telstar/volume/telstar-openweather-linux-amd64&amp;quot;,&lt;br /&gt;
            &amp;quot;args&amp;quot;: [&lt;br /&gt;
                &amp;quot;myopenweatherapikey&amp;quot;&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;post-action-frame&amp;quot;: {&lt;br /&gt;
                &amp;quot;page-no&amp;quot;: 290,&lt;br /&gt;
                &amp;quot;frame-id&amp;quot;: &amp;quot;c&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
=== navmessage-select ===&lt;br /&gt;
&lt;br /&gt;
Allows the ''navigation'' system message to be customised at frame level. In most cases this can be left blank in order that the system default is used instead, see [[Configuration Options]].&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;navmessage-select&amp;quot;: &amp;quot;[B][n][Y]Select item or[W]*page# : [_+]&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
=== navmessage-notfound ===&lt;br /&gt;
&lt;br /&gt;
Allows the ''not found'' system message to be customised at frame level. In most cases this can be left blank in order that the system default is used instead, see [[Configuration Options]].&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;navmessage-notfound&amp;quot;: &amp;quot;[B][n][Y]Page not Found :[W]&amp;quot;&lt;/div&gt;</summary>
		<author><name>John</name></author>
	</entry>
	<entry>
		<id>https://wiki.glasstty.com/index.php?title=File:Screenshot_2022-04-15_at_09.01.22.png&amp;diff=304</id>
		<title>File:Screenshot 2022-04-15 at 09.01.22.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.glasstty.com/index.php?title=File:Screenshot_2022-04-15_at_09.01.22.png&amp;diff=304"/>
		<updated>2022-04-15T08:01:39Z</updated>

		<summary type="html">&lt;p&gt;John: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>John</name></author>
	</entry>
	<entry>
		<id>https://wiki.glasstty.com/index.php?title=File:Screenshot_2022-04-15_at_08.53.03.png&amp;diff=296</id>
		<title>File:Screenshot 2022-04-15 at 08.53.03.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.glasstty.com/index.php?title=File:Screenshot_2022-04-15_at_08.53.03.png&amp;diff=296"/>
		<updated>2022-04-15T07:55:53Z</updated>

		<summary type="html">&lt;p&gt;John: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>John</name></author>
	</entry>
	<entry>
		<id>https://wiki.glasstty.com/index.php?title=File:Screenshot_2022-04-15_at_08.46.51.png&amp;diff=285</id>
		<title>File:Screenshot 2022-04-15 at 08.46.51.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.glasstty.com/index.php?title=File:Screenshot_2022-04-15_at_08.46.51.png&amp;diff=285"/>
		<updated>2022-04-15T07:48:13Z</updated>

		<summary type="html">&lt;p&gt;John: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>John</name></author>
	</entry>
	<entry>
		<id>https://wiki.glasstty.com/index.php?title=The_Telstar_API&amp;diff=283</id>
		<title>The Telstar API</title>
		<link rel="alternate" type="text/html" href="https://wiki.glasstty.com/index.php?title=The_Telstar_API&amp;diff=283"/>
		<updated>2022-04-15T05:35:38Z</updated>

		<summary type="html">&lt;p&gt;John: /* Introduction */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
Frames can be added to the system using either the Telstar API or by using a plug-in (see [[Implementing Response Frames]])&lt;br /&gt;
&lt;br /&gt;
The Telstar API, in conjunction with the cross platform Telstar Util software, provides a simple method of creating and managing pages. Data is passed to and from the API in JSON format, making the system very simple to use in any programming language.&lt;br /&gt;
&lt;br /&gt;
The API is a restful API that uses the GET, PUT and DELETE HTTP methods. This makes it a simple process to add new frames and update existing frames. In order to use the system a username and password combination is used to create a security token. This token is then used for subsequent requests to access the API (see below).&lt;br /&gt;
&lt;br /&gt;
Data is passed to and from the API in JSON format, making the system very simple to use in any programming language. The whole API could be used without any programming at all by using a command line utility such as CURL. To make things even simpler a *bash* utility called *telstar-util* is available that wraps *curl* making things even simpler.&lt;br /&gt;
&lt;br /&gt;
The utility ''telstar-util'' can be downloaded from a running server container (in this example called ''telstar-server'') using the following command&lt;br /&gt;
&lt;br /&gt;
    docker cp telstar-server:/opt/telstar/telstar-util-2.0.zip .&lt;br /&gt;
&lt;br /&gt;
Versions exist for Linux and MacOS (amd64 and arm64), and Windows (32 and 64 bit). Note that the MacOS version may need to have the quarantine attribute reset. e.g.&lt;br /&gt;
&lt;br /&gt;
    xattr -d com.apple.quarantine telstar-util&lt;br /&gt;
&lt;br /&gt;
The examples in this documentation demonstrate using the ''telstar-util'' command line utility.&lt;br /&gt;
&lt;br /&gt;
'''NOTE:'''&lt;br /&gt;
&lt;br /&gt;
The API will perform its actions on the secondary database of a Telstar system. Once a page has been created, updated or deleted on the secondary database, the API can be used to publish the changes to the primary database if required (see ''Publish'' below).&lt;br /&gt;
&lt;br /&gt;
== Initialising the API ==&lt;br /&gt;
&lt;br /&gt;
The Telstar API runs in a separate container. This uses the same base image but is started with a different parameter. e.g.&lt;br /&gt;
&lt;br /&gt;
    docker run --rm -d --name telstar-api --network telstar-network -p 8001:8001 -e TELSTAR_API_USERID=2222222222 -e TELSTAR_API_PASSWORD=1234 -e TELSTAR_COOKIE_SECRET=b6c7a826-96d6-4f45-88c4-3cf27cc2c647 johnnewcombe/telstar:amd64-2.0-RC3.4 api --port 8001 --init&lt;br /&gt;
&lt;br /&gt;
This will start an api server listening on port 8001. the --init parameter will create the root user (user 0) based on the specified environment variables.&lt;br /&gt;
&lt;br /&gt;
'''Remember to use a unique cookie secret for your system and keep it safe.''' The cookie secret is used to encrypt and decrypt the secure cookie within the telstar API. If this is made public, it may allow someone to create a valid authorisation cookie and impersonate a user of the system.&lt;br /&gt;
&lt;br /&gt;
== Authentication ==&lt;br /&gt;
&lt;br /&gt;
The docker command used above included the *--init* parameter, this parameter creates a user based on the values specified in the following environment variables.&lt;br /&gt;
&lt;br /&gt;
    TELSTAR_API_USERID&lt;br /&gt;
    TELSTAR_API_PASSWORD&lt;br /&gt;
&lt;br /&gt;
Typically this will be used to create the ''root'' user (user 0) and this is demonstrated in the docker-compose example ([[Orchestrating Telstar with Docker Compose]]) User ''0'' is a special user that has read, write and delete accesss to all pages within the system. Other users can be defined that have access to a specific group of pages.&lt;br /&gt;
&lt;br /&gt;
All API users are common across primary and secondary databases. For example the user ID 500, will have access to pages 500 including all decendants e.g. 5001-5009, 50011, 50021, 500111 etc. on both primary and secondary databases.&lt;br /&gt;
&lt;br /&gt;
Once a User ID has been created it can be used to obtain a token. This token is then used in subsequent calls to the API. For example to access the API running on the local host, with the user ID specified above, the following ''telstar-util'' command could be used.&lt;br /&gt;
&lt;br /&gt;
    telstar-util login localhost:8080 0 telstarapisecret&lt;br /&gt;
&lt;br /&gt;
The important thing to note here is that cookies are saved to the file ''telstar-util.tok''. This file contains the secure token. Subsequent requests to the API will forward the token in the request.&lt;br /&gt;
&lt;br /&gt;
## Retrievings Frames (GET)&lt;br /&gt;
&lt;br /&gt;
Once authorised, any frame can be retrieved with a simple GET request.&lt;br /&gt;
&lt;br /&gt;
The frame will be returned and redirected to the file *500a.json*.&lt;br /&gt;
&lt;br /&gt;
    telstar-util getframe localhost:8080 500a &amp;gt; 500a.json&lt;br /&gt;
&lt;br /&gt;
== Frames and JSON ==&lt;br /&gt;
&lt;br /&gt;
The simplest frame that can be viewed on TELSTAR could be defined as follows.&lt;br /&gt;
&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;pid&amp;quot;: {&lt;br /&gt;
            &amp;quot;page-no&amp;quot;: 101,&lt;br /&gt;
            &amp;quot;frame-id&amp;quot;: &amp;quot;a&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;visible&amp;quot;: true&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
This frame, is so basic that it doesn't even have content. The frame below includes some flashing content.&lt;br /&gt;
&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;pid&amp;quot;: {&lt;br /&gt;
        &amp;quot;page-no&amp;quot;: 101,&lt;br /&gt;
        &amp;quot;frame-id&amp;quot;: &amp;quot;a&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;visible&amp;quot;: true,&lt;br /&gt;
      &amp;quot;content&amp;quot;: {&lt;br /&gt;
        &amp;quot;data&amp;quot;: &amp;quot;[D]This is page[F]101a&amp;quot;,&lt;br /&gt;
         &amp;quot;type&amp;quot;: &amp;quot;markup&amp;quot;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Shown below is a more complete example of a JSON defined frame. With this particular frame, the actual viewdata content has been created using the editor at [http://edit.tf](http://edit.tf), this can be seen in the *content.data* and *content.type* keys. However, there are several ways to create frames other than using [http://edit.tf](http://edit.tf). For more details of the frame structure and the various settings please see [Frames in Detail](frames.md).&lt;br /&gt;
&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;pid&amp;quot;: {&lt;br /&gt;
        &amp;quot;page-no&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;frame-id&amp;quot;: &amp;quot;a&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;visible&amp;quot;: true,&lt;br /&gt;
      &amp;quot;frame-type&amp;quot;: &amp;quot;information&amp;quot;,&lt;br /&gt;
      &amp;quot;content&amp;quot;: {&lt;br /&gt;
        &amp;quot;data&amp;quot;: &amp;quot;http://edit.tf/#0:QIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQMMKAbNw6dyCTuyZfCBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgKJEiRIkSJEiRIkSJEiRIkSJEiRIkSJEiRIkSJEiRIkSJEiRAxQR4s6LSgzEEmdUi0otOogkzo0-lNg1JM-cCg8unNYgQIASBBj67OnXllWIMu7pl5dMOndty7uixBoy4dnTQsQIECBAgBIEHfLh2dNCDDuyINmnNl59POzKuQIECBAgQIECBAgQIECBAyQTotemggzoiCvFg1JEWkCnYemnfuw7EGHdkQIECBAgQIASBBp3dMvLdh6ad-7DsQbsvfmgw7siDvlw9NGXkuQIECBAgQM0EKrTkzotOmgkzo0-lNg1JM-cCh79vDDu8oMO7IgQIECAEgQYuvPTuy8-aDdl781wM6EjVKcVBMw9MvPogoctOPLzQIEDRBHn1otKdNizqiCTOjT6U2DUkz5wKlvw5OaxByw6dixAgBIEGHdkQUMPLZpw7cu7ouQIECBAgQIECBAgQIECBAgQIECBA2QR4NSLXg2UFOLSrSYcWmCnWKkWYsQVIsWNBsLEEOHMaIASBBh3ZEHTRlQQ9-zfz54diCHh7ZUGHJ2y7unXllXIECBAgQN0EifMkxINmmCqcsPbLsQYd2RBI37NOTD5QbsvfmuQIECBA4CHQc2TDpT50WogcMGCAScgoOnLTi69MqDpvQdNGnmgQIAaBBzy8u2nHlQd9PTQgqZdmXnvzdO-HllQYd2RBt38sq5AgQOQ0yfHQT40ZYgp2adSLNQSZ0aegTIKkWnUQUIMeLTQIECAokSJEiRIkSJEiRIkSJEiRIkSJEiRIkSJEiRIkSJEiRIkSJEFeLBqSItJBGn0osODTqIBIM6EQIEFDDnyoFTJywvoECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECA&amp;quot;,&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;edit.tf&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;routing-table&amp;quot;: [0,1,11,3,400,5,6,7,800,9,0],&lt;br /&gt;
      &amp;quot;cursor&amp;quot;: false,&lt;br /&gt;
      &amp;quot;author-id&amp;quot;: &amp;quot;editf-frame-generator&amp;quot;,&lt;br /&gt;
      &amp;quot;navmsg-forecolour&amp;quot;: &amp;quot;yellow&amp;quot;,&lt;br /&gt;
      &amp;quot;navmsg-backcolour&amp;quot;: &amp;quot;blue&amp;quot;,&lt;br /&gt;
      &amp;quot;navmsg-highlight&amp;quot;: &amp;quot;white&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
== Adding/Updating a Frame ==&lt;br /&gt;
&lt;br /&gt;
To add or update a frame the HTTP PUT request is used. If the frame already exists on TELSTAR the frame will be updated, if it does not exist then it will be created.&lt;br /&gt;
&lt;br /&gt;
The following *telstar-utility* command will send the json frame stored in the file *500a.json* to the Telstar API using the Http PUT method.&lt;br /&gt;
&lt;br /&gt;
    telstar-util addframe localhost:8080 500a.json&lt;br /&gt;
&lt;br /&gt;
== Deleting a Frame ==&lt;br /&gt;
&lt;br /&gt;
A frame can be deleted using the HTTP DELETE method.&lt;br /&gt;
&lt;br /&gt;
The following *telstar-utility* example will delete the frame 500a.&lt;br /&gt;
&lt;br /&gt;
    telstar-util deleteframe localhost:8080/frame/500a&lt;br /&gt;
&lt;br /&gt;
== Publish Changes ==&lt;br /&gt;
&lt;br /&gt;
As described previously, the API will perform its actions on the secondary database of a Telstar system.&lt;br /&gt;
&lt;br /&gt;
Once a page has been created, updated or deleted on the secondary database, the API can be used to *publish* the changes to the primary database if required.&lt;br /&gt;
&lt;br /&gt;
Publishing will update the primary database to that of the secondary for the specified frame. If the frame is deleted in the secondary and then published, it will be deleted in the primary also.&lt;br /&gt;
&lt;br /&gt;
The following *telstar-utility* command will publish the frame 500a.&lt;br /&gt;
&lt;br /&gt;
    telstar-util publish localhost:8080/frame/500a&lt;br /&gt;
&lt;br /&gt;
== Adding/Updating a User ==&lt;br /&gt;
&lt;br /&gt;
Each user ID typically gives access to a single information provider page. In the case of major providers this could be one of the three digit page numbers and everything beneath it. For example the user ID 500, will have access to pages 500 including all decendants e.g. 5001-5009, 50011, 50021, 500111 etc. but not 501 or 502.&lt;br /&gt;
&lt;br /&gt;
To add or update a user the HTTP PUT request is used. If the user already exists on TELSTAR the user will be updated, if it does not exist then it will be created.&lt;br /&gt;
&lt;br /&gt;
The following examples add the user 800800 to the system. Note that only the *root* user (user 0) can make user changes. All passwords are stored in hashed form.&lt;br /&gt;
&lt;br /&gt;
The following *telstar-utility* command will create the user *800800* with the password *mysecretpassword*.&lt;br /&gt;
&lt;br /&gt;
    telstar-util adduser localhost:8080 800800 mysecretpassword&lt;br /&gt;
&lt;br /&gt;
== Deleting a User ==&lt;br /&gt;
&lt;br /&gt;
The following examples delete the user 800800 from the system using the HTTP DELETE method. Note that only the *root* user (user 0) can make user changes.&lt;br /&gt;
&lt;br /&gt;
The following *telstar-utility* command will delete the user *800800*.&lt;br /&gt;
&lt;br /&gt;
    telstar-util deleteuser localhost:8080 800800&lt;/div&gt;</summary>
		<author><name>John</name></author>
	</entry>
	<entry>
		<id>https://wiki.glasstty.com/index.php?title=The_Telstar_API&amp;diff=282</id>
		<title>The Telstar API</title>
		<link rel="alternate" type="text/html" href="https://wiki.glasstty.com/index.php?title=The_Telstar_API&amp;diff=282"/>
		<updated>2022-04-15T05:35:18Z</updated>

		<summary type="html">&lt;p&gt;John: /* Introduction */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
Frames can be added to the system using either the Telstar API or by using a plug-in (see [[Implementing Response Frames]])&lt;br /&gt;
&lt;br /&gt;
The Telstar API, in conjunction with the cross platform Telstar Util software, provides a simple method of creating and managing pages. Data is passed to and from the API in JSON format, making the system very simple to use in any programming language.&lt;br /&gt;
&lt;br /&gt;
The API is a restful API that uses the GET, PUT and DELETE HTTP methods. This makes it a simple process to add new frames and update existing frames. In order to use the system a username and password combination is used to create a security token. This token is then used for subsequent requests to access the API (see below).&lt;br /&gt;
&lt;br /&gt;
Data is passed to and from the API in JSON format, making the system very simple to use in any programming language. The whole API could be used without any programming at all by using a command line utility such as CURL. To make things even simpler a *bash* utility called *telstar-util* is available that wraps *curl* making things even simpler.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    docker cp telstar-server-03:telstar-util-2.0.zip .&lt;br /&gt;
The utility ''telstar-util'' can be downloaded from a running server container (in this example called ''telstar-server'') using the following command&lt;br /&gt;
&lt;br /&gt;
    docker cp telstar-server:/opt/telstar/telstar-util-2.0.zip .&lt;br /&gt;
&lt;br /&gt;
Versions exist for Linux and MacOS (amd64 and arm64), and Windows (32 and 64 bit). Note that the MacOS version may need to have the quarantine attribute reset. e.g.&lt;br /&gt;
&lt;br /&gt;
    xattr -d com.apple.quarantine telstar-util&lt;br /&gt;
&lt;br /&gt;
The examples in this documentation demonstrate using the ''telstar-util'' command line utility.&lt;br /&gt;
&lt;br /&gt;
'''NOTE:'''&lt;br /&gt;
&lt;br /&gt;
The API will perform its actions on the secondary database of a Telstar system. Once a page has been created, updated or deleted on the secondary database, the API can be used to publish the changes to the primary database if required (see ''Publish'' below).&lt;br /&gt;
&lt;br /&gt;
== Initialising the API ==&lt;br /&gt;
&lt;br /&gt;
The Telstar API runs in a separate container. This uses the same base image but is started with a different parameter. e.g.&lt;br /&gt;
&lt;br /&gt;
    docker run --rm -d --name telstar-api --network telstar-network -p 8001:8001 -e TELSTAR_API_USERID=2222222222 -e TELSTAR_API_PASSWORD=1234 -e TELSTAR_COOKIE_SECRET=b6c7a826-96d6-4f45-88c4-3cf27cc2c647 johnnewcombe/telstar:amd64-2.0-RC3.4 api --port 8001 --init&lt;br /&gt;
&lt;br /&gt;
This will start an api server listening on port 8001. the --init parameter will create the root user (user 0) based on the specified environment variables.&lt;br /&gt;
&lt;br /&gt;
'''Remember to use a unique cookie secret for your system and keep it safe.''' The cookie secret is used to encrypt and decrypt the secure cookie within the telstar API. If this is made public, it may allow someone to create a valid authorisation cookie and impersonate a user of the system.&lt;br /&gt;
&lt;br /&gt;
== Authentication ==&lt;br /&gt;
&lt;br /&gt;
The docker command used above included the *--init* parameter, this parameter creates a user based on the values specified in the following environment variables.&lt;br /&gt;
&lt;br /&gt;
    TELSTAR_API_USERID&lt;br /&gt;
    TELSTAR_API_PASSWORD&lt;br /&gt;
&lt;br /&gt;
Typically this will be used to create the ''root'' user (user 0) and this is demonstrated in the docker-compose example ([[Orchestrating Telstar with Docker Compose]]) User ''0'' is a special user that has read, write and delete accesss to all pages within the system. Other users can be defined that have access to a specific group of pages.&lt;br /&gt;
&lt;br /&gt;
All API users are common across primary and secondary databases. For example the user ID 500, will have access to pages 500 including all decendants e.g. 5001-5009, 50011, 50021, 500111 etc. on both primary and secondary databases.&lt;br /&gt;
&lt;br /&gt;
Once a User ID has been created it can be used to obtain a token. This token is then used in subsequent calls to the API. For example to access the API running on the local host, with the user ID specified above, the following ''telstar-util'' command could be used.&lt;br /&gt;
&lt;br /&gt;
    telstar-util login localhost:8080 0 telstarapisecret&lt;br /&gt;
&lt;br /&gt;
The important thing to note here is that cookies are saved to the file ''telstar-util.tok''. This file contains the secure token. Subsequent requests to the API will forward the token in the request.&lt;br /&gt;
&lt;br /&gt;
## Retrievings Frames (GET)&lt;br /&gt;
&lt;br /&gt;
Once authorised, any frame can be retrieved with a simple GET request.&lt;br /&gt;
&lt;br /&gt;
The frame will be returned and redirected to the file *500a.json*.&lt;br /&gt;
&lt;br /&gt;
    telstar-util getframe localhost:8080 500a &amp;gt; 500a.json&lt;br /&gt;
&lt;br /&gt;
== Frames and JSON ==&lt;br /&gt;
&lt;br /&gt;
The simplest frame that can be viewed on TELSTAR could be defined as follows.&lt;br /&gt;
&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;pid&amp;quot;: {&lt;br /&gt;
            &amp;quot;page-no&amp;quot;: 101,&lt;br /&gt;
            &amp;quot;frame-id&amp;quot;: &amp;quot;a&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;visible&amp;quot;: true&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
This frame, is so basic that it doesn't even have content. The frame below includes some flashing content.&lt;br /&gt;
&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;pid&amp;quot;: {&lt;br /&gt;
        &amp;quot;page-no&amp;quot;: 101,&lt;br /&gt;
        &amp;quot;frame-id&amp;quot;: &amp;quot;a&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;visible&amp;quot;: true,&lt;br /&gt;
      &amp;quot;content&amp;quot;: {&lt;br /&gt;
        &amp;quot;data&amp;quot;: &amp;quot;[D]This is page[F]101a&amp;quot;,&lt;br /&gt;
         &amp;quot;type&amp;quot;: &amp;quot;markup&amp;quot;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Shown below is a more complete example of a JSON defined frame. With this particular frame, the actual viewdata content has been created using the editor at [http://edit.tf](http://edit.tf), this can be seen in the *content.data* and *content.type* keys. However, there are several ways to create frames other than using [http://edit.tf](http://edit.tf). For more details of the frame structure and the various settings please see [Frames in Detail](frames.md).&lt;br /&gt;
&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;pid&amp;quot;: {&lt;br /&gt;
        &amp;quot;page-no&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;frame-id&amp;quot;: &amp;quot;a&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;visible&amp;quot;: true,&lt;br /&gt;
      &amp;quot;frame-type&amp;quot;: &amp;quot;information&amp;quot;,&lt;br /&gt;
      &amp;quot;content&amp;quot;: {&lt;br /&gt;
        &amp;quot;data&amp;quot;: &amp;quot;http://edit.tf/#0:QIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQMMKAbNw6dyCTuyZfCBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgKJEiRIkSJEiRIkSJEiRIkSJEiRIkSJEiRIkSJEiRIkSJEiRAxQR4s6LSgzEEmdUi0otOogkzo0-lNg1JM-cCg8unNYgQIASBBj67OnXllWIMu7pl5dMOndty7uixBoy4dnTQsQIECBAgBIEHfLh2dNCDDuyINmnNl59POzKuQIECBAgQIECBAgQIECBAyQTotemggzoiCvFg1JEWkCnYemnfuw7EGHdkQIECBAgQIASBBp3dMvLdh6ad-7DsQbsvfmgw7siDvlw9NGXkuQIECBAgQM0EKrTkzotOmgkzo0-lNg1JM-cCh79vDDu8oMO7IgQIECAEgQYuvPTuy8-aDdl781wM6EjVKcVBMw9MvPogoctOPLzQIEDRBHn1otKdNizqiCTOjT6U2DUkz5wKlvw5OaxByw6dixAgBIEGHdkQUMPLZpw7cu7ouQIECBAgQIECBAgQIECBAgQIECBA2QR4NSLXg2UFOLSrSYcWmCnWKkWYsQVIsWNBsLEEOHMaIASBBh3ZEHTRlQQ9-zfz54diCHh7ZUGHJ2y7unXllXIECBAgQN0EifMkxINmmCqcsPbLsQYd2RBI37NOTD5QbsvfmuQIECBA4CHQc2TDpT50WogcMGCAScgoOnLTi69MqDpvQdNGnmgQIAaBBzy8u2nHlQd9PTQgqZdmXnvzdO-HllQYd2RBt38sq5AgQOQ0yfHQT40ZYgp2adSLNQSZ0aegTIKkWnUQUIMeLTQIECAokSJEiRIkSJEiRIkSJEiRIkSJEiRIkSJEiRIkSJEiRIkSJEFeLBqSItJBGn0osODTqIBIM6EQIEFDDnyoFTJywvoECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECA&amp;quot;,&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;edit.tf&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;routing-table&amp;quot;: [0,1,11,3,400,5,6,7,800,9,0],&lt;br /&gt;
      &amp;quot;cursor&amp;quot;: false,&lt;br /&gt;
      &amp;quot;author-id&amp;quot;: &amp;quot;editf-frame-generator&amp;quot;,&lt;br /&gt;
      &amp;quot;navmsg-forecolour&amp;quot;: &amp;quot;yellow&amp;quot;,&lt;br /&gt;
      &amp;quot;navmsg-backcolour&amp;quot;: &amp;quot;blue&amp;quot;,&lt;br /&gt;
      &amp;quot;navmsg-highlight&amp;quot;: &amp;quot;white&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
== Adding/Updating a Frame ==&lt;br /&gt;
&lt;br /&gt;
To add or update a frame the HTTP PUT request is used. If the frame already exists on TELSTAR the frame will be updated, if it does not exist then it will be created.&lt;br /&gt;
&lt;br /&gt;
The following *telstar-utility* command will send the json frame stored in the file *500a.json* to the Telstar API using the Http PUT method.&lt;br /&gt;
&lt;br /&gt;
    telstar-util addframe localhost:8080 500a.json&lt;br /&gt;
&lt;br /&gt;
== Deleting a Frame ==&lt;br /&gt;
&lt;br /&gt;
A frame can be deleted using the HTTP DELETE method.&lt;br /&gt;
&lt;br /&gt;
The following *telstar-utility* example will delete the frame 500a.&lt;br /&gt;
&lt;br /&gt;
    telstar-util deleteframe localhost:8080/frame/500a&lt;br /&gt;
&lt;br /&gt;
== Publish Changes ==&lt;br /&gt;
&lt;br /&gt;
As described previously, the API will perform its actions on the secondary database of a Telstar system.&lt;br /&gt;
&lt;br /&gt;
Once a page has been created, updated or deleted on the secondary database, the API can be used to *publish* the changes to the primary database if required.&lt;br /&gt;
&lt;br /&gt;
Publishing will update the primary database to that of the secondary for the specified frame. If the frame is deleted in the secondary and then published, it will be deleted in the primary also.&lt;br /&gt;
&lt;br /&gt;
The following *telstar-utility* command will publish the frame 500a.&lt;br /&gt;
&lt;br /&gt;
    telstar-util publish localhost:8080/frame/500a&lt;br /&gt;
&lt;br /&gt;
== Adding/Updating a User ==&lt;br /&gt;
&lt;br /&gt;
Each user ID typically gives access to a single information provider page. In the case of major providers this could be one of the three digit page numbers and everything beneath it. For example the user ID 500, will have access to pages 500 including all decendants e.g. 5001-5009, 50011, 50021, 500111 etc. but not 501 or 502.&lt;br /&gt;
&lt;br /&gt;
To add or update a user the HTTP PUT request is used. If the user already exists on TELSTAR the user will be updated, if it does not exist then it will be created.&lt;br /&gt;
&lt;br /&gt;
The following examples add the user 800800 to the system. Note that only the *root* user (user 0) can make user changes. All passwords are stored in hashed form.&lt;br /&gt;
&lt;br /&gt;
The following *telstar-utility* command will create the user *800800* with the password *mysecretpassword*.&lt;br /&gt;
&lt;br /&gt;
    telstar-util adduser localhost:8080 800800 mysecretpassword&lt;br /&gt;
&lt;br /&gt;
== Deleting a User ==&lt;br /&gt;
&lt;br /&gt;
The following examples delete the user 800800 from the system using the HTTP DELETE method. Note that only the *root* user (user 0) can make user changes.&lt;br /&gt;
&lt;br /&gt;
The following *telstar-utility* command will delete the user *800800*.&lt;br /&gt;
&lt;br /&gt;
    telstar-util deleteuser localhost:8080 800800&lt;/div&gt;</summary>
		<author><name>John</name></author>
	</entry>
	<entry>
		<id>https://wiki.glasstty.com/index.php?title=The_Telstar_API&amp;diff=281</id>
		<title>The Telstar API</title>
		<link rel="alternate" type="text/html" href="https://wiki.glasstty.com/index.php?title=The_Telstar_API&amp;diff=281"/>
		<updated>2022-04-15T05:28:12Z</updated>

		<summary type="html">&lt;p&gt;John: /* Frames and JSON */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
Frames can be added to the system using either the Telstar API or by using a plug-in (see [[Implementing Response Frames]])&lt;br /&gt;
&lt;br /&gt;
The Telstar API, in conjunction with the cross platform Telstar Util software, provides a simple method of creating and managing pages. Data is passed to and from the API in JSON format, making the system very simple to use in any programming language.&lt;br /&gt;
&lt;br /&gt;
The API is a restful API that uses the GET, PUT and DELETE HTTP methods. This makes it a simple process to add new frames and update existing frames. In order to use the system a username and password combination is used to create a security token. This token is then used for subsequent requests to access the API (see below).&lt;br /&gt;
&lt;br /&gt;
Data is passed to and from the API in JSON format, making the system very simple to use in any programming language. The whole API could be used without any programming at all by using a command line utility such as CURL. To make things even simpler a *bash* utility called *telstar-util* is available that wraps *curl* making things even simpler.&lt;br /&gt;
&lt;br /&gt;
The utility *telstar-util* can be downloaded from here: (https://glasstty.com/wp-content/uploads/2022/04/telstar-util-2.0.zip).&lt;br /&gt;
&lt;br /&gt;
Versions exist for Linux and MacOS (amd64 and arm64), and Windows (32 and 64 bit). Note that the MacOS version may need to have the quarantine attribute reset. e.g.&lt;br /&gt;
&lt;br /&gt;
    xattr -d com.apple.quarantine telstar-util&lt;br /&gt;
&lt;br /&gt;
The examples in this documentation demonstrate using the ''telstar-util'' command line utility.&lt;br /&gt;
&lt;br /&gt;
'''NOTE:'''&lt;br /&gt;
&lt;br /&gt;
The API will perform its actions on the secondary database of a Telstar system. Once a page has been created, updated or deleted on the secondary database, the API can be used to publish the changes to the primary database if required (see ''Publish'' below).&lt;br /&gt;
&lt;br /&gt;
== Initialising the API ==&lt;br /&gt;
&lt;br /&gt;
The Telstar API runs in a separate container. This uses the same base image but is started with a different parameter. e.g.&lt;br /&gt;
&lt;br /&gt;
    docker run --rm -d --name telstar-api --network telstar-network -p 8001:8001 -e TELSTAR_API_USERID=2222222222 -e TELSTAR_API_PASSWORD=1234 -e TELSTAR_COOKIE_SECRET=b6c7a826-96d6-4f45-88c4-3cf27cc2c647 johnnewcombe/telstar:amd64-2.0-RC3.4 api --port 8001 --init&lt;br /&gt;
&lt;br /&gt;
This will start an api server listening on port 8001. the --init parameter will create the root user (user 0) based on the specified environment variables.&lt;br /&gt;
&lt;br /&gt;
'''Remember to use a unique cookie secret for your system and keep it safe.''' The cookie secret is used to encrypt and decrypt the secure cookie within the telstar API. If this is made public, it may allow someone to create a valid authorisation cookie and impersonate a user of the system.&lt;br /&gt;
&lt;br /&gt;
== Authentication ==&lt;br /&gt;
&lt;br /&gt;
The docker command used above included the *--init* parameter, this parameter creates a user based on the values specified in the following environment variables.&lt;br /&gt;
&lt;br /&gt;
    TELSTAR_API_USERID&lt;br /&gt;
    TELSTAR_API_PASSWORD&lt;br /&gt;
&lt;br /&gt;
Typically this will be used to create the ''root'' user (user 0) and this is demonstrated in the docker-compose example ([[Orchestrating Telstar with Docker Compose]]) User ''0'' is a special user that has read, write and delete accesss to all pages within the system. Other users can be defined that have access to a specific group of pages.&lt;br /&gt;
&lt;br /&gt;
All API users are common across primary and secondary databases. For example the user ID 500, will have access to pages 500 including all decendants e.g. 5001-5009, 50011, 50021, 500111 etc. on both primary and secondary databases.&lt;br /&gt;
&lt;br /&gt;
Once a User ID has been created it can be used to obtain a token. This token is then used in subsequent calls to the API. For example to access the API running on the local host, with the user ID specified above, the following ''telstar-util'' command could be used.&lt;br /&gt;
&lt;br /&gt;
    telstar-util login localhost:8080 0 telstarapisecret&lt;br /&gt;
&lt;br /&gt;
The important thing to note here is that cookies are saved to the file ''telstar-util.tok''. This file contains the secure token. Subsequent requests to the API will forward the token in the request.&lt;br /&gt;
&lt;br /&gt;
## Retrievings Frames (GET)&lt;br /&gt;
&lt;br /&gt;
Once authorised, any frame can be retrieved with a simple GET request.&lt;br /&gt;
&lt;br /&gt;
The frame will be returned and redirected to the file *500a.json*.&lt;br /&gt;
&lt;br /&gt;
    telstar-util getframe localhost:8080 500a &amp;gt; 500a.json&lt;br /&gt;
&lt;br /&gt;
== Frames and JSON ==&lt;br /&gt;
&lt;br /&gt;
The simplest frame that can be viewed on TELSTAR could be defined as follows.&lt;br /&gt;
&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;pid&amp;quot;: {&lt;br /&gt;
            &amp;quot;page-no&amp;quot;: 101,&lt;br /&gt;
            &amp;quot;frame-id&amp;quot;: &amp;quot;a&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;visible&amp;quot;: true&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
This frame, is so basic that it doesn't even have content. The frame below includes some flashing content.&lt;br /&gt;
&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;pid&amp;quot;: {&lt;br /&gt;
        &amp;quot;page-no&amp;quot;: 101,&lt;br /&gt;
        &amp;quot;frame-id&amp;quot;: &amp;quot;a&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;visible&amp;quot;: true,&lt;br /&gt;
      &amp;quot;content&amp;quot;: {&lt;br /&gt;
        &amp;quot;data&amp;quot;: &amp;quot;[D]This is page[F]101a&amp;quot;,&lt;br /&gt;
         &amp;quot;type&amp;quot;: &amp;quot;markup&amp;quot;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Shown below is a more complete example of a JSON defined frame. With this particular frame, the actual viewdata content has been created using the editor at [http://edit.tf](http://edit.tf), this can be seen in the *content.data* and *content.type* keys. However, there are several ways to create frames other than using [http://edit.tf](http://edit.tf). For more details of the frame structure and the various settings please see [Frames in Detail](frames.md).&lt;br /&gt;
&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;pid&amp;quot;: {&lt;br /&gt;
        &amp;quot;page-no&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;frame-id&amp;quot;: &amp;quot;a&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;visible&amp;quot;: true,&lt;br /&gt;
      &amp;quot;frame-type&amp;quot;: &amp;quot;information&amp;quot;,&lt;br /&gt;
      &amp;quot;content&amp;quot;: {&lt;br /&gt;
        &amp;quot;data&amp;quot;: &amp;quot;http://edit.tf/#0:QIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQMMKAbNw6dyCTuyZfCBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgKJEiRIkSJEiRIkSJEiRIkSJEiRIkSJEiRIkSJEiRIkSJEiRAxQR4s6LSgzEEmdUi0otOogkzo0-lNg1JM-cCg8unNYgQIASBBj67OnXllWIMu7pl5dMOndty7uixBoy4dnTQsQIECBAgBIEHfLh2dNCDDuyINmnNl59POzKuQIECBAgQIECBAgQIECBAyQTotemggzoiCvFg1JEWkCnYemnfuw7EGHdkQIECBAgQIASBBp3dMvLdh6ad-7DsQbsvfmgw7siDvlw9NGXkuQIECBAgQM0EKrTkzotOmgkzo0-lNg1JM-cCh79vDDu8oMO7IgQIECAEgQYuvPTuy8-aDdl781wM6EjVKcVBMw9MvPogoctOPLzQIEDRBHn1otKdNizqiCTOjT6U2DUkz5wKlvw5OaxByw6dixAgBIEGHdkQUMPLZpw7cu7ouQIECBAgQIECBAgQIECBAgQIECBA2QR4NSLXg2UFOLSrSYcWmCnWKkWYsQVIsWNBsLEEOHMaIASBBh3ZEHTRlQQ9-zfz54diCHh7ZUGHJ2y7unXllXIECBAgQN0EifMkxINmmCqcsPbLsQYd2RBI37NOTD5QbsvfmuQIECBA4CHQc2TDpT50WogcMGCAScgoOnLTi69MqDpvQdNGnmgQIAaBBzy8u2nHlQd9PTQgqZdmXnvzdO-HllQYd2RBt38sq5AgQOQ0yfHQT40ZYgp2adSLNQSZ0aegTIKkWnUQUIMeLTQIECAokSJEiRIkSJEiRIkSJEiRIkSJEiRIkSJEiRIkSJEiRIkSJEFeLBqSItJBGn0osODTqIBIM6EQIEFDDnyoFTJywvoECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECA&amp;quot;,&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;edit.tf&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;routing-table&amp;quot;: [0,1,11,3,400,5,6,7,800,9,0],&lt;br /&gt;
      &amp;quot;cursor&amp;quot;: false,&lt;br /&gt;
      &amp;quot;author-id&amp;quot;: &amp;quot;editf-frame-generator&amp;quot;,&lt;br /&gt;
      &amp;quot;navmsg-forecolour&amp;quot;: &amp;quot;yellow&amp;quot;,&lt;br /&gt;
      &amp;quot;navmsg-backcolour&amp;quot;: &amp;quot;blue&amp;quot;,&lt;br /&gt;
      &amp;quot;navmsg-highlight&amp;quot;: &amp;quot;white&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
== Adding/Updating a Frame ==&lt;br /&gt;
&lt;br /&gt;
To add or update a frame the HTTP PUT request is used. If the frame already exists on TELSTAR the frame will be updated, if it does not exist then it will be created.&lt;br /&gt;
&lt;br /&gt;
The following *telstar-utility* command will send the json frame stored in the file *500a.json* to the Telstar API using the Http PUT method.&lt;br /&gt;
&lt;br /&gt;
    telstar-util addframe localhost:8080 500a.json&lt;br /&gt;
&lt;br /&gt;
== Deleting a Frame ==&lt;br /&gt;
&lt;br /&gt;
A frame can be deleted using the HTTP DELETE method.&lt;br /&gt;
&lt;br /&gt;
The following *telstar-utility* example will delete the frame 500a.&lt;br /&gt;
&lt;br /&gt;
    telstar-util deleteframe localhost:8080/frame/500a&lt;br /&gt;
&lt;br /&gt;
== Publish Changes ==&lt;br /&gt;
&lt;br /&gt;
As described previously, the API will perform its actions on the secondary database of a Telstar system.&lt;br /&gt;
&lt;br /&gt;
Once a page has been created, updated or deleted on the secondary database, the API can be used to *publish* the changes to the primary database if required.&lt;br /&gt;
&lt;br /&gt;
Publishing will update the primary database to that of the secondary for the specified frame. If the frame is deleted in the secondary and then published, it will be deleted in the primary also.&lt;br /&gt;
&lt;br /&gt;
The following *telstar-utility* command will publish the frame 500a.&lt;br /&gt;
&lt;br /&gt;
    telstar-util publish localhost:8080/frame/500a&lt;br /&gt;
&lt;br /&gt;
== Adding/Updating a User ==&lt;br /&gt;
&lt;br /&gt;
Each user ID typically gives access to a single information provider page. In the case of major providers this could be one of the three digit page numbers and everything beneath it. For example the user ID 500, will have access to pages 500 including all decendants e.g. 5001-5009, 50011, 50021, 500111 etc. but not 501 or 502.&lt;br /&gt;
&lt;br /&gt;
To add or update a user the HTTP PUT request is used. If the user already exists on TELSTAR the user will be updated, if it does not exist then it will be created.&lt;br /&gt;
&lt;br /&gt;
The following examples add the user 800800 to the system. Note that only the *root* user (user 0) can make user changes. All passwords are stored in hashed form.&lt;br /&gt;
&lt;br /&gt;
The following *telstar-utility* command will create the user *800800* with the password *mysecretpassword*.&lt;br /&gt;
&lt;br /&gt;
    telstar-util adduser localhost:8080 800800 mysecretpassword&lt;br /&gt;
&lt;br /&gt;
== Deleting a User ==&lt;br /&gt;
&lt;br /&gt;
The following examples delete the user 800800 from the system using the HTTP DELETE method. Note that only the *root* user (user 0) can make user changes.&lt;br /&gt;
&lt;br /&gt;
The following *telstar-utility* command will delete the user *800800*.&lt;br /&gt;
&lt;br /&gt;
    telstar-util deleteuser localhost:8080 800800&lt;/div&gt;</summary>
		<author><name>John</name></author>
	</entry>
	<entry>
		<id>https://wiki.glasstty.com/index.php?title=The_Telstar_API&amp;diff=280</id>
		<title>The Telstar API</title>
		<link rel="alternate" type="text/html" href="https://wiki.glasstty.com/index.php?title=The_Telstar_API&amp;diff=280"/>
		<updated>2022-04-15T05:25:59Z</updated>

		<summary type="html">&lt;p&gt;John: /* Initialising the API */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
Frames can be added to the system using either the Telstar API or by using a plug-in (see [[Implementing Response Frames]])&lt;br /&gt;
&lt;br /&gt;
The Telstar API, in conjunction with the cross platform Telstar Util software, provides a simple method of creating and managing pages. Data is passed to and from the API in JSON format, making the system very simple to use in any programming language.&lt;br /&gt;
&lt;br /&gt;
The API is a restful API that uses the GET, PUT and DELETE HTTP methods. This makes it a simple process to add new frames and update existing frames. In order to use the system a username and password combination is used to create a security token. This token is then used for subsequent requests to access the API (see below).&lt;br /&gt;
&lt;br /&gt;
Data is passed to and from the API in JSON format, making the system very simple to use in any programming language. The whole API could be used without any programming at all by using a command line utility such as CURL. To make things even simpler a *bash* utility called *telstar-util* is available that wraps *curl* making things even simpler.&lt;br /&gt;
&lt;br /&gt;
The utility *telstar-util* can be downloaded from here: (https://glasstty.com/wp-content/uploads/2022/04/telstar-util-2.0.zip).&lt;br /&gt;
&lt;br /&gt;
Versions exist for Linux and MacOS (amd64 and arm64), and Windows (32 and 64 bit). Note that the MacOS version may need to have the quarantine attribute reset. e.g.&lt;br /&gt;
&lt;br /&gt;
    xattr -d com.apple.quarantine telstar-util&lt;br /&gt;
&lt;br /&gt;
The examples in this documentation demonstrate using the ''telstar-util'' command line utility.&lt;br /&gt;
&lt;br /&gt;
'''NOTE:'''&lt;br /&gt;
&lt;br /&gt;
The API will perform its actions on the secondary database of a Telstar system. Once a page has been created, updated or deleted on the secondary database, the API can be used to publish the changes to the primary database if required (see ''Publish'' below).&lt;br /&gt;
&lt;br /&gt;
== Initialising the API ==&lt;br /&gt;
&lt;br /&gt;
The Telstar API runs in a separate container. This uses the same base image but is started with a different parameter. e.g.&lt;br /&gt;
&lt;br /&gt;
    docker run --rm -d --name telstar-api --network telstar-network -p 8001:8001 -e TELSTAR_API_USERID=2222222222 -e TELSTAR_API_PASSWORD=1234 -e TELSTAR_COOKIE_SECRET=b6c7a826-96d6-4f45-88c4-3cf27cc2c647 johnnewcombe/telstar:amd64-2.0-RC3.4 api --port 8001 --init&lt;br /&gt;
&lt;br /&gt;
This will start an api server listening on port 8001. the --init parameter will create the root user (user 0) based on the specified environment variables.&lt;br /&gt;
&lt;br /&gt;
'''Remember to use a unique cookie secret for your system and keep it safe.''' The cookie secret is used to encrypt and decrypt the secure cookie within the telstar API. If this is made public, it may allow someone to create a valid authorisation cookie and impersonate a user of the system.&lt;br /&gt;
&lt;br /&gt;
== Authentication ==&lt;br /&gt;
&lt;br /&gt;
The docker command used above included the *--init* parameter, this parameter creates a user based on the values specified in the following environment variables.&lt;br /&gt;
&lt;br /&gt;
    TELSTAR_API_USERID&lt;br /&gt;
    TELSTAR_API_PASSWORD&lt;br /&gt;
&lt;br /&gt;
Typically this will be used to create the ''root'' user (user 0) and this is demonstrated in the docker-compose example ([[Orchestrating Telstar with Docker Compose]]) User ''0'' is a special user that has read, write and delete accesss to all pages within the system. Other users can be defined that have access to a specific group of pages.&lt;br /&gt;
&lt;br /&gt;
All API users are common across primary and secondary databases. For example the user ID 500, will have access to pages 500 including all decendants e.g. 5001-5009, 50011, 50021, 500111 etc. on both primary and secondary databases.&lt;br /&gt;
&lt;br /&gt;
Once a User ID has been created it can be used to obtain a token. This token is then used in subsequent calls to the API. For example to access the API running on the local host, with the user ID specified above, the following ''telstar-util'' command could be used.&lt;br /&gt;
&lt;br /&gt;
    telstar-util login localhost:8080 0 telstarapisecret&lt;br /&gt;
&lt;br /&gt;
The important thing to note here is that cookies are saved to the file ''telstar-util.tok''. This file contains the secure token. Subsequent requests to the API will forward the token in the request.&lt;br /&gt;
&lt;br /&gt;
## Retrievings Frames (GET)&lt;br /&gt;
&lt;br /&gt;
Once authorised, any frame can be retrieved with a simple GET request.&lt;br /&gt;
&lt;br /&gt;
The frame will be returned and redirected to the file *500a.json*.&lt;br /&gt;
&lt;br /&gt;
    telstar-util getframe localhost:8080 500a &amp;gt; 500a.json&lt;br /&gt;
&lt;br /&gt;
== Frames and JSON ==&lt;br /&gt;
&lt;br /&gt;
The simplest frame that can be viewed on TELSTAR could be defined as follows.&lt;br /&gt;
&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;pid&amp;quot;: {&lt;br /&gt;
            &amp;quot;page-no&amp;quot;: 101,&lt;br /&gt;
            &amp;quot;frame-id&amp;quot;: &amp;quot;a&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;visible&amp;quot;: true&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
This frame, is so basic that it doesn't even have content. However, when viewed within TELSTAR it will show a default welcome message.&lt;br /&gt;
&lt;br /&gt;
Shown below is a more complete example of a JSON defined frame. With this particular frame, the actual viewdata content has been created using the editor at [http://edit.tf](http://edit.tf), this can be seen in the *content.data* and *content.type* keys. However, there are several ways to create frames other than using [http://edit.tf](http://edit.tf). For more details of the frame structure and the various settings please see [Frames in Detail](frames.md).&lt;br /&gt;
&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;pid&amp;quot;: {&lt;br /&gt;
        &amp;quot;page-no&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;frame-id&amp;quot;: &amp;quot;a&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;visible&amp;quot;: true,&lt;br /&gt;
      &amp;quot;frame-type&amp;quot;: &amp;quot;information&amp;quot;,&lt;br /&gt;
      &amp;quot;content&amp;quot;: {&lt;br /&gt;
        &amp;quot;data&amp;quot;: &amp;quot;http://edit.tf/#0:QIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQMMKAbNw6dyCTuyZfCBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgKJEiRIkSJEiRIkSJEiRIkSJEiRIkSJEiRIkSJEiRIkSJEiRAxQR4s6LSgzEEmdUi0otOogkzo0-lNg1JM-cCg8unNYgQIASBBj67OnXllWIMu7pl5dMOndty7uixBoy4dnTQsQIECBAgBIEHfLh2dNCDDuyINmnNl59POzKuQIECBAgQIECBAgQIECBAyQTotemggzoiCvFg1JEWkCnYemnfuw7EGHdkQIECBAgQIASBBp3dMvLdh6ad-7DsQbsvfmgw7siDvlw9NGXkuQIECBAgQM0EKrTkzotOmgkzo0-lNg1JM-cCh79vDDu8oMO7IgQIECAEgQYuvPTuy8-aDdl781wM6EjVKcVBMw9MvPogoctOPLzQIEDRBHn1otKdNizqiCTOjT6U2DUkz5wKlvw5OaxByw6dixAgBIEGHdkQUMPLZpw7cu7ouQIECBAgQIECBAgQIECBAgQIECBA2QR4NSLXg2UFOLSrSYcWmCnWKkWYsQVIsWNBsLEEOHMaIASBBh3ZEHTRlQQ9-zfz54diCHh7ZUGHJ2y7unXllXIECBAgQN0EifMkxINmmCqcsPbLsQYd2RBI37NOTD5QbsvfmuQIECBA4CHQc2TDpT50WogcMGCAScgoOnLTi69MqDpvQdNGnmgQIAaBBzy8u2nHlQd9PTQgqZdmXnvzdO-HllQYd2RBt38sq5AgQOQ0yfHQT40ZYgp2adSLNQSZ0aegTIKkWnUQUIMeLTQIECAokSJEiRIkSJEiRIkSJEiRIkSJEiRIkSJEiRIkSJEiRIkSJEFeLBqSItJBGn0osODTqIBIM6EQIEFDDnyoFTJywvoECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECA&amp;quot;,&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;edit.tf&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;routing-table&amp;quot;: [0,1,11,3,400,5,6,7,800,9,0],&lt;br /&gt;
      &amp;quot;cursor&amp;quot;: false,&lt;br /&gt;
      &amp;quot;author-id&amp;quot;: &amp;quot;editf-frame-generator&amp;quot;,&lt;br /&gt;
      &amp;quot;navmsg-forecolour&amp;quot;: &amp;quot;yellow&amp;quot;,&lt;br /&gt;
      &amp;quot;navmsg-backcolour&amp;quot;: &amp;quot;blue&amp;quot;,&lt;br /&gt;
      &amp;quot;navmsg-highlight&amp;quot;: &amp;quot;white&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
== Adding/Updating a Frame ==&lt;br /&gt;
&lt;br /&gt;
To add or update a frame the HTTP PUT request is used. If the frame already exists on TELSTAR the frame will be updated, if it does not exist then it will be created.&lt;br /&gt;
&lt;br /&gt;
The following *telstar-utility* command will send the json frame stored in the file *500a.json* to the Telstar API using the Http PUT method.&lt;br /&gt;
&lt;br /&gt;
    telstar-util addframe localhost:8080 500a.json&lt;br /&gt;
&lt;br /&gt;
== Deleting a Frame ==&lt;br /&gt;
&lt;br /&gt;
A frame can be deleted using the HTTP DELETE method.&lt;br /&gt;
&lt;br /&gt;
The following *telstar-utility* example will delete the frame 500a.&lt;br /&gt;
&lt;br /&gt;
    telstar-util deleteframe localhost:8080/frame/500a&lt;br /&gt;
&lt;br /&gt;
== Publish Changes ==&lt;br /&gt;
&lt;br /&gt;
As described previously, the API will perform its actions on the secondary database of a Telstar system.&lt;br /&gt;
&lt;br /&gt;
Once a page has been created, updated or deleted on the secondary database, the API can be used to *publish* the changes to the primary database if required.&lt;br /&gt;
&lt;br /&gt;
Publishing will update the primary database to that of the secondary for the specified frame. If the frame is deleted in the secondary and then published, it will be deleted in the primary also.&lt;br /&gt;
&lt;br /&gt;
The following *telstar-utility* command will publish the frame 500a.&lt;br /&gt;
&lt;br /&gt;
    telstar-util publish localhost:8080/frame/500a&lt;br /&gt;
&lt;br /&gt;
== Adding/Updating a User ==&lt;br /&gt;
&lt;br /&gt;
Each user ID typically gives access to a single information provider page. In the case of major providers this could be one of the three digit page numbers and everything beneath it. For example the user ID 500, will have access to pages 500 including all decendants e.g. 5001-5009, 50011, 50021, 500111 etc. but not 501 or 502.&lt;br /&gt;
&lt;br /&gt;
To add or update a user the HTTP PUT request is used. If the user already exists on TELSTAR the user will be updated, if it does not exist then it will be created.&lt;br /&gt;
&lt;br /&gt;
The following examples add the user 800800 to the system. Note that only the *root* user (user 0) can make user changes. All passwords are stored in hashed form.&lt;br /&gt;
&lt;br /&gt;
The following *telstar-utility* command will create the user *800800* with the password *mysecretpassword*.&lt;br /&gt;
&lt;br /&gt;
    telstar-util adduser localhost:8080 800800 mysecretpassword&lt;br /&gt;
&lt;br /&gt;
== Deleting a User ==&lt;br /&gt;
&lt;br /&gt;
The following examples delete the user 800800 from the system using the HTTP DELETE method. Note that only the *root* user (user 0) can make user changes.&lt;br /&gt;
&lt;br /&gt;
The following *telstar-utility* command will delete the user *800800*.&lt;br /&gt;
&lt;br /&gt;
    telstar-util deleteuser localhost:8080 800800&lt;/div&gt;</summary>
		<author><name>John</name></author>
	</entry>
	<entry>
		<id>https://wiki.glasstty.com/index.php?title=Installing_Telstar&amp;diff=279</id>
		<title>Installing Telstar</title>
		<link rel="alternate" type="text/html" href="https://wiki.glasstty.com/index.php?title=Installing_Telstar&amp;diff=279"/>
		<updated>2022-04-15T05:25:38Z</updated>

		<summary type="html">&lt;p&gt;John: /* Pull the Images and Run the Containers */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;It is recommended that Telstar is installed into a Docker environment. The required images are available from https://hub.docker.com/repository/docker/johnnewcombe/telstar. The following examples can be used to install and run Telstar. In addition&lt;br /&gt;
examples are also given for orchestrating the services using both Docker Compose and Kubernetes.&lt;br /&gt;
&lt;br /&gt;
To run Telstar using Docker, a minimum of two Docker images are required.&lt;br /&gt;
&lt;br /&gt;
* The official Docker image '''mongodb'''&lt;br /&gt;
* The Docker image '''telstar'''&lt;br /&gt;
&lt;br /&gt;
In addition, a Docker network will need to created to allow the images to communicate, and a Docker volume is desirable to allow for configuration changes and the addition of plugins.&lt;br /&gt;
&lt;br /&gt;
== Create the Docker Network and Volumes ==&lt;br /&gt;
&lt;br /&gt;
The Docker network is used to allow communication between the TELSTAR application and the ''mongo'' database. The volumes provide a means to persist configuration data, plugins to be added and the ''mongo'' databse itself.&lt;br /&gt;
&lt;br /&gt;
The following commands will create the resources required.&lt;br /&gt;
&lt;br /&gt;
    $ docker network create telstar-network&lt;br /&gt;
    $ docker volume create telstar-volume&lt;br /&gt;
    $ docker volume create mongo-volume&lt;br /&gt;
&lt;br /&gt;
== Pull the Images and Run the Containers ==&lt;br /&gt;
&lt;br /&gt;
Pull the required images as follows (example shows amd64 image, see https://hub.docker.com/repository/docker/johnnewcombe/telstar/tags?page=1&amp;amp;ordering=last_updated).&lt;br /&gt;
&lt;br /&gt;
    $ docker pull johnnewcombe/telstar:amd64-2.0-RC3.4 .&lt;br /&gt;
    $ docker pull mongo&lt;br /&gt;
&lt;br /&gt;
''Please note that the tag used with the official mongo image may need to be set to the system architecture that is to be used. Please see https://hub.docker.com/_/mongo.//&lt;br /&gt;
&lt;br /&gt;
Start the ''mongodb'' container and connect it to the previously created network using the command below.&lt;br /&gt;
&lt;br /&gt;
''Please note that the '--name' parameter is important as it is used as part of the database connection string from the TELSTAR container.''&lt;br /&gt;
&lt;br /&gt;
    $ docker run --name telstar-mongo --network telstar-network -v mongo-volume:/data/db -d -e MONGO_INITDB_ROOT_USERNAME=mongoadmin -e MONGO_INITDB_ROOT_PASSWORD=secret mongo&lt;br /&gt;
&lt;br /&gt;
The Docker ''run'' command can be used to start the Telstar container and connect it to the previously created network. Note that in the example below the internal port is specified as 6512 and that this is mapped to the same port on the host system. This is also specified at the end of the command to inform TELSTAR that this is the port to listen on.&lt;br /&gt;
&lt;br /&gt;
    $ docker run --rm -d --name telstar-server --network telstar-network -p 6512:6512 -v telstar-volume:/opt/telstar/volume johnnewcombe/telstar:amd64-2.0-RC3.4 server --port=6512&lt;br /&gt;
&lt;br /&gt;
In order to add some example content to the system, the ''init'' parameter can be used as in the example below.&lt;br /&gt;
&lt;br /&gt;
    $ docker run --rm -d --name telstar-server --network telstar-network -p 6512:6512 -v telstar-volume:/opt/telstar/volume johnnewcombe/telstar:amd64-2.0-RC3.4 server --port=6512 --init&lt;br /&gt;
&lt;br /&gt;
If the ''--init'' switch is used as in the example above, the service will be running with some example content (see [[Example Content]]) and can be accessed using a suitable client.&lt;br /&gt;
&lt;br /&gt;
In order to add additional content to the system the Telstar API can be used, this can be started as follows (see [[the Telstar API]] for mor details).&lt;br /&gt;
&lt;br /&gt;
    docker run --rm -d --name telstar-api --network telstar-network -p 8011:8011 -e TELSTAR_API_USERID=2222222222 -e TELSTAR_API_PASSWORD=1234 -e TELSTAR_COOKIE_SECRET=b6c7a826-96d6-4f45-88c4-3cf27cc2c647 johnnewcombe/telstar:amd64-2.0-RC3.4 api --port 8001 --init&lt;br /&gt;
&lt;br /&gt;
The simplest way to test the system from a desktop machine is to use the [[Telstar Viewdata Client]] alternatively Telnet can be used. TELSTAR is not a Telnet application but telnet can be used to provide a ''sanity check'' e.g.&lt;br /&gt;
&lt;br /&gt;
    $ telnet &amp;lt;ip-of-docker-host&amp;gt; &amp;lt;port-used-for-telstar&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the system is working, a display similar to the following would be shown.&lt;br /&gt;
&lt;br /&gt;
    Connected to glasstty.com.&lt;br /&gt;
    Escape character is '^]'.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    20201128T1316Z&lt;br /&gt;
    L             TE&lt;br /&gt;
     ST&lt;br /&gt;
    Welcome&lt;br /&gt;
&lt;br /&gt;
    $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$&lt;br /&gt;
             Welcome to theTELSTAR&lt;br /&gt;
               videotex service.&lt;br /&gt;
&lt;br /&gt;
         You are connected toELIOT.&lt;br /&gt;
    $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$&lt;br /&gt;
    ...&lt;br /&gt;
&lt;br /&gt;
The screen looks a little garbled simply because TELSTAR is a videotex application not a Telnet application.&lt;br /&gt;
&lt;br /&gt;
== Docker Compose and Kubernetes ==&lt;br /&gt;
&lt;br /&gt;
In the examples above the Docker command was used to set up the system. Howevevr, it may be more appropriate to use Docker Compose See [[Orchestrating Telstar with Docker Compose]]. Telstar could even be implemented using Kubernetes, see [[Orchestrating Telstar with Kubernetes]] sections for other examples.&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
Configuration options for the docker containers can be specified using environment variables, these can be specified as part of the ''docker run'' command or within the Docker Compose yaml file (see above). Full details of all of the available environment variables can be found in the section [[Configuration Options]].&lt;br /&gt;
&lt;br /&gt;
== Portainer ==&lt;br /&gt;
&lt;br /&gt;
The Docker environmemnt can be managed using Portainer, see [[Managing Telstar with Portainer]].&lt;br /&gt;
&lt;br /&gt;
[[File:2827664245-portainer.png]]&lt;/div&gt;</summary>
		<author><name>John</name></author>
	</entry>
	<entry>
		<id>https://wiki.glasstty.com/index.php?title=Frames&amp;diff=278</id>
		<title>Frames</title>
		<link rel="alternate" type="text/html" href="https://wiki.glasstty.com/index.php?title=Frames&amp;diff=278"/>
		<updated>2022-04-15T04:40:55Z</updated>

		<summary type="html">&lt;p&gt;John: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;As is typical with interactive videotex systems, pages are numbered from 0 to 999999999 and consist of one or more frames with the suffix a-z, for example the first frame for page 200 would be 200a, the second 200b and so on (see [[Routing]]) for more details). These frames are stored within TELSTAR's database as ''JSON'' objects (see https://www.json.org/) and uploaded to Telstar using a simple command line utility.&lt;br /&gt;
&lt;br /&gt;
The Telstar utility program simply interacts with the Telstar API which is a restful API. This can be used directly by any software making it simple to programitically manage pages and routing information.&lt;br /&gt;
&lt;br /&gt;
Frames are defined in JSON. The simplest frame that can be viewed on TELSTAR would be as follows. This would create a simple information frame with some flashing content.&lt;br /&gt;
&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;pid&amp;quot;: {&lt;br /&gt;
        &amp;quot;page-no&amp;quot;: 101,&lt;br /&gt;
        &amp;quot;frame-id&amp;quot;: &amp;quot;a&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;visible&amp;quot;: true,&lt;br /&gt;
      &amp;quot;content&amp;quot;: {&lt;br /&gt;
        &amp;quot;data&amp;quot;: &amp;quot;[D]This is page[F]101a&amp;quot;,&lt;br /&gt;
         &amp;quot;type&amp;quot;: &amp;quot;markup&amp;quot;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Shown below is a more complete example of a JSON defined frame. With this particular frame, the actual viewdata content has been created using the editor at http://edit.tf, this can be seen in the ''content.data'' and ''content.type'' keys. The example below is a simple information page with some simple routing (see [[Routing]]). Clicking the ''content.data'' link, or pasteing the value into a browser will show the page and allow it to be edited. It is not necessary to use the http://edit.tf editor, this is just one possible option.&lt;br /&gt;
&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;pid&amp;quot;: {&lt;br /&gt;
        &amp;quot;page-no&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;frame-id&amp;quot;: &amp;quot;a&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;visible&amp;quot;: true,&lt;br /&gt;
      &amp;quot;frame-type&amp;quot;: &amp;quot;information&amp;quot;,&lt;br /&gt;
      &amp;quot;content&amp;quot;: {&lt;br /&gt;
        &amp;quot;data&amp;quot;: &amp;quot;http://edit.tf/#0:QIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQMMKAbNw6dyCTuyZfCBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgKJEiRIkSJEiRIkSJEiRIkSJEiRIkSJEiRIkSJEiRIkSJEiRAxQR4s6LSgzEEmdUi0otOogkzo0-lNg1JM-cCg8unNYgQIASBBj67OnXllWIMu7pl5dMOndty7uixBoy4dnTQsQIECBAgBIEHfLh2dNCDDuyINmnNl59POzKuQIECBAgQIECBAgQIECBAyQTotemggzoiCvFg1JEWkCnYemnfuw7EGHdkQIECBAgQIASBBp3dMvLdh6ad-7DsQbsvfmgw7siDvlw9NGXkuQIECBAgQM0EKrTkzotOmgkzo0-lNg1JM-cCh79vDDu8oMO7IgQIECAEgQYuvPTuy8-aDdl781wM6EjVKcVBMw9MvPogoctOPLzQIEDRBHn1otKdNizqiCTOjT6U2DUkz5wKlvw5OaxByw6dixAgBIEGHdkQUMPLZpw7cu7ouQIECBAgQIECBAgQIECBAgQIECBA2QR4NSLXg2UFOLSrSYcWmCnWKkWYsQVIsWNBsLEEOHMaIASBBh3ZEHTRlQQ9-zfz54diCHh7ZUGHJ2y7unXllXIECBAgQN0EifMkxINmmCqcsPbLsQYd2RBI37NOTD5QbsvfmuQIECBA4CHQc2TDpT50WogcMGCAScgoOnLTi69MqDpvQdNGnmgQIAaBBzy8u2nHlQd9PTQgqZdmXnvzdO-HllQYd2RBt38sq5AgQOQ0yfHQT40ZYgp2adSLNQSZ0aegTIKkWnUQUIMeLTQIECAokSJEiRIkSJEiRIkSJEiRIkSJEiRIkSJEiRIkSJEiRIkSJEFeLBqSItJBGn0osODTqIBIM6EQIEFDDnyoFTJywvoECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECA&amp;quot;,&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;edit.tf&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;routing-table&amp;quot;: [0,1,11,3,400,5,6,7,800,9,0],&lt;br /&gt;
      &amp;quot;cursor&amp;quot;: false,&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
== Adding Frames to the System ==&lt;br /&gt;
&lt;br /&gt;
Frames can be added to the system using either the Telstar API.&lt;br /&gt;
&lt;br /&gt;
The Telstar API, in conjunction with the cross platform Telstar Util software, provides a simple method of creating and managing pages.&lt;br /&gt;
&lt;br /&gt;
The API can be used to retrieve and update frames and configuring routing. The API is a restful API that uses the GET, PUT, POST and DELETE HTTP methods and as such can be used from any application.&lt;br /&gt;
&lt;br /&gt;
Data is passed to and from the API in JSON format, making the system very simple to use in any programming language. The whole API could be used without any programming at all by using a command line utility such as CURL.&lt;br /&gt;
&lt;br /&gt;
''Further details of the Telstar API can be found in the section [[The Telstar API]].''&lt;br /&gt;
&lt;br /&gt;
== Adding Content with the Edit.tf editor ==&lt;br /&gt;
&lt;br /&gt;
There are several ways to add content to a page. One of the easiest is to create the page in an editor such as http://edit.tf.&lt;br /&gt;
&lt;br /&gt;
The JSON file would look something like the one showm below. Note that the content type is set to editf and the content data contains the edit.tf url.&lt;br /&gt;
&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;pid&amp;quot;: {&lt;br /&gt;
            &amp;quot;page-no&amp;quot;: 101,&lt;br /&gt;
            &amp;quot;frame-id&amp;quot;: &amp;quot;a&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;visible&amp;quot;: true,&lt;br /&gt;
        &amp;quot;frame-type&amp;quot;: &amp;quot;information&amp;quot;,&lt;br /&gt;
        &amp;quot;content&amp;quot;: {&lt;br /&gt;
            &amp;quot;data&amp;quot;: &amp;quot;http://edit.tf/#0:QIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQICn_OmTJkSJApUqVKlSpUlcHApiTJkyZEiRIkyZMmTIkSJFmKf3JX58____RBg-fPnzog__2iBBo-fNX9qgQcOHDh8-fGiAp_zFf______2v7_____7X___oEGr__Qa0ur_________QoCn9ywK__6D__a__7dH__tf___1QIv_9AiQIkaPX_bo0aMpiKf_-Yr__oP_9r__tUH_-1____9og__yjnz5cldX9qUc-fPkp__uSv_-g__2v_-1Qf_7X__aIv____KZv_dIV__2pTN___yn__mK___z__a____5__tf_9qgVf__8o5_vWJX__alHP___Kf_7kr____6dBr_____-h__2qBBr__ymbPnSFf69CUzf__8pnz5iq9ejRoECBWvXr0KBGjQYOHBHz4cECBAgwcCily7__yqDhw4ePnzogQeP7RAg0fPiBB___9X___QYPH___-sCmb__KoP________3B__tUCDV__tUH___1f36XB-_______KOf_8qgRo__9B__v9X___QINX___Qav__B8-NNX_-jR___8pm__ymYrq______h_odX9qg1f___7q__9X_-h1f_5TBgwYM37__KOSur-_Ro0Pr_8_f_qDV_b___r__1f_6D___lFKlSpUu__8pmK_v7VAgwf______tNX9r______V__oP__-gQaPnwpm__yqDB__tUCD__QIEG___1f2qL____9X_-g____z5-__ymb__KoNX_-lQKl6VAgQav6_V__oNf___1f2qBX_____9-hKOf_8qgVJ0JRw4cOPLkqiQoESNGgVL0aFEjQoECJGjRoymDNm__ymTJkzZv3_____-3bt27du3Thw8efPnz58-fPnz58-fP___QIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECA&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;edit.tf&amp;quot;&lt;br /&gt;
        }    &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
== Adding Content using Markup ==&lt;br /&gt;
&lt;br /&gt;
Content can be added directly to the JSON file using a very simple markup. For example consider the following frame definition.&lt;br /&gt;
&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;pid&amp;quot;: {&lt;br /&gt;
            &amp;quot;page-no&amp;quot;: 101,&lt;br /&gt;
            &amp;quot;frame-id&amp;quot;: &amp;quot;a&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;visible&amp;quot;: true,&lt;br /&gt;
        &amp;quot;frame-type&amp;quot;: &amp;quot;information&amp;quot;,&lt;br /&gt;
        &amp;quot;title&amp;quot;: {&lt;br /&gt;
            &amp;quot;data&amp;quot;: &amp;quot;[D]Welcome\r\n\r\n&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;markup&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;content&amp;quot;: {&lt;br /&gt;
            &amp;quot;data&amp;quot;: &amp;quot;[Y]Hello[C]Telstar[M]World&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;markup&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
This frame uses markup in the title and the content, The title is specified as [D]ouble height and the three words used in the content are coloured yellow, cyan and magenta respectively.&lt;br /&gt;
&lt;br /&gt;
Full details of markup can be found in the [[Markup]] section.&lt;br /&gt;
&lt;br /&gt;
== Complete Frame Description ==&lt;br /&gt;
&lt;br /&gt;
The frame below is a standard information page from the TELSTAR system shown in its JSON format. It represents the first frame of page 9. Taking this frame as an example, a description of the fields and their meaning is decribed below.&lt;br /&gt;
&lt;br /&gt;
''The full json schema can be found [[Frame Schema|here]].''&lt;br /&gt;
&lt;br /&gt;
     {&lt;br /&gt;
    	&amp;quot;pid&amp;quot;: {&lt;br /&gt;
    		&amp;quot;page-no&amp;quot;: 9,&lt;br /&gt;
    		&amp;quot;frame-id&amp;quot;: &amp;quot;a&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;visible&amp;quot;: true,&lt;br /&gt;
        &amp;quot;header-text&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;cost&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;frame-type&amp;quot;: &amp;quot;information&amp;quot;,&lt;br /&gt;
        &amp;quot;redirect&amp;quot;: {&lt;br /&gt;
            &amp;quot;page-no&amp;quot;: 0,&lt;br /&gt;
            &amp;quot;frame-id&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;content&amp;quot;: {&lt;br /&gt;
            &amp;quot;data&amp;quot;: &amp;quot;https://edit.tf/#0:QIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgc4UCBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQICixYsWLFixYsWLFixYsWLFixYsWLFixYsWLFixYsWLFixYgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAxQIIs6PJnRYtKTOjoKkWnUQUIMeLTQIECBAgQIECBAgQIEDRAgp2adSLNQSZ0aegQIECBAgQIECBAgQIECBAgQIECBAgQNkCCPBqRa8GygpxaVaTDi00CBAgQIECBAgQIECBAgQIECBA4QIIc-dUgw6iCJFqQZMymgQIECBAgQIECBAgQIECBAgQIEDlAgmT46CfOQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQMECCZPjoJ8aMgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQICixYsWLFixYsWLFixYsWLFixYsWLFixYsWLFixYsWLFixYgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECAFUQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgBVAMUNMQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIAVQDFDTAlMPUQIECBAgQIECBAgQIECBAgQIECBAgQIECAFUAxQ0wJTD1A0EHSQIECBAgQIECBAgQIECBAgQIECBAgQIECANMCUw9QNBB0kCBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECAPUDQQdJAgQIECBAgQIECBAgQIECAosWLFixYsWLFixYsQIECAHSQIECAosWLFixYsWLFixYsWIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECA&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;edit.tf'&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;title&amp;quot;: {&lt;br /&gt;
            &amp;quot;data&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;routing-table&amp;quot;: [&lt;br /&gt;
            90,&lt;br /&gt;
            91,&lt;br /&gt;
            92,&lt;br /&gt;
            93,&lt;br /&gt;
            94,&lt;br /&gt;
            95,&lt;br /&gt;
            96,&lt;br /&gt;
            97,&lt;br /&gt;
            98,&lt;br /&gt;
            990,&lt;br /&gt;
            0&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;cursor&amp;quot;: false,&lt;br /&gt;
        &amp;quot;connection&amp;quot;: {&lt;br /&gt;
            &amp;quot;address&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
            &amp;quot;mode&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
            &amp;quot;port&amp;quot;: 0&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;author-id&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;response-data&amp;quot;: {&lt;br /&gt;
            &amp;quot;responses&amp;quot;: null,&lt;br /&gt;
            &amp;quot;response-action&amp;quot;: {&lt;br /&gt;
                &amp;quot;exec&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
                &amp;quot;args&amp;quot;: null,&lt;br /&gt;
                &amp;quot;post-action-frame&amp;quot;: {&lt;br /&gt;
                    &amp;quot;page-no&amp;quot;: 0,&lt;br /&gt;
                    &amp;quot;frame-id&amp;quot;: ''&lt;br /&gt;
                },&lt;br /&gt;
                &amp;quot;post-cancel-frame&amp;quot;: {&lt;br /&gt;
                    &amp;quot;page-no&amp;quot;: 0,&lt;br /&gt;
                    &amp;quot;frame-id&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;navmessage-select&amp;quot;: &amp;quot;[B][n][Y]Select item or[W]*page# : [_+]&amp;quot;,&lt;br /&gt;
        &amp;quot;navmessage-notfound&amp;quot;: &amp;quot;[B][n][Y]Page not Found :[W]&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
=== pid ===&lt;br /&gt;
&lt;br /&gt;
Specifies the page number and frame id for the frame.&lt;br /&gt;
&lt;br /&gt;
    	&amp;quot;pid&amp;quot;: {&lt;br /&gt;
    		&amp;quot;page-no&amp;quot;: 9,&lt;br /&gt;
    		&amp;quot;frame-id&amp;quot;: &amp;quot;a&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
&lt;br /&gt;
=== visible ===&lt;br /&gt;
&lt;br /&gt;
When set to false, the frame will not be accessible and will return the ''not found'' system message to the user if an attempt is made to access it.&lt;br /&gt;
&lt;br /&gt;
      &amp;quot;visible&amp;quot;: true,&lt;br /&gt;
&lt;br /&gt;
=== header-text ===&lt;br /&gt;
&lt;br /&gt;
Allows the default header text to be ovwerridden at frame level. If this is left blank the default header will be used, see configuration.&lt;br /&gt;
&lt;br /&gt;
      &amp;quot;header-text&amp;quot;: &amp;quot;[Y]MICRONETn 800 (C)&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
=== cost ===&lt;br /&gt;
&lt;br /&gt;
      &amp;quot;cost&amp;quot;: 0,&lt;br /&gt;
&lt;br /&gt;
=== frame-type ===&lt;br /&gt;
&lt;br /&gt;
The API supports the following frame types ''initial'', ''mainindex'', ''information'', ''exit'', ''gateway'', ''test'' and ''response''.&lt;br /&gt;
&lt;br /&gt;
      &amp;quot;frame-type&amp;quot;: &amp;quot;information&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
* '''initial''': This frame type is used on the start page, see [[Configuration Options]]. Typically only one of these frames would exist within a system.&lt;br /&gt;
* '''mainindex''': This frame type is used on the main index page. , see [[Configuration Options]]. Only one of these frames should exist within a system.&lt;br /&gt;
* '''information''': This frame type is used for all normal content frames.&lt;br /&gt;
* '''exit''': This frame type is used for an exit page, any number of exit pages can be defined. When an exit page is rendered it will close the connection.&lt;br /&gt;
* '''gateway''': This page type is used to define a gateway page and is used in conjunction with the connection element (see below).&lt;br /&gt;
* '''test''': This page type indicates a test page and prevents navigation and system messages from being shown. this is typically used for frames that need to use the whole display such as 'test cards' etc.&lt;br /&gt;
* '''telesoftware''': Telesoftware frames (see [[Telesoftware]]).&lt;br /&gt;
* '''response''': This frame type is used for response frames. See [[Implementing Response Frames]].&lt;br /&gt;
* '''system''': Reserved for use internally.&lt;br /&gt;
* '''exception''': Reserved for use internally.&lt;br /&gt;
&lt;br /&gt;
=== redirect ===&lt;br /&gt;
 &lt;br /&gt;
If set it simply means that the user is redirected to the specified frame. This can be a useful alternative form of navigation to the routing table.&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;redirect&amp;quot;: {&lt;br /&gt;
            &amp;quot;page-no&amp;quot;: 9,&lt;br /&gt;
            &amp;quot;frame-id&amp;quot;: &amp;quot;a&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
&lt;br /&gt;
=== content ===&lt;br /&gt;
&lt;br /&gt;
These elements define the content. The example below shows the content.type to be an edit.tf url. The available types are shown below.&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;content&amp;quot;: {&lt;br /&gt;
            &amp;quot;data&amp;quot;: &amp;quot;https://edit.tf/#0:QIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgc4UCBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQICixYsWLFixYsWLFixYsWLFixYsWLFixYsWLFixYsWLFixYgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAxQIIs6PJnRYtKTOjoKkWnUQUIMeLTQIECBAgQIECBAgQIEDRAgp2adSLNQSZ0aegQIECBAgQIECBAgQIECBAgQIECBAgQNkCCPBqRa8GygpxaVaTDi00CBAgQIECBAgQIECBAgQIECBA4QIIc-dUgw6iCJFqQZMymgQIECBAgQIECBAgQIECBAgQIEDlAgmT46CfOQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQMECCZPjoJ8aMgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQICixYsWLFixYsWLFixYsWLFixYsWLFixYsWLFixYsWLFixYgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECAFUQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgBVAMUNMQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIAVQDFDTAlMPUQIECBAgQIECBAgQIECBAgQIECBAgQIECAFUAxQ0wJTD1A0EHSQIECBAgQIECBAgQIECBAgQIECBAgQIECANMCUw9QNBB0kCBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECAPUDQQdJAgQIECBAgQIECBAgQIECAosWLFixYsWLFixYsQIECAHSQIECAosWLFixYsWLFixYsWIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECA&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;edit.tf'&lt;br /&gt;
        },&lt;br /&gt;
&lt;br /&gt;
Content types:&lt;br /&gt;
&lt;br /&gt;
* '''edit.tf''': If set, then the content will be treated as an edit.tf url. This is converted to RawV before being rendered.&lt;br /&gt;
* '''markup''': If set, then the content will be treated as ''markup'' content. Full details of ''markup'' can be found in the section [[Markup]]&lt;br /&gt;
* '''rawV''': If set, then the content will be treated as raw videotex data. This is 7bit (00-7F) videotex format with control chars between 00-1F and escaped codes for alpha and graphic attributes. Ideally rows should have any trailing spaces removed and replaced with with a CR/LF combination. This will be rendered as is.&lt;br /&gt;
* '''rawT''': If set, then the content will be treated as raw teletex data. This is a 24 x 40 block of 7 bits chars (960 chars) in Teletext format (range 00-7F). This format is used internally when manipulating page data. It will be converted to RawV before being rendered.&lt;br /&gt;
&lt;br /&gt;
=== title ===&lt;br /&gt;
&lt;br /&gt;
This sets the title of the page. In many cases this may be left blank with all of the content specified in the ''content'' section (see above) however, the ''title'' section gives additional flexibility when creating frames.&lt;br /&gt;
&lt;br /&gt;
Values for ''title-type'' are the same as defined for the content section, however, if the type ''edit-tf'' is used then only the first four (default) lines of the edit.tf defined page are used. &lt;br /&gt;
&lt;br /&gt;
Separating title from content in this way allows logos and header sections to be created for the title whilst using markup for the main content or visa-versa. &lt;br /&gt;
&lt;br /&gt;
The example here is shown blank meaning that only the data in the ''content'' section is displayed.&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;title&amp;quot;: {&lt;br /&gt;
            &amp;quot;data&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
&lt;br /&gt;
=== routing table ===&lt;br /&gt;
&lt;br /&gt;
The routing table defines which pages are navigated towhen a user presses a key whilst viewing the frame. The table has 11 entries with the first 10 representing the keys 0-9, the final entry refers to the ''hash'' (return) key.&lt;br /&gt;
&lt;br /&gt;
The example below shows the default routing table for frame 9a. If the user is viewing this frame and presses 1 the frame 91a will be loaded, assuming it exists. Pressing the ''hash'' (return) key will take the user back to frame 0a, the main index.&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;routing-table&amp;quot;: [&lt;br /&gt;
            90,&lt;br /&gt;
            91,&lt;br /&gt;
            92,&lt;br /&gt;
            93,&lt;br /&gt;
            94,&lt;br /&gt;
            95,&lt;br /&gt;
            96,&lt;br /&gt;
            97,&lt;br /&gt;
            98,&lt;br /&gt;
            99,&lt;br /&gt;
            0&lt;br /&gt;
        ],&lt;br /&gt;
&lt;br /&gt;
=== cursor ===&lt;br /&gt;
&lt;br /&gt;
This element determines whether a cursor is shown on the page. Typically a cursor would only be shown on response frames.&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;cursor&amp;quot;: false,&lt;br /&gt;
        &lt;br /&gt;
=== connection ===&lt;br /&gt;
&lt;br /&gt;
This elements specifies the connection object used for gateway pages.&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;connection&amp;quot;: {&lt;br /&gt;
            &amp;quot;address&amp;quot;: &amp;quot;fish.ccl4.org&amp;quot;,&lt;br /&gt;
            &amp;quot;mode&amp;quot;: &amp;quot;viewdata&amp;quot;,&lt;br /&gt;
            &amp;quot;port&amp;quot;: 23&lt;br /&gt;
        },&lt;br /&gt;
&lt;br /&gt;
The values for ''address and port'' represent the endpoint of the system being accessed and the value for ''mode'' determines how the system is accessed, the options are:&lt;br /&gt;
&lt;br /&gt;
    viewdata&lt;br /&gt;
    full_duplex&lt;br /&gt;
    full_duplex_no_echo&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== author-id ===&lt;br /&gt;
&lt;br /&gt;
This is an optional field that can be used to indicate the author of the page or other source.&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;author-id&amp;quot;: &amp;quot;john&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
=== response-data ===&lt;br /&gt;
&lt;br /&gt;
These fields should be used when the frame type is set to be a ''response-frame''. &lt;br /&gt;
&lt;br /&gt;
There are two main sections, ''response-data'' and ''response-action''. Below is an example of a response frame used for the Telstar weather page. The frame is created in the normal way using ''markup'' or ''edit.tf''. In this example the text ''Town/Cty'' has been positioned near the centre of the page. Immediately to the right of this is a field for the user to enter either a Town or City, the ''response-data'' section defines that field. Once the user submits the frame the section ''response-action'' determines what happens. In the example here a binary file (''telstar-openweather-linux-amd64''), stored in the containers volume directory is executed with a single argument (''myopenweatherapikey''). Note that the ''post-action-frame'' is set to 290b, in this example frame 290b is dynamically generated by the binary file ''telstar-openweather-linux-amd64'' and contains the weather forecast.&lt;br /&gt;
&lt;br /&gt;
Full details of how to implement response frames are detailed in the section [[Implementing Response Frames]].&lt;br /&gt;
    &amp;quot;response-data&amp;quot;: {&lt;br /&gt;
        &amp;quot;response-fields&amp;quot;: [&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;vpos&amp;quot;: 8,&lt;br /&gt;
                &amp;quot;hpos&amp;quot;: 4,&lt;br /&gt;
                &amp;quot;required&amp;quot;: true,&lt;br /&gt;
                &amp;quot;length&amp;quot;: 16,&lt;br /&gt;
                &amp;quot;type&amp;quot;: &amp;quot;alphanumeric&amp;quot;,&lt;br /&gt;
                &amp;quot;auto-submit&amp;quot;: false,&lt;br /&gt;
                &amp;quot;password&amp;quot;: false&lt;br /&gt;
            }&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;response-action&amp;quot;: {&lt;br /&gt;
            &amp;quot;exec&amp;quot;: &amp;quot;/opt/telstar/volume/telstar-openweather-linux-amd64&amp;quot;,&lt;br /&gt;
            &amp;quot;args&amp;quot;: [&lt;br /&gt;
                &amp;quot;myopenweatherapikey&amp;quot;&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;post-action-frame&amp;quot;: {&lt;br /&gt;
                &amp;quot;page-no&amp;quot;: 290,&lt;br /&gt;
                &amp;quot;frame-id&amp;quot;: &amp;quot;c&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
=== navmessage-select ===&lt;br /&gt;
&lt;br /&gt;
Allows the ''navigation'' system message to be customised at frame level. In most cases this can be left blank in order that the system default is used instead, see [[Configuration Options]].&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;navmessage-select&amp;quot;: &amp;quot;[B][n][Y]Select item or[W]*page# : [_+]&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
=== navmessage-notfound ===&lt;br /&gt;
&lt;br /&gt;
Allows the ''not found'' system message to be customised at frame level. In most cases this can be left blank in order that the system default is used instead, see [[Configuration Options]].&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;navmessage-notfound&amp;quot;: &amp;quot;[B][n][Y]Page not Found :[W]&amp;quot;&lt;/div&gt;</summary>
		<author><name>John</name></author>
	</entry>
	<entry>
		<id>https://wiki.glasstty.com/index.php?title=The_Telstar_API&amp;diff=275</id>
		<title>The Telstar API</title>
		<link rel="alternate" type="text/html" href="https://wiki.glasstty.com/index.php?title=The_Telstar_API&amp;diff=275"/>
		<updated>2022-04-14T21:16:29Z</updated>

		<summary type="html">&lt;p&gt;John: /* Initialising the API */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
Frames can be added to the system using either the Telstar API or by using a plug-in (see [[Implementing Response Frames]])&lt;br /&gt;
&lt;br /&gt;
The Telstar API, in conjunction with the cross platform Telstar Util software, provides a simple method of creating and managing pages. Data is passed to and from the API in JSON format, making the system very simple to use in any programming language.&lt;br /&gt;
&lt;br /&gt;
The API is a restful API that uses the GET, PUT and DELETE HTTP methods. This makes it a simple process to add new frames and update existing frames. In order to use the system a username and password combination is used to create a security token. This token is then used for subsequent requests to access the API (see below).&lt;br /&gt;
&lt;br /&gt;
Data is passed to and from the API in JSON format, making the system very simple to use in any programming language. The whole API could be used without any programming at all by using a command line utility such as CURL. To make things even simpler a *bash* utility called *telstar-util* is available that wraps *curl* making things even simpler.&lt;br /&gt;
&lt;br /&gt;
The utility *telstar-util* can be downloaded from here: (https://glasstty.com/wp-content/uploads/2022/04/telstar-util-2.0.zip).&lt;br /&gt;
&lt;br /&gt;
Versions exist for Linux and MacOS (amd64 and arm64), and Windows (32 and 64 bit). Note that the MacOS version may need to have the quarantine attribute reset. e.g.&lt;br /&gt;
&lt;br /&gt;
    xattr -d com.apple.quarantine telstar-util&lt;br /&gt;
&lt;br /&gt;
The examples in this documentation demonstrate using the ''telstar-util'' command line utility.&lt;br /&gt;
&lt;br /&gt;
'''NOTE:'''&lt;br /&gt;
&lt;br /&gt;
The API will perform its actions on the secondary database of a Telstar system. Once a page has been created, updated or deleted on the secondary database, the API can be used to publish the changes to the primary database if required (see ''Publish'' below).&lt;br /&gt;
&lt;br /&gt;
== Initialising the API ==&lt;br /&gt;
&lt;br /&gt;
The Telstar API runs in a separate container. This uses the same base image but is started with a different parameter. e.g.&lt;br /&gt;
&lt;br /&gt;
    docker run --rm -d --name telstar-api --network telstar-network -p 8001:8001 -e TELSTAR_API_USERID=2222222222 -e TELSTAR_API_PASSWORD=1234 -e TELSTAR_COOKIE_SECRET=b6c7a826-96d6-4f45-88c4-3cf27cc2c647 johnnewcombe/telstar:amd64-2.0-RC3.3 api --port 8001 --init&lt;br /&gt;
&lt;br /&gt;
This will start an api server listening on port 8001. the --init parameter will create the root user (user 0) based on the specified environment variables.&lt;br /&gt;
&lt;br /&gt;
'''Remember to use a unique cookie secret for your system and keep it safe.''' The cookie secret is used to encrypt and decrypt the secure cookie within the telstar API. If this is made public, it may allow someone to create a valid authorisation cookie and impersonate a user of the system.&lt;br /&gt;
&lt;br /&gt;
== Authentication ==&lt;br /&gt;
&lt;br /&gt;
The docker command used above included the *--init* parameter, this parameter creates a user based on the values specified in the following environment variables.&lt;br /&gt;
&lt;br /&gt;
    TELSTAR_API_USERID&lt;br /&gt;
    TELSTAR_API_PASSWORD&lt;br /&gt;
&lt;br /&gt;
Typically this will be used to create the ''root'' user (user 0) and this is demonstrated in the docker-compose example ([[Orchestrating Telstar with Docker Compose]]) User ''0'' is a special user that has read, write and delete accesss to all pages within the system. Other users can be defined that have access to a specific group of pages.&lt;br /&gt;
&lt;br /&gt;
All API users are common across primary and secondary databases. For example the user ID 500, will have access to pages 500 including all decendants e.g. 5001-5009, 50011, 50021, 500111 etc. on both primary and secondary databases.&lt;br /&gt;
&lt;br /&gt;
Once a User ID has been created it can be used to obtain a token. This token is then used in subsequent calls to the API. For example to access the API running on the local host, with the user ID specified above, the following ''telstar-util'' command could be used.&lt;br /&gt;
&lt;br /&gt;
    telstar-util login localhost:8080 0 telstarapisecret&lt;br /&gt;
&lt;br /&gt;
The important thing to note here is that cookies are saved to the file ''telstar-util.tok''. This file contains the secure token. Subsequent requests to the API will forward the token in the request.&lt;br /&gt;
&lt;br /&gt;
## Retrievings Frames (GET)&lt;br /&gt;
&lt;br /&gt;
Once authorised, any frame can be retrieved with a simple GET request.&lt;br /&gt;
&lt;br /&gt;
The frame will be returned and redirected to the file *500a.json*.&lt;br /&gt;
&lt;br /&gt;
    telstar-util getframe localhost:8080 500a &amp;gt; 500a.json&lt;br /&gt;
&lt;br /&gt;
== Frames and JSON ==&lt;br /&gt;
&lt;br /&gt;
The simplest frame that can be viewed on TELSTAR could be defined as follows.&lt;br /&gt;
&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;pid&amp;quot;: {&lt;br /&gt;
            &amp;quot;page-no&amp;quot;: 101,&lt;br /&gt;
            &amp;quot;frame-id&amp;quot;: &amp;quot;a&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;visible&amp;quot;: true&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
This frame, is so basic that it doesn't even have content. However, when viewed within TELSTAR it will show a default welcome message.&lt;br /&gt;
&lt;br /&gt;
Shown below is a more complete example of a JSON defined frame. With this particular frame, the actual viewdata content has been created using the editor at [http://edit.tf](http://edit.tf), this can be seen in the *content.data* and *content.type* keys. However, there are several ways to create frames other than using [http://edit.tf](http://edit.tf). For more details of the frame structure and the various settings please see [Frames in Detail](frames.md).&lt;br /&gt;
&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;pid&amp;quot;: {&lt;br /&gt;
        &amp;quot;page-no&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;frame-id&amp;quot;: &amp;quot;a&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;visible&amp;quot;: true,&lt;br /&gt;
      &amp;quot;frame-type&amp;quot;: &amp;quot;information&amp;quot;,&lt;br /&gt;
      &amp;quot;content&amp;quot;: {&lt;br /&gt;
        &amp;quot;data&amp;quot;: &amp;quot;http://edit.tf/#0:QIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQMMKAbNw6dyCTuyZfCBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgKJEiRIkSJEiRIkSJEiRIkSJEiRIkSJEiRIkSJEiRIkSJEiRAxQR4s6LSgzEEmdUi0otOogkzo0-lNg1JM-cCg8unNYgQIASBBj67OnXllWIMu7pl5dMOndty7uixBoy4dnTQsQIECBAgBIEHfLh2dNCDDuyINmnNl59POzKuQIECBAgQIECBAgQIECBAyQTotemggzoiCvFg1JEWkCnYemnfuw7EGHdkQIECBAgQIASBBp3dMvLdh6ad-7DsQbsvfmgw7siDvlw9NGXkuQIECBAgQM0EKrTkzotOmgkzo0-lNg1JM-cCh79vDDu8oMO7IgQIECAEgQYuvPTuy8-aDdl781wM6EjVKcVBMw9MvPogoctOPLzQIEDRBHn1otKdNizqiCTOjT6U2DUkz5wKlvw5OaxByw6dixAgBIEGHdkQUMPLZpw7cu7ouQIECBAgQIECBAgQIECBAgQIECBA2QR4NSLXg2UFOLSrSYcWmCnWKkWYsQVIsWNBsLEEOHMaIASBBh3ZEHTRlQQ9-zfz54diCHh7ZUGHJ2y7unXllXIECBAgQN0EifMkxINmmCqcsPbLsQYd2RBI37NOTD5QbsvfmuQIECBA4CHQc2TDpT50WogcMGCAScgoOnLTi69MqDpvQdNGnmgQIAaBBzy8u2nHlQd9PTQgqZdmXnvzdO-HllQYd2RBt38sq5AgQOQ0yfHQT40ZYgp2adSLNQSZ0aegTIKkWnUQUIMeLTQIECAokSJEiRIkSJEiRIkSJEiRIkSJEiRIkSJEiRIkSJEiRIkSJEFeLBqSItJBGn0osODTqIBIM6EQIEFDDnyoFTJywvoECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECA&amp;quot;,&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;edit.tf&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;routing-table&amp;quot;: [0,1,11,3,400,5,6,7,800,9,0],&lt;br /&gt;
      &amp;quot;cursor&amp;quot;: false,&lt;br /&gt;
      &amp;quot;author-id&amp;quot;: &amp;quot;editf-frame-generator&amp;quot;,&lt;br /&gt;
      &amp;quot;navmsg-forecolour&amp;quot;: &amp;quot;yellow&amp;quot;,&lt;br /&gt;
      &amp;quot;navmsg-backcolour&amp;quot;: &amp;quot;blue&amp;quot;,&lt;br /&gt;
      &amp;quot;navmsg-highlight&amp;quot;: &amp;quot;white&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
== Adding/Updating a Frame ==&lt;br /&gt;
&lt;br /&gt;
To add or update a frame the HTTP PUT request is used. If the frame already exists on TELSTAR the frame will be updated, if it does not exist then it will be created.&lt;br /&gt;
&lt;br /&gt;
The following *telstar-utility* command will send the json frame stored in the file *500a.json* to the Telstar API using the Http PUT method.&lt;br /&gt;
&lt;br /&gt;
    telstar-util addframe localhost:8080 500a.json&lt;br /&gt;
&lt;br /&gt;
== Deleting a Frame ==&lt;br /&gt;
&lt;br /&gt;
A frame can be deleted using the HTTP DELETE method.&lt;br /&gt;
&lt;br /&gt;
The following *telstar-utility* example will delete the frame 500a.&lt;br /&gt;
&lt;br /&gt;
    telstar-util deleteframe localhost:8080/frame/500a&lt;br /&gt;
&lt;br /&gt;
== Publish Changes ==&lt;br /&gt;
&lt;br /&gt;
As described previously, the API will perform its actions on the secondary database of a Telstar system.&lt;br /&gt;
&lt;br /&gt;
Once a page has been created, updated or deleted on the secondary database, the API can be used to *publish* the changes to the primary database if required.&lt;br /&gt;
&lt;br /&gt;
Publishing will update the primary database to that of the secondary for the specified frame. If the frame is deleted in the secondary and then published, it will be deleted in the primary also.&lt;br /&gt;
&lt;br /&gt;
The following *telstar-utility* command will publish the frame 500a.&lt;br /&gt;
&lt;br /&gt;
    telstar-util publish localhost:8080/frame/500a&lt;br /&gt;
&lt;br /&gt;
== Adding/Updating a User ==&lt;br /&gt;
&lt;br /&gt;
Each user ID typically gives access to a single information provider page. In the case of major providers this could be one of the three digit page numbers and everything beneath it. For example the user ID 500, will have access to pages 500 including all decendants e.g. 5001-5009, 50011, 50021, 500111 etc. but not 501 or 502.&lt;br /&gt;
&lt;br /&gt;
To add or update a user the HTTP PUT request is used. If the user already exists on TELSTAR the user will be updated, if it does not exist then it will be created.&lt;br /&gt;
&lt;br /&gt;
The following examples add the user 800800 to the system. Note that only the *root* user (user 0) can make user changes. All passwords are stored in hashed form.&lt;br /&gt;
&lt;br /&gt;
The following *telstar-utility* command will create the user *800800* with the password *mysecretpassword*.&lt;br /&gt;
&lt;br /&gt;
    telstar-util adduser localhost:8080 800800 mysecretpassword&lt;br /&gt;
&lt;br /&gt;
== Deleting a User ==&lt;br /&gt;
&lt;br /&gt;
The following examples delete the user 800800 from the system using the HTTP DELETE method. Note that only the *root* user (user 0) can make user changes.&lt;br /&gt;
&lt;br /&gt;
The following *telstar-utility* command will delete the user *800800*.&lt;br /&gt;
&lt;br /&gt;
    telstar-util deleteuser localhost:8080 800800&lt;/div&gt;</summary>
		<author><name>John</name></author>
	</entry>
	<entry>
		<id>https://wiki.glasstty.com/index.php?title=The_Telstar_API&amp;diff=274</id>
		<title>The Telstar API</title>
		<link rel="alternate" type="text/html" href="https://wiki.glasstty.com/index.php?title=The_Telstar_API&amp;diff=274"/>
		<updated>2022-04-14T21:03:46Z</updated>

		<summary type="html">&lt;p&gt;John: /* Initialising the API */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
Frames can be added to the system using either the Telstar API or by using a plug-in (see [[Implementing Response Frames]])&lt;br /&gt;
&lt;br /&gt;
The Telstar API, in conjunction with the cross platform Telstar Util software, provides a simple method of creating and managing pages. Data is passed to and from the API in JSON format, making the system very simple to use in any programming language.&lt;br /&gt;
&lt;br /&gt;
The API is a restful API that uses the GET, PUT and DELETE HTTP methods. This makes it a simple process to add new frames and update existing frames. In order to use the system a username and password combination is used to create a security token. This token is then used for subsequent requests to access the API (see below).&lt;br /&gt;
&lt;br /&gt;
Data is passed to and from the API in JSON format, making the system very simple to use in any programming language. The whole API could be used without any programming at all by using a command line utility such as CURL. To make things even simpler a *bash* utility called *telstar-util* is available that wraps *curl* making things even simpler.&lt;br /&gt;
&lt;br /&gt;
The utility *telstar-util* can be downloaded from here: (https://glasstty.com/wp-content/uploads/2022/04/telstar-util-2.0.zip).&lt;br /&gt;
&lt;br /&gt;
Versions exist for Linux and MacOS (amd64 and arm64), and Windows (32 and 64 bit). Note that the MacOS version may need to have the quarantine attribute reset. e.g.&lt;br /&gt;
&lt;br /&gt;
    xattr -d com.apple.quarantine telstar-util&lt;br /&gt;
&lt;br /&gt;
The examples in this documentation demonstrate using the ''telstar-util'' command line utility.&lt;br /&gt;
&lt;br /&gt;
'''NOTE:'''&lt;br /&gt;
&lt;br /&gt;
The API will perform its actions on the secondary database of a Telstar system. Once a page has been created, updated or deleted on the secondary database, the API can be used to publish the changes to the primary database if required (see ''Publish'' below).&lt;br /&gt;
&lt;br /&gt;
== Initialising the API ==&lt;br /&gt;
&lt;br /&gt;
The Telstar API runs in a separate container. This uses the same base image but is started with a different parameter. e.g.&lt;br /&gt;
&lt;br /&gt;
    docker run --rm -d --name telstar-api --network telstar-network -p 8011:8011 -e TELSTAR_API_USERID=2222222222 -e TELSTAR_API_PASSWORD=1234 -e TELSTAR_COOKIE_SECRET=b6c7a826-96d6-4f45-88c4-3cf27cc2c647 johnnewcombe/telstar:amd64-2.0-RC3.3 api --port 8001 --init&lt;br /&gt;
&lt;br /&gt;
This will start an api server listening on port 8001. the --init parameter will create the root user (user 0) based on the specified environment variables.&lt;br /&gt;
&lt;br /&gt;
'''Remember to use a unique cookie secret for your system and keep it safe.''' The cookie secret is used to encrypt and decrypt the secure cookie within the telstar API. If this is made public, it may allow someone to create a valid authorisation cookie and impersonate a user of the system.&lt;br /&gt;
&lt;br /&gt;
== Authentication ==&lt;br /&gt;
&lt;br /&gt;
The docker command used above included the *--init* parameter, this parameter creates a user based on the values specified in the following environment variables.&lt;br /&gt;
&lt;br /&gt;
    TELSTAR_API_USERID&lt;br /&gt;
    TELSTAR_API_PASSWORD&lt;br /&gt;
&lt;br /&gt;
Typically this will be used to create the ''root'' user (user 0) and this is demonstrated in the docker-compose example ([[Orchestrating Telstar with Docker Compose]]) User ''0'' is a special user that has read, write and delete accesss to all pages within the system. Other users can be defined that have access to a specific group of pages.&lt;br /&gt;
&lt;br /&gt;
All API users are common across primary and secondary databases. For example the user ID 500, will have access to pages 500 including all decendants e.g. 5001-5009, 50011, 50021, 500111 etc. on both primary and secondary databases.&lt;br /&gt;
&lt;br /&gt;
Once a User ID has been created it can be used to obtain a token. This token is then used in subsequent calls to the API. For example to access the API running on the local host, with the user ID specified above, the following ''telstar-util'' command could be used.&lt;br /&gt;
&lt;br /&gt;
    telstar-util login localhost:8080 0 telstarapisecret&lt;br /&gt;
&lt;br /&gt;
The important thing to note here is that cookies are saved to the file ''telstar-util.tok''. This file contains the secure token. Subsequent requests to the API will forward the token in the request.&lt;br /&gt;
&lt;br /&gt;
## Retrievings Frames (GET)&lt;br /&gt;
&lt;br /&gt;
Once authorised, any frame can be retrieved with a simple GET request.&lt;br /&gt;
&lt;br /&gt;
The frame will be returned and redirected to the file *500a.json*.&lt;br /&gt;
&lt;br /&gt;
    telstar-util getframe localhost:8080 500a &amp;gt; 500a.json&lt;br /&gt;
&lt;br /&gt;
== Frames and JSON ==&lt;br /&gt;
&lt;br /&gt;
The simplest frame that can be viewed on TELSTAR could be defined as follows.&lt;br /&gt;
&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;pid&amp;quot;: {&lt;br /&gt;
            &amp;quot;page-no&amp;quot;: 101,&lt;br /&gt;
            &amp;quot;frame-id&amp;quot;: &amp;quot;a&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;visible&amp;quot;: true&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
This frame, is so basic that it doesn't even have content. However, when viewed within TELSTAR it will show a default welcome message.&lt;br /&gt;
&lt;br /&gt;
Shown below is a more complete example of a JSON defined frame. With this particular frame, the actual viewdata content has been created using the editor at [http://edit.tf](http://edit.tf), this can be seen in the *content.data* and *content.type* keys. However, there are several ways to create frames other than using [http://edit.tf](http://edit.tf). For more details of the frame structure and the various settings please see [Frames in Detail](frames.md).&lt;br /&gt;
&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;pid&amp;quot;: {&lt;br /&gt;
        &amp;quot;page-no&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;frame-id&amp;quot;: &amp;quot;a&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;visible&amp;quot;: true,&lt;br /&gt;
      &amp;quot;frame-type&amp;quot;: &amp;quot;information&amp;quot;,&lt;br /&gt;
      &amp;quot;content&amp;quot;: {&lt;br /&gt;
        &amp;quot;data&amp;quot;: &amp;quot;http://edit.tf/#0:QIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQMMKAbNw6dyCTuyZfCBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgKJEiRIkSJEiRIkSJEiRIkSJEiRIkSJEiRIkSJEiRIkSJEiRAxQR4s6LSgzEEmdUi0otOogkzo0-lNg1JM-cCg8unNYgQIASBBj67OnXllWIMu7pl5dMOndty7uixBoy4dnTQsQIECBAgBIEHfLh2dNCDDuyINmnNl59POzKuQIECBAgQIECBAgQIECBAyQTotemggzoiCvFg1JEWkCnYemnfuw7EGHdkQIECBAgQIASBBp3dMvLdh6ad-7DsQbsvfmgw7siDvlw9NGXkuQIECBAgQM0EKrTkzotOmgkzo0-lNg1JM-cCh79vDDu8oMO7IgQIECAEgQYuvPTuy8-aDdl781wM6EjVKcVBMw9MvPogoctOPLzQIEDRBHn1otKdNizqiCTOjT6U2DUkz5wKlvw5OaxByw6dixAgBIEGHdkQUMPLZpw7cu7ouQIECBAgQIECBAgQIECBAgQIECBA2QR4NSLXg2UFOLSrSYcWmCnWKkWYsQVIsWNBsLEEOHMaIASBBh3ZEHTRlQQ9-zfz54diCHh7ZUGHJ2y7unXllXIECBAgQN0EifMkxINmmCqcsPbLsQYd2RBI37NOTD5QbsvfmuQIECBA4CHQc2TDpT50WogcMGCAScgoOnLTi69MqDpvQdNGnmgQIAaBBzy8u2nHlQd9PTQgqZdmXnvzdO-HllQYd2RBt38sq5AgQOQ0yfHQT40ZYgp2adSLNQSZ0aegTIKkWnUQUIMeLTQIECAokSJEiRIkSJEiRIkSJEiRIkSJEiRIkSJEiRIkSJEiRIkSJEFeLBqSItJBGn0osODTqIBIM6EQIEFDDnyoFTJywvoECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECBAgQIECA&amp;quot;,&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;edit.tf&amp;quot;&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;routing-table&amp;quot;: [0,1,11,3,400,5,6,7,800,9,0],&lt;br /&gt;
      &amp;quot;cursor&amp;quot;: false,&lt;br /&gt;
      &amp;quot;author-id&amp;quot;: &amp;quot;editf-frame-generator&amp;quot;,&lt;br /&gt;
      &amp;quot;navmsg-forecolour&amp;quot;: &amp;quot;yellow&amp;quot;,&lt;br /&gt;
      &amp;quot;navmsg-backcolour&amp;quot;: &amp;quot;blue&amp;quot;,&lt;br /&gt;
      &amp;quot;navmsg-highlight&amp;quot;: &amp;quot;white&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
== Adding/Updating a Frame ==&lt;br /&gt;
&lt;br /&gt;
To add or update a frame the HTTP PUT request is used. If the frame already exists on TELSTAR the frame will be updated, if it does not exist then it will be created.&lt;br /&gt;
&lt;br /&gt;
The following *telstar-utility* command will send the json frame stored in the file *500a.json* to the Telstar API using the Http PUT method.&lt;br /&gt;
&lt;br /&gt;
    telstar-util addframe localhost:8080 500a.json&lt;br /&gt;
&lt;br /&gt;
== Deleting a Frame ==&lt;br /&gt;
&lt;br /&gt;
A frame can be deleted using the HTTP DELETE method.&lt;br /&gt;
&lt;br /&gt;
The following *telstar-utility* example will delete the frame 500a.&lt;br /&gt;
&lt;br /&gt;
    telstar-util deleteframe localhost:8080/frame/500a&lt;br /&gt;
&lt;br /&gt;
== Publish Changes ==&lt;br /&gt;
&lt;br /&gt;
As described previously, the API will perform its actions on the secondary database of a Telstar system.&lt;br /&gt;
&lt;br /&gt;
Once a page has been created, updated or deleted on the secondary database, the API can be used to *publish* the changes to the primary database if required.&lt;br /&gt;
&lt;br /&gt;
Publishing will update the primary database to that of the secondary for the specified frame. If the frame is deleted in the secondary and then published, it will be deleted in the primary also.&lt;br /&gt;
&lt;br /&gt;
The following *telstar-utility* command will publish the frame 500a.&lt;br /&gt;
&lt;br /&gt;
    telstar-util publish localhost:8080/frame/500a&lt;br /&gt;
&lt;br /&gt;
== Adding/Updating a User ==&lt;br /&gt;
&lt;br /&gt;
Each user ID typically gives access to a single information provider page. In the case of major providers this could be one of the three digit page numbers and everything beneath it. For example the user ID 500, will have access to pages 500 including all decendants e.g. 5001-5009, 50011, 50021, 500111 etc. but not 501 or 502.&lt;br /&gt;
&lt;br /&gt;
To add or update a user the HTTP PUT request is used. If the user already exists on TELSTAR the user will be updated, if it does not exist then it will be created.&lt;br /&gt;
&lt;br /&gt;
The following examples add the user 800800 to the system. Note that only the *root* user (user 0) can make user changes. All passwords are stored in hashed form.&lt;br /&gt;
&lt;br /&gt;
The following *telstar-utility* command will create the user *800800* with the password *mysecretpassword*.&lt;br /&gt;
&lt;br /&gt;
    telstar-util adduser localhost:8080 800800 mysecretpassword&lt;br /&gt;
&lt;br /&gt;
== Deleting a User ==&lt;br /&gt;
&lt;br /&gt;
The following examples delete the user 800800 from the system using the HTTP DELETE method. Note that only the *root* user (user 0) can make user changes.&lt;br /&gt;
&lt;br /&gt;
The following *telstar-utility* command will delete the user *800800*.&lt;br /&gt;
&lt;br /&gt;
    telstar-util deleteuser localhost:8080 800800&lt;/div&gt;</summary>
		<author><name>John</name></author>
	</entry>
	<entry>
		<id>https://wiki.glasstty.com/index.php?title=Installing_Telstar&amp;diff=273</id>
		<title>Installing Telstar</title>
		<link rel="alternate" type="text/html" href="https://wiki.glasstty.com/index.php?title=Installing_Telstar&amp;diff=273"/>
		<updated>2022-04-14T21:03:21Z</updated>

		<summary type="html">&lt;p&gt;John: /* Pull the Images and Run the Containers */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;It is recommended that Telstar is installed into a Docker environment. The required images are available from https://hub.docker.com/repository/docker/johnnewcombe/telstar. The following examples can be used to install and run Telstar. In addition&lt;br /&gt;
examples are also given for orchestrating the services using both Docker Compose and Kubernetes.&lt;br /&gt;
&lt;br /&gt;
To run Telstar using Docker, a minimum of two Docker images are required.&lt;br /&gt;
&lt;br /&gt;
* The official Docker image '''mongodb'''&lt;br /&gt;
* The Docker image '''telstar'''&lt;br /&gt;
&lt;br /&gt;
In addition, a Docker network will need to created to allow the images to communicate, and a Docker volume is desirable to allow for configuration changes and the addition of plugins.&lt;br /&gt;
&lt;br /&gt;
== Create the Docker Network and Volumes ==&lt;br /&gt;
&lt;br /&gt;
The Docker network is used to allow communication between the TELSTAR application and the ''mongo'' database. The volumes provide a means to persist configuration data, plugins to be added and the ''mongo'' databse itself.&lt;br /&gt;
&lt;br /&gt;
The following commands will create the resources required.&lt;br /&gt;
&lt;br /&gt;
    $ docker network create telstar-network&lt;br /&gt;
    $ docker volume create telstar-volume&lt;br /&gt;
    $ docker volume create mongo-volume&lt;br /&gt;
&lt;br /&gt;
== Pull the Images and Run the Containers ==&lt;br /&gt;
&lt;br /&gt;
Pull the required images as follows (example shows amd64 image, see https://hub.docker.com/repository/docker/johnnewcombe/telstar/tags?page=1&amp;amp;ordering=last_updated).&lt;br /&gt;
&lt;br /&gt;
    $ docker pull johnnewcombe/telstar:amd64-2.0-RC3.3 .&lt;br /&gt;
    $ docker pull mongo&lt;br /&gt;
&lt;br /&gt;
''Please note that the tag used with the official mongo image may need to be set to the system architecture that is to be used. Please see https://hub.docker.com/_/mongo.//&lt;br /&gt;
&lt;br /&gt;
Start the ''mongodb'' container and connect it to the previously created network using the command below.&lt;br /&gt;
&lt;br /&gt;
''Please note that the '--name' parameter is important as it is used as part of the database connection string from the TELSTAR container.''&lt;br /&gt;
&lt;br /&gt;
    $ docker run --name telstar-mongo --network telstar-network -v mongo-volume:/data/db -d -e MONGO_INITDB_ROOT_USERNAME=mongoadmin -e MONGO_INITDB_ROOT_PASSWORD=secret mongo&lt;br /&gt;
&lt;br /&gt;
The Docker ''run'' command can be used to start the Telstar container and connect it to the previously created network. Note that in the example below the internal port is specified as 6512 and that this is mapped to the same port on the host system. This is also specified at the end of the command to inform TELSTAR that this is the port to listen on.&lt;br /&gt;
&lt;br /&gt;
    $ docker run --rm -d --name telstar-server --network telstar-network -p 6512:6512 -v telstar-volume:/opt/telstar/volume johnnewcombe/telstar:amd64-2.0-RC3.3 server --port=6512&lt;br /&gt;
&lt;br /&gt;
In order to add some example content to the system, the ''init'' parameter can be used as in the example below.&lt;br /&gt;
&lt;br /&gt;
    $ docker run --rm -d --name telstar-server --network telstar-network -p 6512:6512 -v telstar-volume:/opt/telstar/volume johnnewcombe/telstar:amd64-2.0-RC3.3 server --port=6512 --init&lt;br /&gt;
&lt;br /&gt;
If the ''--init'' switch is used as in the example above, the service will be running with some example content (see [[Example Content]]) and can be accessed using a suitable client.&lt;br /&gt;
&lt;br /&gt;
In order to add additional content to the system the Telstar API can be used, this can be started as follows (see [[the Telstar API]] for mor details).&lt;br /&gt;
&lt;br /&gt;
    docker run --rm -d --name telstar-api --network telstar-network -p 8011:8011 -e TELSTAR_API_USERID=2222222222 -e TELSTAR_API_PASSWORD=1234 -e TELSTAR_COOKIE_SECRET=b6c7a826-96d6-4f45-88c4-3cf27cc2c647 johnnewcombe/telstar:amd64-2.0-RC3.3 api --port 8001 --init&lt;br /&gt;
&lt;br /&gt;
The simplest way to test the system from a desktop machine is to use the [[Telstar Viewdata Client]] alternatively Telnet can be used. TELSTAR is not a Telnet application but telnet can be used to provide a ''sanity check'' e.g.&lt;br /&gt;
&lt;br /&gt;
    $ telnet &amp;lt;ip-of-docker-host&amp;gt; &amp;lt;port-used-for-telstar&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the system is working, a display similar to the following would be shown.&lt;br /&gt;
&lt;br /&gt;
    Connected to glasstty.com.&lt;br /&gt;
    Escape character is '^]'.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    20201128T1316Z&lt;br /&gt;
    L             TE&lt;br /&gt;
     ST&lt;br /&gt;
    Welcome&lt;br /&gt;
&lt;br /&gt;
    $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$&lt;br /&gt;
             Welcome to theTELSTAR&lt;br /&gt;
               videotex service.&lt;br /&gt;
&lt;br /&gt;
         You are connected toELIOT.&lt;br /&gt;
    $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$&lt;br /&gt;
    ...&lt;br /&gt;
&lt;br /&gt;
The screen looks a little garbled simply because TELSTAR is a videotex application not a Telnet application.&lt;br /&gt;
&lt;br /&gt;
== Docker Compose and Kubernetes ==&lt;br /&gt;
&lt;br /&gt;
In the examples above the Docker command was used to set up the system. Howevevr, it may be more appropriate to use Docker Compose See [[Orchestrating Telstar with Docker Compose]]. Telstar could even be implemented using Kubernetes, see [[Orchestrating Telstar with Kubernetes]] sections for other examples.&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
Configuration options for the docker containers can be specified using environment variables, these can be specified as part of the ''docker run'' command or within the Docker Compose yaml file (see above). Full details of all of the available environment variables can be found in the section [[Configuration Options]].&lt;br /&gt;
&lt;br /&gt;
== Portainer ==&lt;br /&gt;
&lt;br /&gt;
The Docker environmemnt can be managed using Portainer, see [[Managing Telstar with Portainer]].&lt;br /&gt;
&lt;br /&gt;
[[File:2827664245-portainer.png]]&lt;/div&gt;</summary>
		<author><name>John</name></author>
	</entry>
</feed>