Fr|En

DTL Software — July 2026

DTLmenu

HTA graphical launcher for PyInstaller builds

Didier DTL Morandididier.morandi@gmail.comMIT License
DTL

HTA graphical launcher for PyInstaller builds

A graphical build launcher for the NetDTL Suite — Windows HTA application v 1.0.0 11-jun-2026 Didier DTL Morandi https://didiermorandi.com/netdtl/

DTLmenu is a Windows HTML Application (.hta) that replaces a plain VBScript menu with a dark-themed, terminal-style GUI. It lets you trigger PyInstaller builds for each Python tool in the NetDTL Suite with a single click, open output folders directly in Explorer, and verify your Python environment — all without touching the command line manually.

---

Overview

The NetDTL Suite consists of six tools:

ToolStackBuild method
DTLknowsWhyPython (+ CLI + Agent)PyInstaller .spec files
DTLsaysWhatPythonPyInstaller --onefile
GitDTLPython / TkinterPyInstaller .spec file
GitHubMenuPython / TkinterPyInstaller .spec file
DTLauditPythonPyInstaller --onefile
NetDTLPHP / MySQLNo build required

DTLmenu covers all of them from a single window.

---

Requirements

  • Windows (any version with mshta.exe — included in all Windows releases since XP)
  • Python installed and accessible via python in PATH
  • PyInstaller installed (pip install pyinstaller)
  • The NetDTL Suite source tree present on disk

No additional dependencies. DTLmenu is a single self-contained .hta file.

---

Installation

Copy DTLmenu.hta anywhere on the machine — alongside the suite root folder works well. No installer, no registry entry, no virtual environment required.

---

Usage

Double-click DTLmenu.hta. Windows will open it with mshta.exe.

> On some systems, Windows may display a security warning on first launch depending on the file's origin zone. If so, right-click the file, open Properties, and click Unblock at the bottom of the General tab.

Setting the root directory

At the top of the window, set ROOT_DIR to the folder that contains the six tool subdirectories (DTLKnowsWhy, DTLsaysWhat, NetDTL, GitDTL, GitHubMenu, DTLaudit). Click apply to propagate the path to all screens.

The default value matches the original development path:

C:\Users\Utilisateur\Documents\Mes sites Web\\outils

Change it once to match your local layout.

Menu options

KeyAction
1Build DTLknowsWhy (main executable, CLI variant, and background Agent)
2Build DTLsaysWhat (single-file console executable)
3NetDTL — display path information (no build needed)
4Build GitDTL
5Build GitHubMenu
6Build DTLaudit
7Build all Python tools in sequence
8Open a dist\ output folder in Windows Explorer
9Verify Python and PyInstaller versions
0Quit

How builds are executed

When you click execute on any build screen, DTLmenu:

  1. Increments the tool patch number with DTLversion.py.
  2. Assembles the corresponding cmd commands, including dependency checks and PyInstaller invocations.
  3. Writes a temporary .cmd script to %TEMP%\DTLmenu_run.cmd.
  4. Launches it in a visible Command Prompt window (cmd.exe) so you can follow the output in real time.
  5. On completion, the window pauses and waits for a keypress before closing.

If any python command exits with a non-zero code, the script stops and prints an error message.

DEC-style versioning

Python tools use a DEC-inspired canonical version format: major.minor.patch. The displayed title uses vmajor.minor-patch, for example v1.0-3.

Before each PyInstaller build, DTLmenu runs DTLversion.py for the selected project. The script refreshes Git tags, uses the latest local or remote tag as the release baseline when available, then increments the patch number by one. The current version state is stored in .dtl_version inside the project folder and the visible application version constant is updated before compilation.

If PyInstaller fails, DTLmenu automatically calls the rollback command generated by DTLversion.py, restoring the previous version files so failed builds do not consume a patch number.

---

File structure

outils\
├── DTLmenu.hta
├── DTLKnowsWhy\
│   ├── DTLknowsWhy.spec
│   ├── DTLknowsWhy-CLI.spec
│   ├── agent\
│   │   └── DTLknowsWhy-Agent.spec
│   └── dist\
├── DTLsaysWhat\
│   ├── DTLsaysWhat.py
│   └── dist\
├── GitDTL\
│   ├── GitDTL.spec
│   └── dist\
├── GitHubMenu\
│   ├── GitHubMenu.spec
│   ├── GitHubMenu.py
│   └── dist\
├── DTLaudit\
│   ├── DTLaudit.py
│   └── dist\
└── NetDTL\

---

Design notes

DTLmenu is built as an .hta rather than a plain .html file because HTML Applications run with elevated trust under mshta.exe, which grants access to WScript.Shell and Scripting.FileSystemObject — the two COM objects needed to write and execute .cmd scripts and to open Explorer windows.

The UI uses only IE-compatible CSS (no flexbox, no grid) to match the rendering engine embedded in mshta.exe. The dark terminal aesthetic — IBM-influenced monospace font, phosphor green accents, blue highlights — follows the visual identity of the wider NetDTL Suite, itself a tribute to DEC VT100 terminals and the culture of Digital Equipment Corporation (1957–1998).

---

License

MIT — see the main NetDTL repository for the full license text.

Part of the NetDTL Suitedidiermorandi.com/netdtl

Update - 14 June 2026

DTLmenu.hta has become a complete HTA launcher for the NetDTL Suite.

New and confirmed behavior:

  • The suite root directory is saved in DTLmenu.root.
  • The folder picker can correct the root path without editing the HTA file.
  • The menu checks for Python and PyInstaller before running a build.
  • If PyInstaller is missing, the tool offers to install it with python -m pip install --upgrade pyinstaller.
  • Covered builds are DTLknowsWhy, DTLsaysWhat, GitDTL, GitHubMenu, and DTLaudit.
  • DTLknowsWhy builds produce the GUI, CLI, and Agent variants.
  • DTLversion.py is called before builds to manage versioning, with rollback support in the generated temporary script.
  • DTLGitMorning.ps1 also provides a morning Git summary for the suite repositories.
  • DTLmenu.hta
    2026-06-27 06:52
  • DTLmenu.vbs
    2026-06-27 06:52
  • .dtl_version
    2026-06-16 09:59
  • README.md
    2026-06-16 08:50
  • README_Fr.md
    2026-06-14 09:08