{"record":{"id":"74814a17239ec776","repo":"languagetool-org/languagetool","slug":"the-afterthedeadline-mode-is-not-supported-anymore","errorCode":null,"errorMessage":"The AfterTheDeadline mode is not supported anymore in LanguageTool 3.8 or later","messagePattern":"The AfterTheDeadline mode is not supported anymore in LanguageTool 3\\.8 or later","errorType":"console","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"languagetool-server/src/main/java/org/languagetool/server/HTTPServerConfig.java","lineNumber":378,"sourceCode":"          setFasttextPaths(fasttextModel, fasttextBinary);\n        }\n        maxCheckThreads = Integer.parseInt(getOptionalProperty(props, \"maxCheckThreads\", \"10\"));\n        if (maxCheckThreads < 1) {\n          throw new IllegalArgumentException(\"Invalid value for maxCheckThreads, must be >= 1: \" + maxCheckThreads);\n        }\n        // default value 0 = use maxCheckThreads setting (for compatibility)\n        maxTextCheckerThreads = Integer.parseInt(getOptionalProperty(props, \"maxTextCheckerThreads\", \"0\"));\n        if (maxTextCheckerThreads < 0) {\n          throw new IllegalArgumentException(\"Invalid value for maxTextCheckerThreads, must be >= 1: \" + maxTextCheckerThreads);\n        }\n        textCheckerQueueSize = Integer.parseInt(getOptionalProperty(props, \"textCheckerQueueSize\", \"8\"));\n        if (textCheckerQueueSize < 0) {\n          throw new IllegalArgumentException(\"Invalid value for textCheckerQueueSize, must be >= 1: \" + textCheckerQueueSize);\n        }\n\n        boolean atdMode = getOptionalProperty(props, \"mode\", \"LanguageTool\").equalsIgnoreCase(\"AfterTheDeadline\");\n        if (atdMode) {\n          throw new IllegalArgumentException(\"The AfterTheDeadline mode is not supported anymore in LanguageTool 3.8 or later\");\n        }\n        String rulesConfigFilePath = getOptionalProperty(props, \"rulesFile\", null);\n        if (rulesConfigFilePath != null) {\n          rulesConfigFile = new File(rulesConfigFilePath);\n          if (!rulesConfigFile.exists() || !rulesConfigFile.isFile()) {\n            throw new RuntimeException(\"Rules Configuration file cannot be found: \" + rulesConfigFile);\n          }\n        }\n        String remoteRulesConfigFilePath = getOptionalProperty(props, \"remoteRulesFile\", null);\n        if (remoteRulesConfigFilePath != null) {\n          remoteRulesConfigFile = new File(remoteRulesConfigFilePath);\n          if (!remoteRulesConfigFile.exists() || !remoteRulesConfigFile.isFile()) {\n            throw new RuntimeException(\"Remote rules configuration file cannot be found: \" + remoteRulesConfigFile);\n          }\n        }\n        cacheSize = Integer.parseInt(getOptionalProperty(props, \"cacheSize\", \"0\"));\n        if (cacheSize < 0) {\n          throw new IllegalArgumentException(\"Invalid value for cacheSize: \" + cacheSize + \", use 0 to deactivate cache\");","sourceCodeStart":360,"sourceCodeEnd":396,"githubUrl":"https://github.com/languagetool-org/languagetool/blob/2e990059ce67d5e2a0f7f7ca5d31160c6709df4b/languagetool-server/src/main/java/org/languagetool/server/HTTPServerConfig.java#L360-L396","documentation":"LanguageTool's HTTP server once supported running in 'AfterTheDeadline' compatibility mode (set via the 'mode' property). This mode was removed in LanguageTool 3.8, and the server configuration now explicitly rejects it with this IllegalArgumentException to fail fast instead of silently misbehaving.","triggerScenarios":"Starting the LanguageTool HTTP server with a properties/config file (or server.properties) that contains 'mode=AfterTheDeadline'. HTTPServerConfig constructor reads the 'mode' property, compares it case-insensitively to 'AfterTheDeadline', and throws.","commonSituations":"Old server.properties files carried over from LanguageTool 3.7 or earlier deployments; Docker images or startup scripts with legacy config; tutorials or blog posts referencing the old ATD mode.","solutions":["Remove the 'mode=AfterTheDeadline' line from the server properties file (default mode 'LanguageTool' needs no explicit setting)","Upgrade any client integration that relied on the AfterTheDeadline XML API to LanguageTool's native HTTP JSON API","Pin to LanguageTool <= 3.7 only if ATD compatibility is absolutely mandatory (not recommended, no security fixes)"],"exampleFix":"// before (server.properties)\nmode=AfterTheDeadline\n\n// after (server.properties)\n# line removed - only 'LanguageTool' mode is supported","handlingStrategy":"validation","validationCode":"Properties props = loadProps();\nif (\"AfterTheDeadline\".equalsIgnoreCase(props.getProperty(\"mode\", \"LanguageTool\"))) {\n    throw new IllegalStateException(\"mode=AfterTheDeadline is unsupported since LT 3.8; remove the 'mode' property\");\n}","typeGuard":null,"tryCatchPattern":"try {\n    serverConfig = new HTTPServerConfig(props);\n} catch (IllegalArgumentException e) {\n    if (e.getMessage().contains(\"AfterTheDeadline\")) {\n        props.remove(\"mode\");\n        serverConfig = new HTTPServerConfig(props);\n    } else { throw e; }\n}","preventionTips":["Keep server.properties minimal - only set properties you actually need","Grep deployment configs for 'mode=AfterTheDeadline' when upgrading from LT <= 3.7","Test server startup in CI after every LanguageTool version upgrade"],"tags":["java","languagetool","deprecated","server-config"],"backgroundTag":"deprecated-api-usage","analyzedSha":"2e990059ce67d5e2a0f7f7ca5d31160c6709df4b","analyzedAt":"2026-09-06T09:20:17.015Z","contentChangedAt":"2026-09-06T09:20:17.015Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}