Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions capability.md
Original file line number Diff line number Diff line change
Expand Up @@ -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).
1 change: 1 addition & 0 deletions index.html
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,7 @@ <h2>What do you want to know?</h2>
<li><a href="listReports.html">Which web pages have been tested?</a></li>
<li><a href="listTopIssues.html">Which issues have been reported?</a></li>
<li><a href="manage.html">What can Kilotest managers do?</a></li>
<li><a href="privacy.html">What is the privacy policy?</a></li>
</ul>
</main>
</body>
Expand Down
3 changes: 3 additions & 0 deletions index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand Down Expand Up @@ -119,6 +120,7 @@ const answer: {
manage: PageHandler;
metrics: PageHandler;
pruneReportsForm: PageHandler;
privacy: PageHandler;
tutorialWeb: PageHandler;
tutorialAI: PageHandler;
reannotate: PageHandler;
Expand Down Expand Up @@ -149,6 +151,7 @@ const answer: {
manage,
metrics,
pruneReportsForm,
privacy,
tutorialWeb,
tutorialAI,
reannotate,
Expand Down
1 change: 1 addition & 0 deletions llms.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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/)
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -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",
Expand Down
1 change: 1 addition & 0 deletions sitemap.xml
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
<url><loc>https://kilotest.com/requestNewTestForm.html</loc></url>
<url><loc>https://kilotest.com/manage.html</loc></url>
<url><loc>https://kilotest.com/tutorial.html</loc></url>
<url><loc>https://kilotest.com/privacy.html</loc></url>
<url><loc>https://kilotest.com/openapi.yaml</loc></url>
<url><loc>https://kilotest.com/llms.txt</loc></url>
<url><loc>https://kilotest.com/llms-full.txt</loc></url>
Expand Down
37 changes: 37 additions & 0 deletions web/privacy/index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
<!DOCTYPE html>
<html lang="en-US">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="publisher" content="Jonathan Robert Pool">
<meta name="creator" content="Jonathan Robert Pool">
<meta name="description" content="Kilotest privacy policy: what information Kilotest collects, uses, shares, and keeps">
<title>Privacy policy | Kilotest</title>
<link rel="icon" href="/favicon.ico">
<link rel="stylesheet" href="/style.css">
</head>
<body>
<main>
<h1><a href="/">Kilotest</a>: Privacy policy</h1>
<p>This policy applies to the Kilotest web site, API, and MCP server at <code>kilotest.com</code>, 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.</p>
<h2>What Kilotest collects</h2>
<ul>
<li><strong>Request logs.</strong> For every request, Kilotest and its reverse proxy log the IP address, user agent, HTTP method, path (without any query string), response status, and time. This applies to requests made by AI platforms on your behalf as well as to requests from your browser.</li>
<li><strong>Submissions.</strong> If you request testing of a web page, request retesting, comment on a tutorial, or request a feature, Kilotest stores what you submit, such as the URL of the page and the text of the comment.</li>
<li><strong>Usage counts.</strong> Kilotest keeps aggregate counts of page views, MCP tool calls, and API operations. The counts are not linked to any person.</li>
</ul>
<h2>How Kilotest uses the information</h2>
<p>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.</p>
<h2>What is public</h2>
<p>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.</p>
<h2>Who else receives information</h2>
<p>Kilotest sends its maintainer an email notice, through the transactional email service <a href="https://resend.com/">Resend</a>, when a submission arrives. The notice contains the submission. The site is hosted on a server of <a href="https://www.vultr.com/">Vultr</a>, and the site root is checked periodically by <a href="https://uptimerobot.com/">UptimeRobot</a>, which receives no user data. Kilotest discloses information to others only if the law requires it.</p>
<h2>How long Kilotest keeps information</h2>
<p>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.</p>
<h2>Your choices</h2>
<p>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 <a href="mailto:info@kilotest.com">info@kilotest.com</a> and identify the item.</p>
<h2>Changes and contact</h2>
<p>Changes to this policy are recorded in the <a href="https://github.com/jrpool/kilotest">public repository</a>. Questions can be sent to <a href="mailto:info@kilotest.com">info@kilotest.com</a>.</p>
</main>
</body>
</html>
20 changes: 20 additions & 0 deletions web/privacy/index.ts
Original file line number Diff line number Diff line change
@@ -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
};
};
18 changes: 18 additions & 0 deletions web/privacy/privacy.test.ts
Original file line number Diff line number Diff line change
@@ -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('does not sell information'));
});
65 changes: 26 additions & 39 deletions web/tutorialAI/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -14,52 +14,39 @@
<body>
<main>
<h1>Connect an AI Platform to Kilotest</h1>
<h2>What you can do here</h2>
<h2>Purpose</h2>
<p>This tutorial shows you how to make Kilotest available to AI assistants. Suppose:</p>
<ul>
<li>Do you ask questions to artificial intelligence (AI) assistants?</li>
<li>Do some of your questions ask for technical information?</li>
<li>You use an AI platform, like Claude.ai, Claude Code, Claude Desktop, Perplexity, Cursor, Gemini, or ChatGPT.</li>
<li>You want to audit the quality of a web page.</li>
</ul>
<p>If you answered both of these questions with <q>yes</q>, this tutorial is designed for you.</p>
<h2>AI needs your help</h2>
<p>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 <strong>not</strong> good at performing technical tasks to produce the accurate information they need. For those tasks, LLMs use <em>tools</em>. If you ask an LLM a question that requires a tool, you <strong>cannot assume</strong> 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.</p>
<p>This tutorial shows you how to do that.</p>
<h2>Let us begin with a concrete example</h2>
<p>Suppose the AI platform you want to use is Claude, and you will use it in a web browser.</p>
<p>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.</p>
<p>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.</p>
<p>Finally, suppose you know about a tool that has that capability: Kilotest. You also know the URL that Kilotest makes available to LLMs: <code>https://kilotest.com/mcp</code>.</p>
<h2>What to do</h2>
<p>You can solve this problem with two steps.</p>
<h3>Step 1: Become a user</h3>
<p>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 <a href="https://claude.ai/login">https://claude.ai/login</a> and use either Google or your email address to create an account. After you proceed through the substeps of creating a <q>Free plan</q> account, you are on the <a href="https://claude.ai/new">home page of a new task</a>.</p>
<h3>Step 2: Add a connector</h3>
<p>Now you are ready to add a connector to the Claude AI platform.</p>
<p>The page has a toolbar on the left side. Click it to expand it, so you can see labels, not only icons.</p>
<p>Now click the <q>Customize</q> tool.</p>
<p>A dialog opens. In the <q>Customize</q> list, click <q>Connectors</q>.</p>
<p>The dialog changes to a <q>Connectors</q> view.</p>
<p>In the <q>Add</q> dropdown list, click <q>Add custom connector</q>.</p>
<p>A subdialog opens, titled <q>Add custom connector</q>. It contains 4 inputs.</p>
<p>Then the models on your AI platform can use Kilotest <strong>if</strong> you make Kilotest available on the platform.</p>
<h2>What AI platform do you use?</h2>
<ul>
<li><a href="#claude-ai">Claude.ai</a></li>
<li><a href="#claude-code">Claude Code</a></li>
<li><a href="#claude-desktop">Claude Desktop</a></li>
<li><a href="#perplexity">Perplexity</a></li>
<li><a href="#cursor">Cursor</a></li>
<li><a href="#gemini">Gemini</a></li>
<li><a href="#chatgpt">ChatGPT</a></li>
</ul>
<h2 id="claude-ai">Claude.ai</h2>
<p><a href="https://claude.ai/login">Claude.ai</a> is an AI platform that you can use for free in any web browser. To make Kilotest available on Claude.ai:</p>
<ul>
<li><a href="https://claude.ai/new">Start a new task</a>.</li>
<li>Expand the left sidebar to see the labels.</li>
<li>Click <q>Customize</q>.</li>
<li>Click <q>Connectors</q>.</li>
<li>In the <q>Add</q> list, click <q>Add custom connector</q>.</li>
<li>Enter <q>Kilotest</q> into the <q>Name</q> input.</li>
<li>Enter <q>https://kilotest.com/mcp</q> into the <q>Remote MCP server URL</q> input.</li>
<li>Leave the OAuth inputs empty.</li>
<li>Submit the form by clicking the <q>Add</q> button.</li>
</ul>
<p>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.</p>
<p>Close the dialog by clicking the <code>x</code> button in the top-right corner or by pressing the <code>Escape</code> key.</p>
<h2>Finished!</h2>
<p>Now the platform will make the connector available to its LLMs.</p>
<p>Here is a simple test for you to verify that your configuration works:</p>
<ul>
<li>In the <q>How can I help you today?</q> input, choose which model you want to use.</li>
<li>Enter the question: <q>What quality issues exist on the World Wide Web Consortium home page?</q></li>
<li>Click the <q>Send message</q> up-arrow button or press the <code>Enter</code> key to submit your question.</li>
<li>From the answer that you get, determine whether the model used any Kilotest tools for this task.</li>
<li>Click <q>Add</q>.</li>
<li>Decide whether Claude.ai needs your approval to use each Kilotesw tool.</li>
<li>Clicking the <code>x</code> button or by press the <code>Escape</code> key to close the dialog.</li>
</ul>
<h2>Did this work?</h2>
<p>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.</p>
<p>But what if it did <strong>not</strong> 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 <a href="tutorialAIComment.html">comment form</a> to tell us about it.</p>
<p>What if this did not work? Use the comment form below to tell us about it.</p>
<p>You can also submit an issue on the <a href="https://github.com/jrpool/kilotest/issues">Kilotest GitHub repository</a>.</p>
<section id="suggest-improvement" class="main">
<h2>Suggest improvements</h2>
Expand Down
Loading