From a1571fb6956e713be8f321a084bc7bd8ea116b35 Mon Sep 17 00:00:00 2001 From: Jonathan Pool Date: Fri, 2 Oct 2026 11:37:50 -0700 Subject: [PATCH 1/3] revise AI tutorial and add privacy policy --- capability.md | 4 +++ index.html | 1 + index.ts | 3 ++ llms.txt | 1 + sitemap.xml | 1 + web/privacy/index.html | 37 +++++++++++++++++++++ web/privacy/index.ts | 20 ++++++++++++ web/privacy/privacy.test.ts | 18 ++++++++++ web/tutorialAI/index.html | 65 +++++++++++++++---------------------- 9 files changed, 111 insertions(+), 39 deletions(-) create mode 100644 web/privacy/index.html create mode 100644 web/privacy/index.ts create mode 100644 web/privacy/privacy.test.ts diff --git a/capability.md b/capability.md index 9890b2e2..d8da3c74 100644 --- a/capability.md +++ b/capability.md @@ -52,3 +52,7 @@ MIT. ## Repository `https://github.com/jrpool/kilotest` + +## Privacy + +Kilotest requires no account. See the [privacy policy](https://kilotest.com/privacy.html). diff --git a/index.html b/index.html index c79585cd..78e69755 100644 --- a/index.html +++ b/index.html @@ -90,6 +90,7 @@

