Loading a File
In the footer, there is a button with a plus sign. Click it to open the file picker.

The application can currently handle the following formats: CSV / TSV / TXT, Excel .xlsx, Parquet. There are times when a file is a common text file that is readable, but the file suffix might not indicate this, so we simply look at All Files in the file picker and the user needs to user their judgment. Unknown suffixes are tried as delimited text; unreadable files show an error.
30-30 was designed with large files in mind. It will easily load files over 1GB and plot millions of data points at a time. There are limits to what it can do, but the majority of users out there will find this is all they need. Find the biggest file you can that Excel last choked on, and load it here. If you can't view it, send us a message :).
CSV/Excel
When loading a common CSV or Excel file, a layout wizard will be presented which allows you to inspect the data and choose a Header/Unit/Data row. Next it allows the option to select which columns of data you want to import. There is also the opportunity to adjust the column naming if you need. Renaming might be useful if you are planning to compare two files, which will work best if the columns are exactly the same name.
If you have already loaded a file but skipped some columns originally, there is an option to load more channels from the same file. This is only available when viewing a single file.
Parquet files
No wizard is presented to preview the data, but you will have the option to select which channels (columns) you want to import.
Manual Entry
There is the ability to do a quick paste of data or you can manually type (if you really want to!) You shouldn't usually choose this option, but sometimes you just want to work quickly and copy/paste from another source document. We limit the size (30R x 10C) to avoid hasty use of this feature. You should prefer to have files containing your data to make it more reusable and shareable.
Manual Generation of Tables
When you want to start from scratch and use purely calculations to model a system, there is a way to generate a table of index values to start the process. For example, suppose you want to model the dynamics of an engine having 360 degree increments. You can generate a table of 360 elements, then create calculated channels for each of the parameters you want to analyze (piston speed, bearing loads, etc.). This essentially emulates what you can do in a spreadsheet, but is somewhat easier and creates beautiful plots.
Append File
This is used purely for comparing files. Appending does exactly what it says, it takes a subsequent file and adds it to the end of the previous file. If you have any calculations, they will automatically update to include the new rows of data. After you have done this, your next step will be to Group/Factor the data to compare sections of the data to one another. There is a section on how this works.
Hot Keys
Before getting to involved in the details, there are just a couple of hot keys to know about:
| Key | Description |
|---|---|
| C | toggle cursor, ctrl + click to drag the cursor |
| M | if in Edit mode, sets marker |
| R | resets zoom - double clicking also resets zoom |
Chart Types
Settings → Chart Types
- Line/Scatter - This is the default and should be what most people use. You can create excellent line or scatter charts, which is how a significant amount of engineering data is analyzed. This chart engine allows the functionality of "Grouping" which is used for comparing sections of a dataset which may not have aligned x-axis values.
- Time-Series - This is for large time-series datasets. If you have this type of data, where a monotonically increasing x-value is present, you will get very responsive performance with this chart engine.
View Types
There are 3 primary views which support your data analysis: Chart, Table & Map View. All three are connected using the a "Global Row Window", meaning if you zoom on one, it will affect the view on the other. This makes it very easy to drill into your data.
When you load a data set containing latitude and longitude channels, it will autodetect those channels and post-process your GNSS data to present your path on the map. Errant points are removed using an algorithm and indicated in red in the global row window in the footer. If lat/lng are not autodetected properly, you can select which channels are appropriate for this data. If your data doesn't use GNSS data, you can disable the Map View in Settings.
In Table View, it will show all the columns you loaded from your data set, plus any calculated channels you create. Any channels plotted on the current chart(s) will be highlighted for easy reference.
Editing data
Editing is a powerful way to clean up data. Engineering data always has some errant points, or data that you simply want to ignore from the analysis. Edit next to the row-window slider "soft deletes" (hides ranges) of rows without rewriting the file on disk. Undo restores them. Here is how you would use it:
- Turn Edit on. If the chart cursor is off, it turns on (same C cursor). Move it with Ctrl+drag (or Ctrl+click near the line).
- Press M at the playhead, move, press M again. A red band previews the inclusive range; click the delete icon to hide those rows from the chart, table, map, statistics, and downloads. Grey bands on the window slider mark hidden rows (the footer legend says Removed Rows).
- Esc clears an in-progress mark or an uncommitted range. Further M pairs add more cuts.
- Box-zoom, the footer slider, R, and double-click zoom-back still work in Edit mode.
- Edit is unavailable while grouping is on. Disable grouping to mark ranges.
Using Views
When you spend time creating a beautiful chart or dashboard of charts, you likely would want to save it so you can use it again without spending all that time again! That is what "views" are for. On the right hand sidebar you will find three buttons for this purpose: Open, Save and Bookmark.

