diff --git a/frontend/index.html b/frontend/index.html
index 38a4f15..9ff7174 100644
--- a/frontend/index.html
+++ b/frontend/index.html
@@ -2583,7 +2583,7 @@ async function checkConnection() {
git clone https://github.com/anttro/simtrace2-pysniff.git
cd simtrace2-pysniff && pip install -e .
${t('Start the server in direct mode (recommended):')}
- ./server-start.sh --capture direct
+ ./start.sh --capture direct
${t('Requires SIMtrace2 hardware connected via USB; captures directly from the device.')}
${t('Then set the URL above to http://127.0.0.1:8081 and return to the Trace tab.')}
@@ -2591,7 +2591,7 @@ async function checkConnection() {
${t('Use an external sniffer alongside the server. This mode is compatible with the original Osmocom simtrace2-sniff.')}
- ${t('Start the server:')}
- ./server-start.sh --capture gsmtap
+ ./start.sh --capture gsmtap
- ${t('Start a GSMTAP source in another terminal — either:')}
./sniff-start.sh --gsmtap 127.0.0.1 (simtrace2-pysniff)
or
@@ -2625,7 +2625,7 @@ function onFilterChange() {
}
// ──────────────────── Versioning ────────────────────
-const PWA_VERSION = '1.22.16';
+const PWA_VERSION = '1.22.17';
const MIN_SERVER_VERSION = '1.0.0';
function parseVersion(v) {
diff --git a/frontend/sw.js b/frontend/sw.js
index 166908c..4158c6a 100644
--- a/frontend/sw.js
+++ b/frontend/sw.js
@@ -1,4 +1,4 @@
-const CACHE = 'simtrace-analyser-v48';
+const CACHE = 'simtrace-analyser-v49';
const PRECACHE = [
'index.html',
diff --git a/pyproject.toml b/pyproject.toml
index 56eecd9..e6a4059 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -4,7 +4,7 @@ build-backend = "setuptools.backends._legacy:_Backend"
[project]
name = "simtrace2-pysniff"
-version = "1.22.16"
+version = "1.22.17"
description = "Python-based sniffing tool for SIMtrace2 hardware (SIM card communication sniffer)"
readme = {file = "README.md", content-type = "text/markdown"}
license = {text = "GPL-2.0-or-later"}
diff --git a/simtrace2_pysniff/__init__.py b/simtrace2_pysniff/__init__.py
index 181a7be..567bd28 100644
--- a/simtrace2_pysniff/__init__.py
+++ b/simtrace2_pysniff/__init__.py
@@ -6,7 +6,7 @@ from .gsmtap import GsmtapSender, GsmtapReceiver
from .pcap import PcapWriter
from .dump import FileDumper, format_message
-__version__ = '1.22.16'
+__version__ = '1.22.17'
__all__ = [
'SniffSession',
'DeviceDisconnected',
diff --git a/sniff-start.bat b/sniff-start.bat
new file mode 100644
index 0000000..d27c379
--- /dev/null
+++ b/sniff-start.bat
@@ -0,0 +1,77 @@
+@echo off
+setlocal enabledelayedexpansion
+
+:: simtrace2-pysniff startup script for Windows
+::
+:: Usage: sniff-start.bat [--format FORMAT] [--gsmtap HOST[:PORT]] [--pcap FILE] [--output FILE] [--inactivity-timeout SECONDS]
+::
+:: Options set via environment variables act as defaults; CLI flags override them.
+
+set "GSMTAP=%GSMTAP%"
+set "PCAP=%PCAP%"
+set "OUTPUT=%OUTPUT%"
+set "FORMAT=%FORMAT%"
+set "INACTIVITY_TIMEOUT=%INACTIVITY_TIMEOUT%"
+if "%INACTIVITY_TIMEOUT%"=="" set "INACTIVITY_TIMEOUT=0"
+set "EXTRA_ARGS="
+
+:parse_args
+if "%~1"=="" goto :run
+if "%~1"=="--gsmtap" (
+ set "GSMTAP=%~2"
+ shift
+ shift
+ goto :parse_args
+)
+if "%~1"=="--pcap" (
+ set "PCAP=%~2"
+ shift
+ shift
+ goto :parse_args
+)
+if "%~1"=="--output" (
+ set "OUTPUT=%~2"
+ shift
+ shift
+ goto :parse_args
+)
+if "%~1"=="-o" (
+ set "OUTPUT=%~2"
+ shift
+ shift
+ goto :parse_args
+)
+if "%~1"=="--format" (
+ set "FORMAT=%~2"
+ shift
+ shift
+ goto :parse_args
+)
+if "%~1"=="-f" (
+ set "FORMAT=%~2"
+ shift
+ shift
+ goto :parse_args
+)
+if "%~1"=="--inactivity-timeout" (
+ set "INACTIVITY_TIMEOUT=%~2"
+ shift
+ shift
+ goto :parse_args
+)
+set "EXTRA_ARGS=!EXTRA_ARGS! %~1"
+shift
+goto :parse_args
+
+:run
+echo Starting simtrace2-pysniff...
+
+set "ARGS="
+if not "%GSMTAP%"=="" set "ARGS=!ARGS! --gsmtap %GSMTAP%"
+if not "%PCAP%"=="" set "ARGS=!ARGS! --pcap %PCAP%"
+if not "%OUTPUT%"=="" set "ARGS=!ARGS! --output %OUTPUT%"
+if not "%FORMAT%"=="" set "ARGS=!ARGS! --format %FORMAT%"
+if not "%INACTIVITY_TIMEOUT%"=="0" set "ARGS=!ARGS! --inactivity-timeout %INACTIVITY_TIMEOUT%"
+
+set "PYTHONPATH=%~dp0"
+python -m simtrace2_pysniff %ARGS% %EXTRA_ARGS%
diff --git a/server-start.bat b/start.bat
similarity index 91%
rename from server-start.bat
rename to start.bat
index 8bb6970..ab0ab30 100644
--- a/server-start.bat
+++ b/start.bat
@@ -3,7 +3,7 @@ setlocal enabledelayedexpansion
:: simtrace2-pysniff-server startup script for Windows
::
-:: Usage: server-start.bat [--capture gsmtap|direct] [--port PORT] [--db PATH] [--gsmtap-port PORT]
+:: Usage: start.bat [--capture gsmtap|direct] [--port PORT] [--db PATH] [--gsmtap-port PORT]
::
:: Options set via environment variables act as defaults; CLI flags override them.
diff --git a/server-start.sh b/start.sh
similarity index 96%
rename from server-start.sh
rename to start.sh
index 7460b82..2160fdf 100755
--- a/server-start.sh
+++ b/start.sh
@@ -1,7 +1,7 @@
#!/bin/bash
# simtrace2-pysniff-server startup script
#
-# Usage: ./server-start.sh [--capture gsmtap|direct] [--port PORT] [--db PATH] [--gsmtap-port PORT]
+# Usage: ./start.sh [--capture gsmtap|direct] [--port PORT] [--db PATH] [--gsmtap-port PORT]
#
# Options set via environment variables act as defaults; CLI flags override them.
diff --git a/tests/test_pcap_import.py b/tests/test_pcap_import.py
index d0d0ba3..b430985 100644
--- a/tests/test_pcap_import.py
+++ b/tests/test_pcap_import.py
@@ -224,7 +224,7 @@ class TestImportEndpoint(unittest.TestCase):
class TestVersion(unittest.TestCase):
def test_package_version(self):
from simtrace2_pysniff import __version__
- self.assertEqual(__version__, '1.22.16')
+ self.assertEqual(__version__, '1.22.17')
def test_status_includes_version(self):
import os