What do you want to know?

  • Which web pages have been tested?
  • Which issues have been reported?
  • What can Kilotest managers do?
  • +
  • What is the privacy policy?
  • diff --git a/index.ts b/index.ts index e442008c..5406c81e 100644 --- a/index.ts +++ b/index.ts @@ -41,6 +41,7 @@ import {handleMCP, mcpPath} from './mcp.ts'; import fs from 'node:fs/promises'; import {handleComment as handleTutorialWebComment} from './web/tutorialWeb/index.ts'; import {answer as tutorialWeb} from './web/tutorialWeb/index.ts'; +import {answer as privacy} from './web/privacy/index.ts'; import {answer as tutorialAI, handleComment as handleTutorialAIComment} from './web/tutorialAI/index.ts'; import http, {type IncomingMessage, type ServerResponse} from 'node:http'; import https from 'node:https'; @@ -119,6 +120,7 @@ const answer: { manage: PageHandler; metrics: PageHandler; pruneReportsForm: PageHandler; + privacy: PageHandler; tutorialWeb: PageHandler; tutorialAI: PageHandler; reannotate: PageHandler; @@ -149,6 +151,7 @@ const answer: { manage, metrics, pruneReportsForm, + privacy, tutorialWeb, tutorialAI, reannotate, diff --git a/llms.txt b/llms.txt index b203892e..d154fcd4 100644 --- a/llms.txt +++ b/llms.txt @@ -37,6 +37,7 @@ Kilotest helps language models and AI platforms to give thorough, accurate and t - [Detailed explanation of Kilotest and its capabilities for LLMs](https://kilotest.com/llms-full.txt) - [Summary of Kilotest capabilities](https://kilotest.com/capability.md) +- [Privacy policy](https://kilotest.com/privacy.html) - [OpenAPI specification for Kilotest](https://kilotest.com/openapi.yaml) - [Kilotest as connector to and collection of AI Tools](https://github.com/jrpool/kilotest/blob/main/docs/AI-TOOLS.md) - [Tutorial on authorizing language models to use Kilotest](https://kilotest.com/qai/) diff --git a/sitemap.xml b/sitemap.xml index 6836cb21..a47ba6ac 100644 --- a/sitemap.xml +++ b/sitemap.xml @@ -6,6 +6,7 @@ https://kilotest.com/requestNewTestForm.html https://kilotest.com/manage.html https://kilotest.com/tutorial.html + https://kilotest.com/privacy.html https://kilotest.com/openapi.yaml https://kilotest.com/llms.txt https://kilotest.com/llms-full.txt diff --git a/web/privacy/index.html b/web/privacy/index.html new file mode 100644 index 00000000..6120e567 --- /dev/null +++ b/web/privacy/index.html @@ -0,0 +1,37 @@ + + + + + + + + + Privacy policy | Kilotest + + + + +
    +

    Kilotest: Privacy policy

    +

    This policy applies to the Kilotest web site, API, and MCP server at kilotest.com, and does not apply to any other deployment of Kilotest. Kilotest does not require an account, does not ask for your name or email address, and does not use advertising or tracking cookies.

    +

    What Kilotest collects

    + +

    How Kilotest uses the information

    +

    Request logs are used to keep the service available and to detect abuse. Submissions are reviewed by the Kilotest maintainer and used to run tests and improve Kilotest. Kilotest does not sell information, use it for advertising, or build profiles of users.

    +

    What is public

    +

    Test reports are public. A report contains the URL that was tested and the test results, and anyone can retrieve it. If you control a web page and Kilotest gets a request from you (or anybody else) to test it, the report will be public. Kilotest does not need or request passwords or other secrets.

    +

    Who else receives information

    +

    Kilotest sends its maintainer an email notice, through the transactional email service Resend, when a submission arrives. The notice contains the submission. The site is hosted on a server of Vultr, and the site root is checked periodically by UptimeRobot, which receives no user data. Kilotest discloses information to others only if the law requires it.

    +

    How long Kilotest keeps information

    +

    Request logs are rotated and deleted automatically. The application log keeps about 14 files of up to 20 MB each, and the proxy log keeps at most 10 files of up to 50 MB each for at most 30 days. Reports and submissions are kept until the maintainer deletes them.

    +

    Your choices

    +

    To ask what Kilotest holds about you, or to ask for deletion of a submission or report about a web page that you own, email info@kilotest.com and identify the item.

    +

    Changes and contact

    +

    Changes to this policy are recorded in the public repository. Questions can be sent to info@kilotest.com.

    +
    + + diff --git a/web/privacy/index.ts b/web/privacy/index.ts new file mode 100644 index 00000000..3dbfc437 --- /dev/null +++ b/web/privacy/index.ts @@ -0,0 +1,20 @@ +/* + index.ts + Serves the privacy policy. +*/ + +// IMPORTS + +import fs from 'node:fs/promises'; +import path from 'node:path'; + +// FUNCTIONS + +// Returns the privacy policy page. +export const answer = async () => { + const answerPage = await fs.readFile(path.join(import.meta.dirname, 'index.html'), 'utf8'); + return { + status: 'ok', + answerPage + }; +}; diff --git a/web/privacy/privacy.test.ts b/web/privacy/privacy.test.ts new file mode 100644 index 00000000..c90edf7f --- /dev/null +++ b/web/privacy/privacy.test.ts @@ -0,0 +1,18 @@ +/* + privacy.test.ts + Unit tests for web/privacy/index.ts, covering the answer export. +*/ + +// IMPORTS + +import {test} from 'node:test'; +import assert from 'node:assert/strict'; +import {answer} from './index.ts'; + +// TESTS + +test('answer returns the privacy policy page', async () => { + const result = await answer(); + assert.equal(result.status, 'ok'); + assert.ok(result.answerPage.includes('

    Privacy policy

    ')); +}); diff --git a/web/tutorialAI/index.html b/web/tutorialAI/index.html index eb883195..1b68e4ad 100644 --- a/web/tutorialAI/index.html +++ b/web/tutorialAI/index.html @@ -14,52 +14,39 @@

    Connect an AI Platform to Kilotest

    -

    What you can do here

    +

    Purpose

    +

    This tutorial shows you how to make Kilotest available to AI assistants. Suppose:

    -

    If you answered both of these questions with yes, this tutorial is designed for you.

    -

    AI needs your help

    -

    When you get AI help, you use AI platforms to interact with large language models (LLMs). LLMs are superb at understanding your questions, fetching information for you, and formulating answers from that information. But LLMs are not good at performing technical tasks to produce the accurate information they need. For those tasks, LLMs use tools. If you ask an LLM a question that requires a tool, you cannot assume that the LLM will know how to discover that tool. Typically, the LLM will try to answer you without the tool and will give you an inferior answer: superficial, vague, incomplete, inaccurate, or even fabricated. To ensure that the LLM uses the right tool, you can tell the AI platform to make the tool available to its LLMs.

    -

    This tutorial shows you how to do that.

    -

    Let us begin with a concrete example

    -

    Suppose the AI platform you want to use is Claude, and you will use it in a web browser.

    -

    Also suppose you will be asking an LLM on that platform to give you technical details about software quality: specifically, about the quality of a particular web page.

    -

    For that task, the LLM will need a tool that can test a web page to discover quality defects and report those defects to the LLM.

    -

    Finally, suppose you know about a tool that has that capability: Kilotest. You also know the URL that Kilotest makes available to LLMs: https://kilotest.com/mcp.

    -

    What to do

    -

    You can solve this problem with two steps.

    -

    Step 1: Become a user

    -

    If you are not already a user of the Claude AI platform, register yourself on it as a user. You can do this for free. Navigate to https://claude.ai/login and use either Google or your email address to create an account. After you proceed through the substeps of creating a Free plan account, you are on the home page of a new task.

    -

    Step 2: Add a connector

    -

    Now you are ready to add a connector to the Claude AI platform.

    -

    The page has a toolbar on the left side. Click it to expand it, so you can see labels, not only icons.

    -

    Now click the Customize tool.

    -

    A dialog opens. In the Customize list, click Connectors.

    -

    The dialog changes to a Connectors view.

    -

    In the Add dropdown list, click Add custom connector.

    -

    A subdialog opens, titled Add custom connector. It contains 4 inputs.

    +

    Then the models on your AI platform can use Kilotest if you make Kilotest available on the platform.

    +

    What AI platform do you use?

    +

    Claude.ai

    +

    Claude.ai is an AI platform that you can use for free in any web browser. To make Kilotest available on Claude.ai:

    + -

    The dialog changes to a tool permissions view for the Kilotest connector. You can decide whether an LLM needs your approval to use each of the tools that Kilotest makes available.

    -

    Close the dialog by clicking the x button in the top-right corner or by pressing the Escape key.

    -

    Finished!

    -

    Now the platform will make the connector available to its LLMs.

    -

    Here is a simple test for you to verify that your configuration works:

    - -

    Did this work?

    -

    If the model used any Kilotest tools, congratulations! You know how to add tool power to the LLMs on one of the major AI platforms.

    -

    But what if it did not work? If an LLM fails to use the Kilotest connector when it should, or if you need to explicitly tell the LLM to use the connector, something is wrong, and we want to know about your experience. Please use the comment form to tell us about it.

    +

    What if this did not work? Use the comment form below to tell us about it.

    You can also submit an issue on the Kilotest GitHub repository.

    Suggest improvements

    From ab2eea8f9ad200b5faca6ead9e44e93601f5d5d2 Mon Sep 17 00:00:00 2001 From: Jonathan Pool Date: Fri, 2 Oct 2026 11:37:59 -0700 Subject: [PATCH 2/3] update version --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index c1918fcf..d0f52556 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@jrpool/kilotest", - "version": "57.0.1", + "version": "57.1.0", "description": "Ensemble testing for front-end web quality", "type": "module", "main": "index.ts", From 155452abbb93e5ac23a50e26c83059c527b27624 Mon Sep 17 00:00:00 2001 From: Jonathan Pool Date: Fri, 2 Oct 2026 11:50:43 -0700 Subject: [PATCH 3/3] debug --- web/privacy/privacy.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/privacy/privacy.test.ts b/web/privacy/privacy.test.ts index c90edf7f..2b5218a6 100644 --- a/web/privacy/privacy.test.ts +++ b/web/privacy/privacy.test.ts @@ -14,5 +14,5 @@ import {answer} from './index.ts'; test('answer returns the privacy policy page', async () => { const result = await answer(); assert.equal(result.status, 'ok'); - assert.ok(result.answerPage.includes('

    Privacy policy

    ')); + assert.ok(result.answerPage.includes('does not sell information')); });