How they function:
- Stores X/Y/Y2 channels, grouping column and levels, multi-pane layout, and calculation formulas. Not tied to specific files.
- Load from the sidebar icon, or during import (channel select).
- Bookmark keeps a handle in this browser so you can reopen a view across datasets. Survives closing the browser (Chrome / Edge). Clearing site data, or moving the file on disk, drops the bookmark.
- Before a new file or leaving the page, you are asked to save the current view so channels, grouping, and calculations are not lost.
- Names missing from the current dataset are skipped. Calculations whose source columns exist are recreated.
Snapshots
Snapshots are accessed in the footer with the "camera" icon. They are a feature which allows you to move around inside your dataset. You might find this useful when you have zoomed in on a specific area of a chart and you don't want to lose it, but you need to look at another area and come back to this. Snapshot it. This saves the current settings for zoom window, channels, chart settings, grouping, and panes, then stores a thumbnail in the right side of the footer.
- Click a thumbnail in the footer strip to recall.
- Recall first saves the working view. Close the banner to restore it.
- Snapshots are not saved when saving a View
Calculations
Most workflows require calculations of some sort. Think about when you use Excel; you have some original data, but then you add several columns of calculations to the spreadsheet to make it do what you want. You can also do that with 30-30.
Chart sidebar → Calculations
Formulas are created using basic math operators that you are used to, but you also have the option to apply SQL expressions, which make this a very powerful calculation engine. SQL is one of the most well tested and broadly used database in the world and the calculations it can do allow a wide range of capabilities.
If you don't know how to write SQL expressions, no worries! There is the option to use AI to help you, and it is really good at writing these expressions.
- Each formula is a new channel
- Source columns are not overwritten.
- Saved in the view file; loading a view on another file recreates channels whose source columns exist.
- Names need to start with letter/underscore, units are optional (but recommended).
- Validate shows sample values. Charts plot numbers only.
- Buttons: Math, Text, Time, Logic, Window. Quote names with spaces:
"Air Temp". Use AIopens an input to describe the channel you want. There are two ways to do it, depending on if you have an account or not. Signed-in users can Generate directly with AI models (limited usage). Paid users have much higher limits. If you just want to use it for free, you can use it until the limit is reached, then switch to copy/paste of the prompt if you like. The ergonomics of using AI for this job are well worth having a subscription!
For the manual users, copy the prompt and paste into your own LLM (ChatGPT, Gemini, Grok, and others). When a response returns, you copy the response into the correct field, then Apply, and the result is used to set up the channel.
For AI model users, it is all completed in the prompt window. You can preview the channel name and equation before the Apply and the Validate the response before saving the new channel.
What is expected from the AI model is a data structure like:
name: [Name]
unit: [Unit (optional)]
expression: [SQL expression]
Variables
Variables are named constants you reuse in formulas. Switch the editor to Variable, give it a name and an expression (a number or a formula of other variables), then Validate and Save.
- Click a variable to insert
$redlineinto a channel equation:RPM / $redline - Variables are not plotted as channels. If you need to plot it, you need a new channel instead.
- These are saved with the View; loading a View recreates them
- Variable expressions cannot use source columns — only literals, functions, and other
$variables
Math
Temp * 1.8 + 32
CASE WHEN Temp > 100 THEN Temp ELSE 0 END
Elapsed time
Exports that switch from 59.990 to 1:00.010 are not numeric. Add a seconds channel and plot that as X:
elapsed_seconds(Time)
59.990 = seconds. 1:00.010 = m:ss. 1:00:00.010 = h:mm:ss. Do not cast these to TIME/TIMESTAMP (1:00.010 becomes 1 hour).
CASE
WHEN Time LIKE '%:%:%' THEN
try_cast(split_part(Time, ':', 1) AS DOUBLE) * 3600
+ try_cast(split_part(Time, ':', 2) AS DOUBLE) * 60
+ try_cast(split_part(Time, ':', 3) AS DOUBLE)
WHEN Time LIKE '%:%' THEN
try_cast(split_part(Time, ':', 1) AS DOUBLE) * 60
+ try_cast(split_part(Time, ':', 2) AS DOUBLE)
ELSE try_cast(Time AS DOUBLE)
END
Casts and text
try_cast(Time AS DOUBLE)
Time::DOUBLE
col + INTERVAL 1 HOUR
split_part(Name, '_', 1)
Window functions
One value per row. Requires OVER (...). The OVER button inserts OVER (ORDER BY _oid).
val - lag(val) OVER (ORDER BY _oid)
sum(val) OVER (ORDER BY _oid)
sum(val) without OVER is blocked (would collapse rows).
Limits
- No new tables. No
SELECT/FROM/WHERE/JOIN. - No comments or multiple statements.
- Cannot replace a source column — add a new name and plot it.
Grouping
Chart sidebar → Group/Factor
You can think of grouping as a way to select specific rows of data and compare them against each other. One example would be when you have a test, where each "Run" is occupying a set of rows in your spreadsheet. To compare "Run_1" against "Run_2" you can use this feature. To select the group, you need to have a "categorical" or non-numeric column to select. In this example if one of your columns says "Run_#" on each row, this is an appropriate grouping column.
We also refer to this categorical column as a "factor", using common nomenclature with the R programming language. A factor is used to select your data. The button "Group/Factor" is really to mean, "Group my data using a Factored column".
After the Grouping channel/column is selected, you will be prompted to select the "Levels" to add to the chart. Levels are simply a list of the unique options from the categorical column (Run_1, Run_2, Run_N..., etc.)
Here are the rules:
- Needs Line/Scatter and a line plot. Enabling Grouping switches to these required settings.
- Factor column must be categorical (not a numeric measurement). If you don't have one, use a calculation to create one.
- Levels come from the full file, not the zoom window.
- Global slider hides while a grouped slice is active.
- After appending a file for comparison, the chart legend lists each factor level once (same color across files). A second legend below maps each file name to its line type.
- Compared files share color by factor level and use line type (solid, dashed, dotted, dash-dot) to tell files apart. Pick line types next to each file in the Group/Factor modal.
- Optional Average of curves plots the mean of the selected factor levels as an extra series (interpolated onto a shared X-axis grid). Only X values covered by a curve contribute to the average.
- Chart CSV download includes the factor column and only the factor levels shown on the chart. When Average of curves is on, those points are appended with factor level
Average.