FrameTee is a Tool-Assisted Speedrun (TAS) editor for DDNet, built with C99, Vulkan, and ImGui.
Note: This project is a Work In Progress (WIP). Expect bugs, crashes, and missing features. Physics and project file formats are subject to change. Currently, there is no macOS support.
- Custom Physics: Using ddnet_physics to prevent cheating.
- Vulkan Renderer: High-performance rendering pipeline.
- DDNet Support: Full compatibility with DDNet maps and skins.
- Timeline Interface: Multi-track timeline for managing inputs.
- Recording: Real-time and frame-by-frame recording capabilities.
- Input Snippets: Organize inputs into movable, resizable, and editable snippets.
- Prediction: Visual trajectory prediction.
- Snippet Editor: Detailed matrix editor for precise tick-by-tick modification.
- Undo/Redo: Comprehensive system for timeline operations.
- Bulk Editing: Apply changes (direction, jumping, weapons) to multiple ticks simultaneously.
- Dummy Handling: Dedicated controls for dummy tees with input mirroring and copying.
- Deepfly Support: Dummy fire mechanics similar to the standard deepfly bind.
- Demo Export: Export directly to DDNet-compatible demo files.
- Plugin System: C/C++ plugin support (DLL/SO) for custom functionality.
- Project System:
.taspproject files for saving/loading work. - Keybinds: Fully configurable keyboard and mouse bindings.
- Skin Browser: Visual browser for managing player skins.
- Compiler:
clang(recommended) - SDK: Vulkan SDK
- Libraries:
zlib
-
Clone the repository:
# Make sure to clone recursively for submodules git clone --recursive https://github.com/Teero888/frametee.git cd frametee
-
Configure and Compile:
mkdir build && cd build # For Release cmake .. -DCMAKE_BUILD_TYPE=Release # OR for Debug (with sanitizers) # cmake .. -DCMAKE_BUILD_TYPE=Debug -DENABLE_SANITIZERS=On make -j$(nproc)
Configuration File:
- Linux/Unix:
~/.config/frametee/config.toml - Windows:
%appdata%/frametee/config.toml
| Category | Action | Default Key |
|---|---|---|
| Playback | Play/Pause | X |
| Rewind (Hold) | C |
|
| Previous Frame | Left Arrow, Mouse Button 4 |
|
| Next Frame | Right Arrow, Mouse Button 5 |
|
| Adjust TPS | Up / Down Arrows |
|
| Timeline | Select All Snippets | Ctrl + A |
| Delete Snippet | Delete |
|
| Split Snippet | Ctrl + R |
|
| Merge Snippets | Ctrl + M |
|
| Toggle Active | A |
|
| Recording | Move | A / D |
| Jump | Space |
|
| Fire | Mouse Left |
|
| Hook | Mouse Right |
|
| Kill | K |
|
| Weapons | 1-5 (Hammer, Gun, Shotgun, Grenade, Laser) |
|
| Trim Recording | F |
|
| Cancel Recording | F4 |
|
| Tools | Dummy Fire | V |
| Toggle Dummy Copy | R |
|
| Zoom | W / S |
|
| Switch Track | Alt + 1-9 |
FrameTee supports extensions via shared libraries (.dll / .so) loaded from the plugins/ directory. Plugins can interact with the editor, add UI elements via ImGui, and manipulate timeline data.
Plugins must export four C functions:
plugin_info_t get_plugin_info(void): Returns metadata (name, author, version).void *plugin_init(tas_context_t *context, const tas_api_t *api): Initialize state.void plugin_update(void *plugin_data): Called every frame (UI/Logic).void plugin_shutdown(void *plugin_data): Cleanup resources.
Plugins interact with the host via src/plugins/plugin_api.h:
tas_context_t: Read-only access to application state (Timeline, ImGui Context, Graphics).- Note: Plugins must set the ImGui context using
imgui_context.
- Note: Plugins must set the ImGui context using
tas_api_t: Function pointers for actions:do_create_track(),do_create_snippet(),do_set_inputs()log_info(),draw_line_world()register_undo_command()
Plugins can be built independently without recompiling the main application.
- Create Directory:
plugins/my_plugin/ - Source File: Implement the lifecycle functions.
- CMakeLists.txt: Configure as a shared library.
Build Command:
cd plugins/my_plugin
cmake -S . -B build -DHOST_APP_DIR=../../
cmake --build buildThe output binary will be copied to build/plugins automatically if configured like the examples. See plugins/example_c/ and plugins/example_cpp/ for reference.
FrameTee is open-source. Contributions are accepted through issue reports and pull requests.
Contact:
- Discord:
teero777


