Version 2.1 · Total.js Flow 11 · MIT license
Total.js Flow, ready for the classroom.
Every student works in a place of their own, the teacher sees the whole class and hands out the practices with one click. Groups, students and teacher come from OpenPlatform.
# One command, the whole class
docker run -d --name flowee -p 8000:8000 \
-v flowee-databases:/www/databases \
-v flowee-flowstream:/www/flowstream \
-v flowee-private:/www/private \
ghcr.io/totaljs-es/flowee// A teacher hands out a practice to every student
Classroom → Assign → "One copy for each student"
// Lab 1 · Ana, Lab 1 · Luis, Lab 1 · Marta…Flow, prepared for teaching
Total.js Flow lets you draw FlowStreams in the browser: diagrams of components connected by messages, for automation, integrations and IoT. This edition keeps everything Flow offers and adds what a class needs.
Every student, their own place
Students only see and touch their own FlowStreams. Not even knowing the identifier of another one lets them open it.
The teacher sees everything
The full list, an overview of the class and access to the editor of any student to help them.
Practices with one click
Prepare a template and hand it out to groups or to each student.
Users and groups from OpenPlatform
Sign-ups, classes and permissions are managed in one place.
What changes compared to Flow
The rules are checked on the server, in every action and in the connection of the editor. Hiding a button is not security, so nothing is only hidden: it is checked.
Teacher (user sa) | Student | |
|---|---|---|
| FlowStreams in the list | All | Those of their groups and, if a FlowStream has an owner, only their own |
| Create a FlowStream | In any group or without a group | Only in their groups, with the create permission |
| Edit, run, pause, restart, export, remove | Any | Only their own (remove needs the permission) |
| Editor and variables of a FlowStream | Any | Only their own |
| Code of the components (read, edit, remove) | Yes | No: they work with the components of the palette of their group and of the template |
| Import FlowStreams | Yes | No. They can duplicate their own FlowStream |
| Global variables, settings, console, CDN cache | Yes | No |
| Classroom panel (templates and overview) | Yes | No |
| Templates | Sees and manages them | Does not see them, even in their group |
Every FlowStream also runs in its own process (flowstream_worker : fork), so a student cannot stop the work of the others.
How it is used in a classroom
Before class you prepare the practice; during class you follow the work of everyone.
Build the practice
Build the exercise as any FlowStream: components, variables and a description with the instructions. In its menu choose Use as template. Students never see templates. In Component palette choose which components each group has: students cannot add or edit them.
Hand it out
Open Classroom in the left menu and press Assign. Every group gets one shared copy, or choose One copy for each student: each one gets their own, named template · student, visible only to them and to you. Assigning again does not repeat copies: use it when new students arrive.
Follow the class
The overview shows student, group, FlowStream, status, errors, messages and last change. Filter by group, template or text to see who has not started. From each row you can open a student’s FlowStream to help, restore it from the template or remove it.
A copy keeps the design, components, variables and description of the template, and starts running by itself. Students enter through OpenPlatform, open Flow and work on their copy; they can create more FlowStreams in their groups if they have the create permission.
Everything the teacher can do
Every tool lives in the Classroom panel, which only teachers see. This is what each one does and how it works.
Practice templates
Build an exercise once and hand it out to the whole class.
- In the menu of any FlowStream choose Use as template. A template is never shown to the students, not even to those of its group.
- In Classroom press Assign and choose the groups. Each group gets one shared copy, or with One copy for each student of the group every student gets their own, named template · student, visible only to them and to you. The second option needs the users API of OpenPlatform (
op_groups). - A copy keeps the design, the components, the variables and the description, and starts running by itself. Assigning again never repeats a copy that already exists, so you can use it when new students arrive.
- Restore from the template replaces the work of a student with the template, to start again.
Class overview
See at a glance who has started, who has errors and who needs help.
- A table with the student, the group, the FlowStream and the template it comes from, its status (running or paused), the errors, the number of messages and the date of the last change.
- Filter by group, by template and by text (student or FlowStream). The same filters apply to deliveries and activity.
- The menu of each row lets you open the FlowStream of a student to help, observe it in real time, restore it from the template or remove it.
Observe in real time
Follow the editor of a student without touching anything.
- Observe in real time, in the menu of a row, opens the editor of that FlowStream in a new tab, read only: an orange bar says so and the controls to change things are not there.
- It is not only the interface: the server refuses any message that would change the FlowStream (design, components, variables, pausing, restarting or removing).
- You see the changes that the student applies, the messages and the errors as they happen. The list of connected editors shows that you are there, and it is recorded in the activity.
Exam mode
Open and close the access of a group by dates, and nothing leaves the exam.
- In Exam mode choose a group and a start and an end. Before the start and after the end the students of the group have no access to their FlowStreams, not even with the editor open, and they cannot create new ones. You always have access, and the other groups are not affected.
- Block exporting, copying and duplicating (on by default): while the exam is open nobody can export a FlowStream, read its raw data or duplicate it. Students can still deliver.
- Deliver the work of every student when the exam ends (on by default): the application delivers by itself, once, and they appear in Deliveries as Automatic.
- Students see a message when they enter: the exam is open (until when), has not started or has finished. After the end the group stays closed until you choose End the exam and restore the access.
Deliveries
Students hand in their work with one click; you get a frozen copy.
- The student chooses Deliver in the menu of a FlowStream. The server keeps a copy (design, components and variables) with its date and number. The student can go on working and deliver again, and the copy that you have never changes. The last 20 deliveries of each FlowStream are kept.
- In Deliveries you can open a delivery as a FlowStream (it becomes yours, without a group, so no student sees it), download it as JSON or remove it.
- Download the last deliveries gives one file with the last delivery of each FlowStream of the group and template that you have filtered, to grade them.
Components: palette and forbidden
Decide which components each group can use. Students cannot add or edit them.
- Palette. Add the components you want to a FlowStream of your own (for example one called Library). In Component palette choose a group and tick them. The FlowStreams of the group get them (they restart once), and so does every new FlowStream. The code is kept on the server, so nobody in the class can change it.
- Forbidden. In Forbidden components choose a group and tick the components to take away: they are removed from its FlowStreams, also from new copies and restored copies, and the nodes that used them stop working. Forbidden wins over the palette. Your templates are not touched.
- The list marks with a warning the components whose code looks like it reaches files or the shell (
child_process,exec,fs,eval…). It is a warning from reading the code, not a proof. Tick Also forbid the ones that look like they reach files or the shell to forbid them automatically, also the ones that arrive later.
Limits for each student
Keep the server healthy in a big class.
- FlowStreams for each student: how many a student can create or duplicate. The copies that you hand out are not counted, and you have no limit. At the limit the student gets a clear message.
- Days without work before pausing: the running FlowStreams that a student has not edited, resumed or restarted for those days are paused. The student can resume them, and the overview shows them as Inactive.
- 0 means without limit. The memory of each FlowStream is limited with
flowstream_memory, andmax_streams/idle_daysgive the starting values.
Activity log
See what each student does and when.
- It records opening the editor, applying changes (one record a minute at most), creating, duplicating, removing, pausing, resuming, restarting, changing the variables, exporting and delivering; and what the application does by itself (pausing for inactivity, delivering when an exam ends). It also records when you open or observe the editor of a student.
- Filter by group, text and period (24 hours, 7 days, 30 days or all the time) and download it as a table (CSV).
- It has personal data: it is kept in your server only for 365 days by default (
FLOWEE_ACTIVITY_DAYSchanges it, 0 keeps it forever), the old months are deleted every day, and you can clear it whenever you want. Tell the students that it is recorded.
What students cannot do
Nobody copies, cheats or breaks a component by accident.
- They cannot read, edit, add or remove the code of the components; the server refuses it, not only the interface.
- They cannot import FlowStreams. They can duplicate their own (within their limit), and a FlowStream that a student exports or reads does not carry the code of the components.
- They cannot read the global variables, the settings or the console, and each FlowStream runs in its own process, so a student cannot stop the work of the others.
Install it with Docker
The image is published in the GitHub Container Registry and is built automatically for amd64 and arm64: a server, an Apple Silicon Mac or a Raspberry Pi. Node.js 24, nothing else to install.
Run it
docker pull ghcr.io/totaljs-es/flowee
docker run -d --name flowee -p 8000:8000 \
-v flowee-databases:/www/databases \
-v flowee-flowstream:/www/flowstream \
-v flowee-private:/www/private \
ghcr.io/totaljs-es/floweeOpen http://localhost:8000. The three volumes keep the settings, the FlowStreams of the class and the private files when you move to a newer image.
Docker Compose
git clone https://github.com/totaljs-es/flowee.git
cd flowee
docker compose up -dThe same thing, with the volumes already declared.
Update it
docker pull ghcr.io/totaljs-es/flowee
docker rm -f flowee
# run the docker run above againThe volumes keep the data. Without Docker: npm install and npm start (Node.js 24).
How much machine? Every FlowStream is an independent process. Plan the memory for the largest class working at the same time and limit it with flowstream_memory.
Connect it to OpenPlatform
Flow EE works inside OpenPlatform: users, groups and permissions come from there.
Register the app
Add Flow EE to OpenPlatform as an application; the app serves its own openplatform.json (http://your-flow:8000/openplatform.json). Write down the request token and the response token you give it.
Groups and permissions
Create a group for each class and give the app to the groups of students and teachers. Users with sa are the teachers. Give students the create permission (and remove if they may delete).
Paste the tokens
Give the two tokens to Flow EE as FLOWEE_OP_REQTOKEN and FLOWEE_OP_RESTOKEN or, the first time, sign in with the default account shown on its login page and paste them in the settings. From then on users enter through OpenPlatform.
Optional: enable the public users API in OpenPlatform and put its address in op_groups; it is needed for one copy for each student. With OpenPlatform in the cloud put its address in sso in config: sign-in is verified there and groups and teacher come from its session. Nobody can impersonate groups.
| Setting | What it does |
|---|---|
op_groups | Address of the OpenPlatform users API (https://my_openplatform/users/?token=[]). Needed for one copy per student; without it a template is copied once per group. |
sso | Address of an OpenPlatform in the cloud for the sign-in. |
flowstream_worker | fork (default here): each FlowStream in its own process. |
flowstream_memory | Maximum memory in MB of each FlowStream (0 is automatic). Recommended in class. |
activity_days | Days that the activity log is kept (365 by default, 0 forever). |
max_streams, idle_days | Default of the limits for each student (FlowStreams and days without work). The teacher can change them in Classroom. |
$proxytimeout | Timeout of the FlowStreams proxy, in seconds. |
No files to edit. Every setting also works as an environment variable: FLOWEE_ plus the key in upper case (FLOWEE_SSO, FLOWEE_OP_GROUPS, FLOWEE_FLOWSTREAM_MEMORY…), and the same goes for the two tokens of the application (FLOWEE_OP_REQTOKEN, FLOWEE_OP_RESTOKEN). The docker-compose.yaml already lists them all.
Everything included
A complete classroom environment, ready to run on your own server.
Roles and groups
Teacher and students, organised in the groups of OpenPlatform. Each student works only in their own space.
Practice templates
Hand out an exercise to a whole group or give every student their own copy, and restore it whenever you need.
Class overview
See who has started, who has errors and who needs help, and open any student’s FlowStream to guide them.
Activity log
See what each student does and when, filter it and download it. It is kept only for the time you choose, and you can clear it.
Observe in real time
Follow the editor of any student live, in read-only mode, to see how they work and help when they get stuck.
Exam mode
Open and close the access of a group by dates. During the exam nothing leaves: no exporting or copying. When it ends, every student’s work is delivered by itself.
Deliveries
Students hand in their work with one click. You get a frozen copy with its date, open it as a FlowStream and download a whole group to grade it.
Component palette
Choose the components that each group can use and forbid the ones that reach files or the shell. Students cannot edit or add components, so nobody breaks or copies them.
Limits for each student
Set how many FlowStreams each student can have, and pause automatically what they stop using.
Protected work
Students cannot import FlowStreams or read the code of the components. Every FlowStream runs in its own process.
Easy to deploy
A ready Docker image for amd64 and arm64, configured with environment variables: no files to edit.
Your server, your data
Everything stays on your own infrastructure. English and Spanish interface, and sign-in with OpenPlatform on your server or in the cloud.