@yuktishaalaa/yuktai 5.3.8 → 5.3.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +70 -949
- package/dist/{agent-JGLAYQMX.mjs → agent-G67IA7MY.mjs} +1 -1
- package/dist/chunk-P2PBML6K.mjs +11 -0
- package/dist/chunk-UO7IGXCC.mjs +13 -0
- package/dist/icons.d.mts +2 -1
- package/dist/icons.d.ts +2 -1
- package/dist/index.d.mts +35 -21
- package/dist/index.d.ts +35 -21
- package/dist/index.js +73 -68
- package/dist/index.mjs +42 -48
- package/dist/rag-Q3LUXSSD.mjs +1 -0
- package/dist/renderer.global.js +19 -26
- package/dist/transformers-rag-MQZRMFTG.mjs +1 -0
- package/package.json +7 -6
- package/vanilla/index.js +30 -15
- package/vanilla/index.min.js +31 -38
- package/dist/chunk-3VGU4YGK.mjs +0 -6
- package/dist/chunk-XQMQZMAH.mjs +0 -7
- package/dist/rag-MKBAGH6J.mjs +0 -1
- package/dist/transformers-rag-HW4QKA5T.mjs +0 -1
package/README.md
CHANGED
|
@@ -1,1024 +1,145 @@
|
|
|
1
1
|
# @yuktishaalaa/yuktai
|
|
2
2
|
|
|
3
|
-
>
|
|
3
|
+
> Accessibility, AI and data toolkit for **Next.js, React and plain HTML**. One install or one script tag. Runs in the browser: no API keys, no server, no cost, works offline.
|
|
4
4
|
|
|
5
5
|
[](https://www.npmjs.com/package/@yuktishaalaa/yuktai)
|
|
6
6
|
[](https://www.npmjs.com/package/@yuktishaalaa/yuktai)
|
|
7
7
|
[](./LICENSE)
|
|
8
|
-
[](https://nodejs.org)
|
|
9
8
|
[](https://nextjs.org)
|
|
9
|
+
[](./rust)
|
|
10
|
+
[](https://yuktaidocs.netlify.app/)
|
|
10
11
|
[](https://hub.xerj.org/contributors/sandeepmiriyala03)
|
|
11
12
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
**Live demos:**
|
|
15
|
-
- Staff directory (Next.js): https://aksharatantra.miriyala.in/staffdirectory
|
|
16
|
-
- Vanilla JS, plain HTML, installable PWA: https://sandeepmiriyala03.github.io/yuktai/vanilla/
|
|
17
|
-
- Ratnalabala, a Telugu poetry app built on YuktAI Grid: https://ratnalabala.vercel.app/poems?view=grid
|
|
18
|
-
|
|
19
|
-
**Recognition:** yuktai is part of the [XERJ Corpus Hub](https://hub.xerj.org). Contributor profile: [hub.xerj.org/contributors/sandeepmiriyala03](https://hub.xerj.org/contributors/sandeepmiriyala03).
|
|
20
|
-
|
|
21
|
-
---
|
|
22
|
-
|
|
23
|
-
## The story
|
|
24
|
-
|
|
25
|
-
I have been building web apps since 2013. In all those years, the same things kept breaking on almost every website I touched: missing ARIA labels, no keyboard navigation, forms that senior citizens couldn't figure out, data grids that broke on mobile, accessibility tools that cost money, and AI tools that needed API keys.
|
|
13
|
+
📖 **Docs and live demos:** https://yuktaidocs.netlify.app/
|
|
26
14
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
So I built yuktai, one weekend and one late night at a time.
|
|
15
|
+
Built in free time by [Sandeep Miriyala](https://github.com/sandeepmiriyala03).
|
|
30
16
|
|
|
31
17
|
---
|
|
32
18
|
|
|
33
|
-
##
|
|
19
|
+
## Features
|
|
34
20
|
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
| Module | Features | What it does |
|
|
21
|
+
| | Feature | What it does |
|
|
38
22
|
|---|---|---|
|
|
39
|
-
|
|
|
40
|
-
| **
|
|
41
|
-
| **
|
|
42
|
-
| **
|
|
43
|
-
|
|
|
44
|
-
|
|
|
45
|
-
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
## What's new in v5.3.8: Rust RAG for "Ask page" (optional)
|
|
50
|
-
|
|
51
|
-
The page + data search behind **Ask page** (`createContextIndex`, used after `askAboutPage`) can now run in **Rust**. Same passages, same BM25 scores (bit for bit), same answers: only faster. Free, offline, and it works in PWAs: the engine (about 33 KB of WebAssembly) is embedded in the package.
|
|
52
|
-
|
|
53
|
-
```tsx
|
|
54
|
-
<AgenticPanel engine="rust" /> // React / Next.js: Ask page tab
|
|
55
|
-
```
|
|
56
|
-
|
|
57
|
-
```js
|
|
58
|
-
yuktai.mountAgenticPanel("#tools", { engine: "rust" }) // plain HTML
|
|
59
|
-
const index = yuktai.createContextIndex({ rows, columns, engine: "rust" })
|
|
60
|
-
await index.ask("Which office handles leave requests?")
|
|
61
|
-
```
|
|
23
|
+
| ♿ | **Accessibility** | WCAG 2.2 auto-fix, contrast, dark mode, text size, dyslexia font, colour-blind filters, speak on focus |
|
|
24
|
+
| 📊 | **YuktaiGrid** | Search, sort, pages, CSV export, 5 WCAG themes, Telugu UI, keyboard navigation |
|
|
25
|
+
| 🤖 | **Ask your data** | "salary over 1 lakh in Hyderabad", BI answers, unusual rows, multi-step tasks, WebMCP |
|
|
26
|
+
| 💬 | **Ask page (RAG)** | Answers from your page and data, offline |
|
|
27
|
+
| 🛠 | **Page tools** | QA audit (15 WCAG checks), form and design review, voice commands |
|
|
28
|
+
| 🦀 | **Rust engine** | Up to 42× faster search on big data (optional) |
|
|
29
|
+
| 🎨 | **163 icons** | Any size and colour, outline or filled, safe in Server Components |
|
|
30
|
+
| ⚡ | **Vibe Coder** | Plain English → a full Next.js project ZIP (developer tool) |
|
|
31
|
+
| 📱 | **PWA** | Installable, works offline |
|
|
62
32
|
|
|
63
|
-
|
|
64
|
-
|---|---|
|
|
65
|
-
| `"ts"` (default) | TypeScript, unchanged |
|
|
66
|
-
| `"rust"` | Rust inverted index for every search |
|
|
67
|
-
| `"auto"` | Rust from 1,000 passages |
|
|
68
|
-
|
|
69
|
-
- **How it is faster:** TypeScript scans every word of every passage for each question. Rust builds an inverted index once and jumps straight to the passages that contain the question's words (and their longer/shorter forms, as before).
|
|
70
|
-
- **Same results, tested:** TypeScript still tokenizes (Telugu-aware) and computes `idf` with `Math.log`; Rust does the counting and the BM25 arithmetic in the same order, so scores match bit for bit. Tests compare both engines on English and Telugu documents, grid rows and real page text (1,000+ searches).
|
|
71
|
-
- **Measured** (Node 22, median, per question):
|
|
72
|
-
|
|
73
|
-
| Content | TypeScript | Rust | Speed-up |
|
|
74
|
-
|---|---|---|---|
|
|
75
|
-
| Long page, 500 passages | 2.3 ms | 0.08 ms | 27× |
|
|
76
|
-
| Help docs, 5,000 passages | 18.8 ms | 0.45 ms | 42× |
|
|
77
|
-
| Grid, 1,00,000 rows | 46.2 ms | 3.4 ms | 14× |
|
|
78
|
-
|
|
79
|
-
Rust builds its index once per content change (240 ms for 1 lakh rows); every question after that is fast.
|
|
80
|
-
- **Also faster for everyone (both engines):** asking again on an unchanged page no longer rebuilds the index (6 ms instead of 183 ms for 5,000 passages). The React Ask tab now reuses its index between questions, like the vanilla panel.
|
|
81
|
-
- **PWA:** the demo's service worker cache is now `yuktai-vanilla-v5.3.8`, so installed apps pick up the new engine.
|
|
33
|
+
## Supported languages
|
|
82
34
|
|
|
83
|
-
|
|
35
|
+
**Use it with:** HTML · JavaScript · TypeScript · React (JSX) · Next.js (TSX)
|
|
36
|
+
**Built with:** TypeScript + Rust (WebAssembly, embedded; no setup needed)
|
|
37
|
+
**Interface:** English and Telugu. All 22 Indian languages for number and date formats, sorting and voice input.
|
|
84
38
|
|
|
85
39
|
---
|
|
86
40
|
|
|
87
|
-
##
|
|
88
|
-
|
|
89
|
-
The grid's existing search and number/date sorting can now run in **Rust**, compiled to WebAssembly. Nothing else changes: same rows, same order, same API. The default is still TypeScript, so existing apps behave exactly as before.
|
|
90
|
-
|
|
91
|
-
```tsx
|
|
92
|
-
<YuktaiGrid data={rows} columns={columns} engine="auto" /> // Rust from 10,000 rows
|
|
93
|
-
```
|
|
94
|
-
|
|
95
|
-
```js
|
|
96
|
-
yuktai.renderGrid("#staff", { data: rows, columns, engine: "auto" })
|
|
97
|
-
```
|
|
98
|
-
|
|
99
|
-
| `engine` | What runs |
|
|
100
|
-
|---|---|
|
|
101
|
-
| `"ts"` (default) | TypeScript, unchanged |
|
|
102
|
-
| `"rust"` | Rust for search and number/date sorting |
|
|
103
|
-
| `"auto"` | Rust from 10,000 rows, TypeScript below |
|
|
104
|
-
|
|
105
|
-
- **Same results, tested:** every grid (`<YuktaiGrid>`, `useGrid`, vanilla `renderGrid`) runs its real code with both engines on random mixed data (Telugu text, empty values, NaN, dates, duplicates) and must return identical rows. Text sorting stays in TypeScript, because Telugu order comes from the browser's locale rules.
|
|
106
|
-
- **Faster on big data** (100,000 rows, Chromium, median of 7 runs):
|
|
107
|
-
|
|
108
|
-
| Operation | Grid | TypeScript | Rust | Speed-up |
|
|
109
|
-
|---|---|---|---|---|
|
|
110
|
-
| Search "hyd" | vanilla `renderGrid` | 342 ms | 9 ms | 36× |
|
|
111
|
-
| Search "సీత" | vanilla `renderGrid` | 332 ms | 9 ms | 37× |
|
|
112
|
-
| Sort by date (desc) | vanilla `renderGrid` | 523 ms | 26 ms | 20× |
|
|
113
|
-
| Sort by number | vanilla `renderGrid` | 43 ms | 13 ms | 3× |
|
|
114
|
-
| Search "hyd" | `<YuktaiGrid>` | 25 ms | 4 ms | 6× |
|
|
115
|
-
| Sort by number | `<YuktaiGrid>` | 47 ms | 14 ms | 3× |
|
|
116
|
-
|
|
117
|
-
Rust prepares the search text once per data change (about 130 ms for 100,000 rows), so every keystroke after that is fast. Run it yourself: `node vanilla/test/bench.mjs 100000`.
|
|
118
|
-
- **Small and self-contained:** about 13 KB of WebAssembly, embedded in the package. No extra files, no bundler setup, no Rust needed to use it.
|
|
119
|
-
- **Safe fallback:** if WebAssembly is unavailable, the grid quietly uses TypeScript.
|
|
120
|
-
|
|
121
|
-
**Search time (v5.3.7, optional):** show how long each search or sort took and which engine answered, next to the row count, e.g. `12 rows · 0.9 ms · Rust`.
|
|
122
|
-
|
|
123
|
-
```tsx
|
|
124
|
-
<YuktaiGrid data={rows} columns={columns} engine="rust" showSearchTime
|
|
125
|
-
onSearchTime={({ query, ms, rows, engine }) => console.log(query, ms, rows, engine)} />
|
|
126
|
-
```
|
|
127
|
-
|
|
128
|
-
```js
|
|
129
|
-
yuktai.renderGrid("#staff", { data: rows, columns, engine: "rust", showSearchTime: true })
|
|
130
|
-
grid.getSearchTime() // { query: "hyd", ms: 0.9, rows: 12, engine: "rust" }
|
|
131
|
-
```
|
|
132
|
-
|
|
133
|
-
`useGrid` returns the same object as `grid.searchTime`. The label says **TS** whenever TypeScript did the work (for example a Telugu text sort), so it is always truthful.
|
|
134
|
-
|
|
135
|
-
Source: [`rust/grid-core`](./rust/grid-core) (no dependencies, `no_std`). To rebuild it: `rustup target add wasm32-unknown-unknown`, then `npm run build:rust`. Rust tests: `npm run test:rust`.
|
|
136
|
-
|
|
137
|
-
---
|
|
138
|
-
|
|
139
|
-
## What's new in v5.3: Vanilla JS (plain HTML)
|
|
41
|
+
## Quick start
|
|
140
42
|
|
|
141
|
-
|
|
43
|
+
**Plain HTML:** one line, no build step
|
|
142
44
|
|
|
143
45
|
```html
|
|
46
|
+
<script src="https://cdn.jsdelivr.net/npm/@yuktishaalaa/yuktai@5.3.9/vanilla/index.min.js"></script>
|
|
144
47
|
<script>
|
|
145
|
-
|
|
146
|
-
</script>
|
|
147
|
-
<script src="https://cdn.jsdelivr.net/npm/@yuktishaalaa/yuktai@5.3.0/vanilla/index.min.js"></script>
|
|
148
|
-
|
|
149
|
-
<div id="staff"></div>
|
|
150
|
-
<script>
|
|
151
|
-
const grid = yuktai.renderGrid("#staff", {
|
|
152
|
-
data: rows,
|
|
153
|
-
rowKey: "id",
|
|
154
|
-
columns: [
|
|
155
|
-
{ key: "name", label: "Name" },
|
|
156
|
-
{ key: "salary", label: "Salary", type: "number" },
|
|
157
|
-
{ key: "joined", label: "Joined", type: "date" },
|
|
158
|
-
],
|
|
159
|
-
agentic: true, // question bar: "salary over 1 lakh", "average salary by department"
|
|
160
|
-
ai: true, // assistant: custom rules, phrases, grid tools, voice input
|
|
161
|
-
locale: "en-IN", // or "te-IN" for Telugu UI and messages
|
|
162
|
-
webmcp: true,
|
|
163
|
-
})
|
|
164
|
-
|
|
165
|
-
await grid.ask("salary over 1 lakh in Hyderabad")
|
|
166
|
-
yuktai.mountAgenticPanel("#tools", { defaultTab: "qa" }) // Copilot, QA, Forms, Design, Ask, Voice
|
|
48
|
+
yuktai.renderGrid("#staff", { data: rows, columns, engine: "auto", showSearchTime: true })
|
|
167
49
|
</script>
|
|
168
50
|
```
|
|
169
51
|
|
|
170
|
-
|
|
171
|
-
|---|---|
|
|
172
|
-
| `<YuktaiGrid>` | `yuktai.renderGrid(container, options)` |
|
|
173
|
-
| `useAgenticGrid` + `<AgenticGridBar>` | `yuktai.createAgenticGrid()` + `yuktai.mountAgenticGridBar()`, or `agentic: true` |
|
|
174
|
-
| `useYuktaiGridAgent` | `yuktai.createGridAgent()` |
|
|
175
|
-
| `<YuktaiGridWebMCP>` | `yuktai.registerWebMCP()`, or `webmcp: true` |
|
|
176
|
-
| `<AgenticPanel>` | `yuktai.mountAgenticPanel()` |
|
|
177
|
-
| `<YuktAIWrapper>` | Automatic floating accessibility button (and a page tools button with `showPageTools: true`) |
|
|
178
|
-
| Every function (`runQaAudit`, `askInsight`, `parseAmount`, …) | Same names on `window.yuktai` |
|
|
179
|
-
|
|
180
|
-
**Grid features in the vanilla build:**
|
|
181
|
-
- search, sort, page-size switching, row selection and CSV export (Excel-safe)
|
|
182
|
-
- table, card or auto view; 5 WCAG themes; Telugu UI
|
|
183
|
-
- loading and empty states; row highlighting that scrolls to the row
|
|
184
|
-
- ARIA grid keyboard navigation: arrow keys, Home/End, Page Up/Down, Space to select, Enter to open
|
|
185
|
-
|
|
186
|
-
**Live demo:** https://sandeepmiriyala03.github.io/yuktai/vanilla/. It shows every feature, including a Telugu grid of the 27 poems from *Rangu Rangula Ratnadeepalu*. It is an installable PWA that works offline after the first visit, and it uses only yuktai's own inline SVG icons and the yuktai teal palette.
|
|
187
|
-
|
|
188
|
-
**Tested** in Chromium: 37 end-to-end checks pass, with axe-core reporting 0 violations and no console errors (`node vanilla/test/e2e.mjs`). Full API: [`vanilla/README.md`](./vanilla/README.md).
|
|
189
|
-
|
|
190
|
-
### Accessibility engine fixes in v5.3 (React and vanilla)
|
|
191
|
-
|
|
192
|
-
- Auto-fix no longer adds an `aria-label` to form fields that already have a `<label>`. Before this, it replaced the name that screen readers announce.
|
|
193
|
-
- Buttons and links hidden at scan time are no longer labelled "button" or "link".
|
|
194
|
-
- `<header>` and `<footer>` inside sections and dialogs no longer become page-level banner and contentinfo landmarks.
|
|
195
|
-
- The fix count only includes fixes that were actually applied.
|
|
196
|
-
- Visual alert and skip-link colours use the yuktai teal palette and meet a 4.5:1 contrast ratio.
|
|
197
|
-
|
|
198
|
-
---
|
|
199
|
-
|
|
200
|
-
## What's new in v5.2: Agentic AI Toolkit
|
|
201
|
-
|
|
202
|
-
Ten agentic features, all running in the browser. No API keys, and no page or grid data leaves the device unless you plug in your own model through a `generate` or `summarize` hook.
|
|
203
|
-
|
|
204
|
-
| # | Feature | What it does | Main export |
|
|
205
|
-
|---|---|---|---|
|
|
206
|
-
| 1 | Accessibility Copilot | Watches the page live, explains each issue in plain English, applies safe fixes and undoes them | `createA11yCopilot` |
|
|
207
|
-
| 2 | Page Understanding | Answers "What does this page do?" and "Which form fields are missing labels?" | `analyzePage`, `askAboutPage` |
|
|
208
|
-
| 3 | Smart Data Grid | Turns "overdue and over ₹10,000" into real filters, finds unusual rows, summarises data | `runGridQuery`, `detectAnomalies`, `summarizeRows` |
|
|
209
|
-
| 4 | Voice Accessibility | "Turn on high contrast", "bigger text", "next row", plus Telugu phrases like "పెద్ద అక్షరాలు" | `createVoiceA11yController` |
|
|
210
|
-
| 5 | QA Tester | 15 checks with WCAG references, a score, pass/fail, and a Markdown or JSON report | `runQaAudit`, `auditToMarkdown` |
|
|
211
|
-
| 6 | Forms Agent | Reviews labels, autocomplete, error messages and senior-friendliness | `reviewForms` |
|
|
212
|
-
| 7 | Page + Data RAG | Answers from page text and grid rows, Telugu-aware, offline | `createContextIndex` |
|
|
213
|
-
| 8 | Multi-Step Tasks | "Show overdue, highlight the errors, then summarise what changed" | `runTasks` |
|
|
214
|
-
| 9 | BI Copilot | "Which region had the highest drop in conversion this week?" | `askInsight`, `comparePeriods` |
|
|
215
|
-
| 10 | Design Review | Hierarchy, readability, focus states, clutter, consistency | `reviewDesign` |
|
|
216
|
-
|
|
217
|
-
### Page tools in one panel
|
|
218
|
-
|
|
219
|
-
```tsx
|
|
220
|
-
"use client";
|
|
221
|
-
import { AgenticPanel } from "@yuktishaalaa/yuktai";
|
|
222
|
-
|
|
223
|
-
export default function A11yTools() {
|
|
224
|
-
return <AgenticPanel defaultTab="copilot" voiceLang="en-IN" />;
|
|
225
|
-
}
|
|
226
|
-
```
|
|
227
|
-
|
|
228
|
-
Tabs: **Copilot**, **QA report**, **Forms**, **Design**, **Ask page**, **Voice**. The panel marks itself with `data-yuktai-panel`, so it never audits its own UI.
|
|
229
|
-
|
|
230
|
-
### Ask your grid
|
|
231
|
-
|
|
232
|
-
```tsx
|
|
233
|
-
"use client";
|
|
234
|
-
import { YuktaiGrid, useAgenticGrid, AgenticGridBar } from "@yuktishaalaa/yuktai";
|
|
235
|
-
|
|
236
|
-
const columns = [
|
|
237
|
-
{ key: "name", label: "Customer" },
|
|
238
|
-
{ key: "status", label: "Status" },
|
|
239
|
-
{ key: "region", label: "Region" },
|
|
240
|
-
{ key: "balance", label: "Balance", type: "number" as const },
|
|
241
|
-
{ key: "dueDate", label: "Due date", type: "date" as const },
|
|
242
|
-
];
|
|
243
|
-
|
|
244
|
-
export default function Customers({ rows }: { rows: Customer[] }) {
|
|
245
|
-
const grid = useAgenticGrid({ data: rows, columns, rowKey: "id" });
|
|
246
|
-
|
|
247
|
-
return (
|
|
248
|
-
<>
|
|
249
|
-
<AgenticGridBar
|
|
250
|
-
grid={grid}
|
|
251
|
-
examples={[
|
|
252
|
-
"overdue and over ₹10,000",
|
|
253
|
-
"anything unusual?",
|
|
254
|
-
"total balance by region",
|
|
255
|
-
"show overdue, then sort by balance desc, then summarize what changed",
|
|
256
|
-
]}
|
|
257
|
-
/>
|
|
258
|
-
<YuktaiGrid
|
|
259
|
-
data={grid.gridData}
|
|
260
|
-
columns={columns}
|
|
261
|
-
rowKey="id"
|
|
262
|
-
highlightIds={grid.highlightIds}
|
|
263
|
-
autoScrollToHighlight
|
|
264
|
-
/>
|
|
265
|
-
</>
|
|
266
|
-
);
|
|
267
|
-
}
|
|
268
|
-
```
|
|
269
|
-
|
|
270
|
-
`grid.ask(text)` picks the right tool for the question:
|
|
271
|
-
|
|
272
|
-
| Question type | Example | Handled by |
|
|
273
|
-
|---|---|---|
|
|
274
|
-
| Filters and lookups | "customer starting with A and balance between 1k and 9k" | Smart grid query |
|
|
275
|
-
| Unusual data | "anything unusual?" | Outliers and duplicate rows |
|
|
276
|
-
| Group and period questions | "which region had the highest drop in conversion this week?" | BI copilot |
|
|
277
|
-
| Several steps | "show overdue, then highlight errors, then summarise" | Task runner, with a before/after report |
|
|
278
|
-
|
|
279
|
-
Amounts like `₹10,000`, `10k`, `1.5 lakh` and `2 crore` are understood.
|
|
280
|
-
|
|
281
|
-
### Use the functions directly
|
|
282
|
-
|
|
283
|
-
```ts
|
|
284
|
-
import { runQaAudit, auditToMarkdown, askInsight, runGridQuery } from "@yuktishaalaa/yuktai";
|
|
285
|
-
|
|
286
|
-
// In the browser: accessibility QA report
|
|
287
|
-
const report = runQaAudit();
|
|
288
|
-
console.log(report.score, report.passed);
|
|
289
|
-
const md = auditToMarkdown(report); // attach to a ticket or PR
|
|
290
|
-
|
|
291
|
-
// Anywhere: data questions
|
|
292
|
-
askInsight("which region had the highest drop in conversion this week", rows, columns).answer;
|
|
293
|
-
runGridQuery("overdue and over 10k", { data: rows, columns }).ids;
|
|
294
|
-
```
|
|
295
|
-
|
|
296
|
-
### Plug in your own model (optional)
|
|
297
|
-
|
|
298
|
-
Everything works offline with rules and keyword search. To get model-written answers, pass a `generate` hook, for example Gemini Nano or your own API:
|
|
299
|
-
|
|
300
|
-
```tsx
|
|
301
|
-
<AgenticPanel generate={async (question, context) => myModel(question, context)} />
|
|
302
|
-
```
|
|
303
|
-
|
|
304
|
-
### Honest limits
|
|
305
|
-
|
|
306
|
-
- Questions are understood with rules, not a language model, so unusual phrasing may need rewording. The parser returns `notes` explaining any assumption it made.
|
|
307
|
-
- The QA and design checks are automatic heuristics. They catch common problems but don't replace testing with real users and assistive technology.
|
|
308
|
-
- Smart grid queries, page answers and BI answers are in English today. Telugu and Hindi data questions are not parsed yet; use `customRules` with your own phrases for them.
|
|
309
|
-
- Voice accessibility commands understand English and Telugu, not yet Hindi or other languages.
|
|
310
|
-
|
|
311
|
-
---
|
|
312
|
-
|
|
313
|
-
## What's new in v4.6.4: YuktaiGrid Agentic AI + WebMCP
|
|
314
|
-
|
|
315
|
-
- Shared Grid Tools used by both the Agent and WebMCP
|
|
316
|
-
- Tools: search, count, columns, get row, highlight, select, open
|
|
317
|
-
- WebMCP registration through `document.modelContext`
|
|
318
|
-
- `useYuktaiGridAgent` hook for programmatic tool execution
|
|
319
|
-
- Embedded Grid AI Assistant inside YuktaiGrid
|
|
320
|
-
- English and Telugu AI UI, with English or Telugu voice input
|
|
321
|
-
- Working page-size switching (10 → 20 → 50 → 100)
|
|
322
|
-
- Seven inline SVG icons, no external icon dependency
|
|
323
|
-
|
|
324
|
-
**Architecture:** User → Agent / WebMCP → Grid Tools → YuktaiGrid → Data
|
|
325
|
-
|
|
326
|
-
---
|
|
327
|
-
|
|
328
|
-
## Works on every device
|
|
329
|
-
|
|
330
|
-
| Device | Browser | Core features | AI engine |
|
|
331
|
-
|---|---|---|---|
|
|
332
|
-
| 🖥 Desktop | Chrome 147+ (needed only for Gemini Nano) | ✅ All | Gemini Nano |
|
|
333
|
-
| 🖥 Desktop | Firefox / Edge / Safari | ✅ All | Transformers.js |
|
|
334
|
-
| 📱 Android | Chrome Mobile | ✅ All | Transformers.js |
|
|
335
|
-
| 📱 iOS | Safari Mobile | ✅ All | Transformers.js |
|
|
336
|
-
| 📲 PWA offline | All browsers | ✅ All | Offline after first load |
|
|
337
|
-
|
|
338
|
-
yuktai picks the best AI engine automatically. Users never need to know which one is running.
|
|
339
|
-
|
|
340
|
-
---
|
|
341
|
-
|
|
342
|
-
## Install
|
|
343
|
-
|
|
344
|
-
**Next.js 16 + React 19 (recommended)**
|
|
345
|
-
|
|
346
|
-
```bash
|
|
347
|
-
npm install @yuktishaalaa/yuktai --legacy-peer-deps
|
|
348
|
-
```
|
|
349
|
-
|
|
350
|
-
**Next.js 13, 14, 15**
|
|
52
|
+
**Next.js / React**
|
|
351
53
|
|
|
352
54
|
```bash
|
|
353
55
|
npm install @yuktishaalaa/yuktai
|
|
354
56
|
```
|
|
355
57
|
|
|
356
|
-
**Yarn / pnpm**
|
|
357
|
-
|
|
358
|
-
```bash
|
|
359
|
-
yarn add @yuktishaalaa/yuktai
|
|
360
|
-
pnpm add @yuktishaalaa/yuktai
|
|
361
|
-
```
|
|
362
|
-
|
|
363
|
-
**Plain HTML (no install)**
|
|
364
|
-
|
|
365
|
-
```html
|
|
366
|
-
<script src="https://cdn.jsdelivr.net/npm/@yuktishaalaa/yuktai@5.3.0/vanilla/index.min.js"></script>
|
|
367
|
-
```
|
|
368
|
-
|
|
369
|
-
Requirements: Node.js 18+, npm 8+, Next.js 13+ (React builds only; the vanilla build needs only a browser).
|
|
370
|
-
|
|
371
|
-
---
|
|
372
|
-
|
|
373
|
-
## Quick start
|
|
374
|
-
|
|
375
|
-
### Step 1: `next.config.js`
|
|
376
|
-
|
|
377
|
-
```js
|
|
378
|
-
const nextConfig = {
|
|
379
|
-
transpilePackages: ["@yuktishaalaa/yuktai"],
|
|
380
|
-
async headers() {
|
|
381
|
-
return [
|
|
382
|
-
{
|
|
383
|
-
source: "/(.*)",
|
|
384
|
-
headers: [
|
|
385
|
-
// Needed for voice control and voice input
|
|
386
|
-
{ key: "Permissions-Policy", value: "microphone=*, speaker=*" },
|
|
387
|
-
],
|
|
388
|
-
},
|
|
389
|
-
];
|
|
390
|
-
},
|
|
391
|
-
};
|
|
392
|
-
|
|
393
|
-
module.exports = nextConfig;
|
|
394
|
-
```
|
|
395
|
-
|
|
396
|
-
### Step 2: Client wrapper
|
|
397
|
-
|
|
398
58
|
```tsx
|
|
399
|
-
//
|
|
400
|
-
"use client"
|
|
401
|
-
|
|
402
|
-
import {
|
|
403
|
-
import { YuktAIWrapper } from "@yuktishaalaa/yuktai";
|
|
59
|
+
// app/YuktaiClient.tsx
|
|
60
|
+
"use client"
|
|
61
|
+
import { YuktAIWrapper } from "@yuktishaalaa/yuktai"
|
|
62
|
+
import type { ReactNode } from "react"
|
|
404
63
|
|
|
405
64
|
export default function YuktaiClient({ children }: { children: ReactNode }) {
|
|
406
|
-
const [mounted, setMounted] = useState(false);
|
|
407
|
-
useEffect(() => setMounted(true), []);
|
|
408
|
-
|
|
409
|
-
if (!mounted) return <>{children}</>;
|
|
410
|
-
|
|
411
65
|
return (
|
|
412
|
-
<YuktAIWrapper position="left" showRag
|
|
66
|
+
<YuktAIWrapper position="left" launcher showAccessibility showRag engine="rust">
|
|
413
67
|
{children}
|
|
414
68
|
</YuktAIWrapper>
|
|
415
|
-
)
|
|
416
|
-
}
|
|
417
|
-
```
|
|
418
|
-
|
|
419
|
-
### Step 3: `app/layout.tsx`
|
|
420
|
-
|
|
421
|
-
```tsx
|
|
422
|
-
import YuktaiClient from "@/components/YuktaiClient";
|
|
423
|
-
|
|
424
|
-
export default function RootLayout({ children }: { children: React.ReactNode }) {
|
|
425
|
-
return (
|
|
426
|
-
<html lang="en">
|
|
427
|
-
<body>
|
|
428
|
-
<YuktaiClient>
|
|
429
|
-
<main>{children}</main>
|
|
430
|
-
</YuktaiClient>
|
|
431
|
-
</body>
|
|
432
|
-
</html>
|
|
433
|
-
);
|
|
434
|
-
}
|
|
435
|
-
```
|
|
436
|
-
|
|
437
|
-
That's it. Floating buttons appear on every page: ♿ opens the accessibility panel, 💬 opens "Ask this page", and the agent button opens the AI agent.
|
|
438
|
-
|
|
439
|
-
To add the v5.2 agentic tools, place `<AgenticPanel />` or `useAgenticGrid` in any client component (see [What's new in v5.2](#whats-new-in-v52-agentic-ai-toolkit)).
|
|
440
|
-
|
|
441
|
-
### Wrapper props
|
|
442
|
-
|
|
443
|
-
| Prop | Type | Default | Description |
|
|
444
|
-
|---|---|---|---|
|
|
445
|
-
| `position` | `"left" \| "right"` | `"left"` | Which side the buttons appear on |
|
|
446
|
-
| `showRag` | `boolean` | `false` | Show the 💬 Ask-this-page button |
|
|
447
|
-
| `showAgent` | `boolean` | `false` | Show the AI agent button |
|
|
448
|
-
| `config` | `Partial<A11yConfig>` | `undefined` | Accessibility config overrides |
|
|
449
|
-
| `children` | `ReactNode` | required | Your app content |
|
|
450
|
-
|
|
451
|
-
---
|
|
452
|
-
|
|
453
|
-
## Module 1: Accessibility Engine
|
|
454
|
-
|
|
455
|
-
Scans every element and injects missing accessibility attributes automatically. Covers headings, images, forms, tables, lists, landmarks, and ARIA widgets. Watches for new DOM elements with `MutationObserver`.
|
|
456
|
-
|
|
457
|
-
**Features**
|
|
458
|
-
|
|
459
|
-
- WCAG 2.2 auto-fix: ARIA, roles, tabindex, scope, autocomplete, alt text
|
|
460
|
-
- Speak on focus using browser SpeechSynthesis
|
|
461
|
-
- Voice control using the SpeechRecognition API
|
|
462
|
-
- Visual alerts for deaf and hard-of-hearing users
|
|
463
|
-
- High contrast, dark mode, reduce motion, large targets (44×44)
|
|
464
|
-
- Colour-blind modes: Deuteranopia, Protanopia, Tritanopia, Greyscale
|
|
465
|
-
- Dyslexia font: Atkinson Hyperlegible
|
|
466
|
-
- Local font picker and font scaling from 80% to 130%
|
|
467
|
-
- Audit badge with a WCAG score from 0 to 100 (localhost only)
|
|
468
|
-
- Skip links, focus trap, saved preferences, reset
|
|
469
|
-
|
|
470
|
-
**Direct API**
|
|
471
|
-
|
|
472
|
-
```ts
|
|
473
|
-
import { wcagPlugin, type A11yConfig } from "@yuktishaalaa/yuktai";
|
|
474
|
-
|
|
475
|
-
const config: A11yConfig = {
|
|
476
|
-
enabled: true,
|
|
477
|
-
highContrast: false,
|
|
478
|
-
darkMode: false,
|
|
479
|
-
reduceMotion: false,
|
|
480
|
-
largeTargets: false,
|
|
481
|
-
speechEnabled: false,
|
|
482
|
-
colorBlindMode: "none", // none | deuteranopia | protanopia | tritanopia | achromatopsia
|
|
483
|
-
autoFix: true,
|
|
484
|
-
showPreferencePanel: true,
|
|
485
|
-
showSkipLinks: true,
|
|
486
|
-
showAuditBadge: false, // dev only (localhost)
|
|
487
|
-
fontSizeMultiplier: 1,
|
|
488
|
-
timeoutWarning: 0, // seconds, 0 = off
|
|
489
|
-
};
|
|
490
|
-
|
|
491
|
-
const report = wcagPlugin.applyFixes(config);
|
|
492
|
-
console.log(report.fixed); // number of fixes applied
|
|
493
|
-
console.log(report.score); // 0–100
|
|
494
|
-
```
|
|
495
|
-
|
|
496
|
-
### WCAG coverage
|
|
497
|
-
|
|
498
|
-
| Standard | Criteria | Examples |
|
|
499
|
-
|---|---|---|
|
|
500
|
-
| WCAG 2.0 | 19 | Alt text, roles, labels, tables, landmarks, focus |
|
|
501
|
-
| WCAG 2.1 | 7 | Touch targets, reflow, motion, orientation |
|
|
502
|
-
| WCAG 2.2 | 3 | Focus appearance, target size, timeout warning |
|
|
503
|
-
| Beyond WCAG | Extras | Speech, visual alerts, colour-blind modes, dyslexia font, audit score |
|
|
504
|
-
|
|
505
|
-
---
|
|
506
|
-
|
|
507
|
-
## Module 2: YuktaiGrid ⭐
|
|
508
|
-
|
|
509
|
-
An accessible data grid for Next.js, with an embedded AI assistant, agent tools, and WebMCP support.
|
|
510
|
-
|
|
511
|
-
### Basic usage
|
|
512
|
-
|
|
513
|
-
```tsx
|
|
514
|
-
"use client";
|
|
515
|
-
|
|
516
|
-
import { YuktaiGrid } from "@yuktishaalaa/yuktai";
|
|
517
|
-
|
|
518
|
-
const data = [
|
|
519
|
-
{ id: 1, name: "Sandeep", role: "Developer", salary: 85000 },
|
|
520
|
-
{ id: 2, name: "Priya", role: "Designer", salary: 90000 },
|
|
521
|
-
];
|
|
522
|
-
|
|
523
|
-
export default function EmployeesPage() {
|
|
524
|
-
return (
|
|
525
|
-
<YuktaiGrid
|
|
526
|
-
data={data}
|
|
527
|
-
rowKey="id"
|
|
528
|
-
columns={[
|
|
529
|
-
{ key: "name", label: "Name", sortable: true },
|
|
530
|
-
{ key: "role", label: "Role" },
|
|
531
|
-
{ key: "salary", label: "Salary", type: "number", align: "right" },
|
|
532
|
-
]}
|
|
533
|
-
theme="default" // default | high-contrast | dark | color-blind | dyslexia
|
|
534
|
-
locale="en-US" // en-US | te-IN
|
|
535
|
-
view="auto" // auto | table | card
|
|
536
|
-
search
|
|
537
|
-
ai
|
|
538
|
-
pagination={{
|
|
539
|
-
pageSize: 20,
|
|
540
|
-
showSizeChanger: true,
|
|
541
|
-
sizeOptions: [10, 20, 50, 100],
|
|
542
|
-
}}
|
|
543
|
-
/>
|
|
544
|
-
);
|
|
69
|
+
)
|
|
545
70
|
}
|
|
546
71
|
```
|
|
547
72
|
|
|
548
|
-
### Grid features
|
|
549
|
-
|
|
550
|
-
- Real-time search, column sorting, client-side pagination with page-size switching
|
|
551
|
-
- Mobile card view below a configurable breakpoint
|
|
552
|
-
- Loading and empty states
|
|
553
|
-
- 5 WCAG themes
|
|
554
|
-
- Row selection, custom cell render, `rowKey`
|
|
555
|
-
- Row highlighting with optional auto-scroll
|
|
556
|
-
- Keyboard navigation, ARIA grid semantics, 44×44 targets
|
|
557
|
-
- English and Telugu UI
|
|
558
|
-
- Embedded Grid AI Assistant with voice and chat
|
|
559
|
-
- **New in v5.2:** compound natural-language questions, anomaly detection and BI answers through `useAgenticGrid`
|
|
560
|
-
|
|
561
|
-
### Grid AI Assistant
|
|
562
|
-
|
|
563
|
-
Runs embedded in the grid or as a standalone component. Intent parsing runs locally and supports search, sort, count, highest, lowest, average, total, and row lookup.
|
|
564
|
-
|
|
565
|
-
```tsx
|
|
566
|
-
<YuktaiGridAI
|
|
567
|
-
data={data}
|
|
568
|
-
columns={columns}
|
|
569
|
-
onSearch={handleSearch}
|
|
570
|
-
onSort={handleSort}
|
|
571
|
-
language="te-IN" // AI UI and responses: en-US | te-IN
|
|
572
|
-
inputLanguage="te-IN" // voice input: en-IN, en-US or any of the 22 Indian languages
|
|
573
|
-
embedded
|
|
574
|
-
/>
|
|
575
|
-
```
|
|
576
|
-
|
|
577
|
-
Voice recognition depends on browser Web Speech API support.
|
|
578
|
-
|
|
579
|
-
### Agent tools
|
|
580
|
-
|
|
581
|
-
Generic, reusable grid operations shared by the Agent and WebMCP:
|
|
582
|
-
|
|
583
|
-
```ts
|
|
584
|
-
import {
|
|
585
|
-
searchGrid,
|
|
586
|
-
countGrid,
|
|
587
|
-
getColumns,
|
|
588
|
-
getRow,
|
|
589
|
-
highlightRows,
|
|
590
|
-
selectRow,
|
|
591
|
-
openRow,
|
|
592
|
-
} from "@yuktishaalaa/yuktai";
|
|
593
|
-
```
|
|
594
|
-
|
|
595
|
-
Run tools programmatically:
|
|
596
|
-
|
|
597
73
|
```tsx
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
const tools: GridAgentTool[] = [
|
|
601
|
-
{
|
|
602
|
-
name: "search",
|
|
603
|
-
description: "Search grid rows by a text query",
|
|
604
|
-
execute: async ({ query }) => searchGrid(data, query),
|
|
605
|
-
},
|
|
606
|
-
];
|
|
607
|
-
|
|
608
|
-
const { executeTool, loading } = useYuktaiGridAgent({ tools });
|
|
609
|
-
```
|
|
610
|
-
|
|
611
|
-
**Design principle:** keep generic tools in the package and put app-specific rules in your app.
|
|
612
|
-
|
|
613
|
-
```text
|
|
614
|
-
Generic YuktAI tools + Your domain rules = Your application agent
|
|
74
|
+
// app/layout.tsx: wrap your app
|
|
75
|
+
<body><YuktaiClient>{children}</YuktaiClient></body>
|
|
615
76
|
```
|
|
616
77
|
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
Exposes grid tools to browser AI agents through `document.modelContext`, so agents call real operations instead of guessing from the DOM. Registration is invisible in the UI.
|
|
78
|
+
**Grid and icons**
|
|
620
79
|
|
|
621
80
|
```tsx
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
columns={columns}
|
|
625
|
-
ai
|
|
626
|
-
webmcp
|
|
627
|
-
toolName="my_grid"
|
|
628
|
-
toolDescriptions={TOOL_DESCRIPTIONS}
|
|
629
|
-
onWebMCPStatusChange={setStatus} // unsupported | registering | ready | partial | error
|
|
630
|
-
/>
|
|
631
|
-
```
|
|
81
|
+
import { YuktaiGrid } from "@yuktishaalaa/yuktai"
|
|
82
|
+
import { SearchIcon } from "@yuktishaalaa/yuktai/icons"
|
|
632
83
|
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
```tsx
|
|
636
|
-
<YuktaiGridWebMCP data={data} columns={columns} />
|
|
84
|
+
<YuktaiGrid data={rows} columns={columns} rowKey="id" engine="auto" showSearchTime />
|
|
85
|
+
<SearchIcon size={24} color="#0a4a85" label="Search" />
|
|
637
86
|
```
|
|
638
87
|
|
|
639
|
-
|
|
88
|
+
More examples for every feature: **https://yuktaidocs.netlify.app/**
|
|
640
89
|
|
|
641
|
-
###
|
|
90
|
+
### Wrapper buttons
|
|
642
91
|
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
`src/app/api/employees/route.ts`:
|
|
646
|
-
|
|
647
|
-
```ts
|
|
648
|
-
import { NextRequest, NextResponse } from "next/server";
|
|
649
|
-
|
|
650
|
-
let cachedData: any[] | null = null;
|
|
651
|
-
let cacheTime = 0;
|
|
652
|
-
const TTL_MS = 60_000;
|
|
653
|
-
|
|
654
|
-
async function fetchAll(): Promise<any[]> {
|
|
655
|
-
const now = Date.now();
|
|
656
|
-
if (cachedData && now - cacheTime < TTL_MS) return cachedData;
|
|
657
|
-
const res = await fetch("https://your-api.com/employees", { cache: "no-store" });
|
|
658
|
-
const json = await res.json();
|
|
659
|
-
cachedData = Array.isArray(json) ? json : json.employees ?? json.data ?? [];
|
|
660
|
-
cacheTime = now;
|
|
661
|
-
return cachedData;
|
|
662
|
-
}
|
|
663
|
-
|
|
664
|
-
export async function GET(req: NextRequest) {
|
|
665
|
-
const p = req.nextUrl.searchParams;
|
|
666
|
-
const page = Math.max(1, parseInt(p.get("page") || "1"));
|
|
667
|
-
const pageSize = Math.max(1, parseInt(p.get("pageSize") || "5000"));
|
|
668
|
-
const search = (p.get("search") || "").toLowerCase().trim();
|
|
669
|
-
|
|
670
|
-
const all = await fetchAll();
|
|
671
|
-
const filtered = search
|
|
672
|
-
? all.filter((r) => Object.values(r).some((v) => String(v).toLowerCase().includes(search)))
|
|
673
|
-
: all;
|
|
674
|
-
|
|
675
|
-
const total = filtered.length;
|
|
676
|
-
const rows = filtered.slice((page - 1) * pageSize, page * pageSize);
|
|
677
|
-
|
|
678
|
-
return NextResponse.json({
|
|
679
|
-
rows,
|
|
680
|
-
pagination: { page, pageSize, totalRows: total, totalPages: Math.ceil(total / pageSize) },
|
|
681
|
-
});
|
|
682
|
-
}
|
|
683
|
-
```
|
|
684
|
-
|
|
685
|
-
Page:
|
|
686
|
-
|
|
687
|
-
```tsx
|
|
688
|
-
const [apiResp, setApiResp] = useState<any>(null);
|
|
689
|
-
const [currentPage, setPage] = useState(1);
|
|
690
|
-
|
|
691
|
-
useEffect(() => {
|
|
692
|
-
fetch(`/api/employees?page=${currentPage}&pageSize=5000`)
|
|
693
|
-
.then((r) => r.json())
|
|
694
|
-
.then(setApiResp);
|
|
695
|
-
}, [currentPage]);
|
|
696
|
-
|
|
697
|
-
<YuktaiGrid
|
|
698
|
-
data={apiResp?.rows ?? []}
|
|
699
|
-
columns={columns}
|
|
700
|
-
search={false} // handled server-side
|
|
701
|
-
pagination={false} // handled server-side
|
|
702
|
-
loading={!apiResp}
|
|
703
|
-
/>;
|
|
704
|
-
```
|
|
705
|
-
|
|
706
|
-
Render your own pagination bar from `apiResp.pagination`. The browser only ever holds one page in memory.
|
|
707
|
-
|
|
708
|
-
---
|
|
709
|
-
|
|
710
|
-
## Showcase: Ratnalabala (Telugu poetry)
|
|
711
|
-
|
|
712
|
-
[Ratnalabala](https://ratnalabala.vercel.app/poems?view=grid) shows that an agentic grid is more than a chatbot next to a table. Users type or speak in Telugu, and the grid acts.
|
|
713
|
-
|
|
714
|
-
| User says | Agent action |
|
|
92
|
+
| Prop | Button |
|
|
715
93
|
|---|---|
|
|
716
|
-
|
|
|
717
|
-
|
|
|
718
|
-
| `
|
|
719
|
-
|
|
|
720
|
-
|
|
|
721
|
-
|
|
722
|
-
**Stack:** Next.js · React + TypeScript · MUI · YuktAI Grid · FastAPI (Python) · PostgreSQL on Neon · Vercel · Web Speech API · WebMCP
|
|
723
|
-
|
|
724
|
-
```text
|
|
725
|
-
PostgreSQL → FastAPI → Next.js API proxy → Ratnalabala UI → YuktAI Grid
|
|
726
|
-
├── Agent
|
|
727
|
-
└── WebMCP
|
|
728
|
-
```
|
|
729
|
-
|
|
730
|
-
```tsx
|
|
731
|
-
<YuktaiGrid<PoemRow>
|
|
732
|
-
data={rows}
|
|
733
|
-
columns={COLUMNS}
|
|
734
|
-
rowKey="id"
|
|
735
|
-
locale="te-IN"
|
|
736
|
-
inputLanguage="te-IN"
|
|
737
|
-
customRules={POEM_RULES}
|
|
738
|
-
search
|
|
739
|
-
highlightIds={highlightIds}
|
|
740
|
-
autoScrollToHighlight
|
|
741
|
-
onRowClick={(row) => onOpenPoem(row.title)}
|
|
742
|
-
ai
|
|
743
|
-
webmcp
|
|
744
|
-
toolName="ratnalabala_poems"
|
|
745
|
-
toolDescriptions={TOOL_DESCRIPTIONS}
|
|
746
|
-
onWebMCPStatusChange={setWebmcp}
|
|
747
|
-
/>
|
|
748
|
-
```
|
|
94
|
+
| `launcher` | ✨ One button that shows or hides the others |
|
|
95
|
+
| `showAccessibility` | ♿ Accessibility |
|
|
96
|
+
| `showRag` | 💬 Ask page |
|
|
97
|
+
| `showAgent` | 🤖 AI agent |
|
|
98
|
+
| `showVibeCoder` | ⚡ Vibe Coder (keep it off on public sites) |
|
|
99
|
+
| `engine` | Ask page search: `"ts"`, `"rust"` or `"auto"` |
|
|
749
100
|
|
|
750
101
|
---
|
|
751
102
|
|
|
752
|
-
##
|
|
753
|
-
|
|
754
|
-
Retrieval-Augmented Generation running entirely in the browser. It extracts text chunks from the current page, embeds them, finds the best match for the question, and answers. Offline, no API key.
|
|
755
|
-
|
|
756
|
-
| Device | Engine | How it works |
|
|
757
|
-
|---|---|---|
|
|
758
|
-
| Desktop Chrome with Gemini Nano | `window.LanguageModel` | Page text sent as context, instant answer |
|
|
759
|
-
| Mobile and all other browsers | Transformers.js | Embeddings + `flan-t5-small`, q4 quantized |
|
|
760
|
-
|
|
761
|
-
- About 30 MB one-time model download on mobile, cached in IndexedDB
|
|
762
|
-
- Works fully offline after first load
|
|
763
|
-
- All processing on device, no data sent anywhere
|
|
764
|
-
|
|
765
|
-
**What I learned:** Transformers.js kept crashing on iOS Safari with out-of-memory errors. Quantization (same model, 75% smaller) fixed it. DistilBERT gave short, useless spans; `flan-t5-small` gives real sentences.
|
|
766
|
-
|
|
767
|
-
**New in v5.2:** `createContextIndex` also searches grid rows (including rows on other pages of the grid) and your own documents, with keyword search that handles Telugu and Hindi script correctly.
|
|
768
|
-
|
|
769
|
-
---
|
|
770
|
-
|
|
771
|
-
## Module 4: Autonomous AI Agent
|
|
772
|
-
|
|
773
|
-
Type a goal in plain English. yuktai reads the page, finds the right elements, plans the steps, and highlights what to do.
|
|
103
|
+
## Rust engine (optional)
|
|
774
104
|
|
|
775
|
-
|
|
776
|
-
- Works on static HTML, React, WordPress, and old government portals
|
|
777
|
-
- Gemini Nano planning on desktop, Transformers.js on mobile, rule-based fallback
|
|
778
|
-
- Highlights target fields, scrolls to sections, shows a numbered plan, handles iframes
|
|
105
|
+
Set `engine="rust"` or `"auto"`. Results are identical to TypeScript, proven by tests, only faster. If WebAssembly is unavailable, it falls back to TypeScript.
|
|
779
106
|
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
---
|
|
783
|
-
|
|
784
|
-
## Module 5: Vibe Coder
|
|
785
|
-
|
|
786
|
-
Type a business requirement and download a full Next.js 16 project as a ZIP.
|
|
787
|
-
|
|
788
|
-
- Detects website type (12), pages (21), features (14), theme colour (8), and site name
|
|
789
|
-
- Preview before generating
|
|
790
|
-
- TypeScript, Tailwind + CSS Modules, mobile responsive
|
|
791
|
-
- Navbar, Footer, Home, About, Contact, Services, Pricing, Auth, Dashboard
|
|
792
|
-
- `npm run dev` works immediately
|
|
793
|
-
|
|
794
|
-
No AI writes the code. It's pure template engineering.
|
|
795
|
-
|
|
796
|
-
---
|
|
797
|
-
|
|
798
|
-
## Module 6: Agentic AI Toolkit
|
|
799
|
-
|
|
800
|
-
The ten v5.2 features, described in detail in [What's new in v5.2](#whats-new-in-v52-agentic-ai-toolkit).
|
|
801
|
-
|
|
802
|
-
- **Copilot and QA:** 15 WCAG checks, plain-English explanations, safe fixes with undo, downloadable reports
|
|
803
|
-
- **Forms and design review:** labels, autocomplete, error messages, focus states, hierarchy, clutter, senior-friendly tips
|
|
804
|
-
- **Data:** compound grid questions, outliers and duplicates, group-by, period comparison, trends
|
|
805
|
-
- **Automation:** multi-step instructions with a before/after summary
|
|
806
|
-
- **Voice:** accessibility settings and grid row navigation by voice, in English and Telugu
|
|
807
|
-
- **React:** `AgenticPanel`, `AgenticGridBar`, `useAgenticGrid`
|
|
808
|
-
|
|
809
|
-
---
|
|
810
|
-
|
|
811
|
-
## Gemini Nano setup (desktop Chrome, one time)
|
|
812
|
-
|
|
813
|
-
Needed only for Gemini Nano features on desktop Chrome. Mobile and other browsers use Transformers.js automatically.
|
|
814
|
-
|
|
815
|
-
1. Open `chrome://flags` and enable: Prompt API for Gemini Nano, Summarization API, Writer API, Rewriter API, Translation API.
|
|
816
|
-
2. Click **Relaunch**.
|
|
817
|
-
3. Open `chrome://components`, find **Optimization Guide On Device Model**, and click **Check for update**.
|
|
818
|
-
4. Refresh your page. AI features unlock automatically.
|
|
819
|
-
|
|
820
|
-
**Gemini Nano features:** plain-English rewriting, 3-sentence page summary, AI-generated ARIA labels, page translation in 18 languages.
|
|
821
|
-
|
|
822
|
-
> Chrome 147 moved the APIs from `window.ai` to standalone globals such as `window.LanguageModel`. yuktai supports both.
|
|
823
|
-
|
|
824
|
-
---
|
|
825
|
-
|
|
826
|
-
## Icons
|
|
827
|
-
|
|
828
|
-
163 yuktai SVG icons for Next.js and React, with no icon library needed. They are the same icons the vanilla build draws with `yuktai.icon()`.
|
|
829
|
-
|
|
830
|
-
### Next.js setup
|
|
831
|
-
|
|
832
|
-
```bash
|
|
833
|
-
npm install @yuktishaalaa/yuktai@5.3.4
|
|
834
|
-
```
|
|
835
|
-
|
|
836
|
-
Import from **`@yuktishaalaa/yuktai/icons`**. This entry has no hooks and no browser code, so the icons work in **Server Components** (no `"use client"` needed), in Client Components, and in the Pages Router.
|
|
837
|
-
|
|
838
|
-
```tsx
|
|
839
|
-
// app/page.tsx — a Server Component
|
|
840
|
-
import { MicIcon, SearchIcon, AccessibilityIcon, YuktaiIcon } from "@yuktishaalaa/yuktai/icons"
|
|
841
|
-
|
|
842
|
-
export default function Page() {
|
|
843
|
-
return (
|
|
844
|
-
<>
|
|
845
|
-
{/* decorative: the button text or aria-label names it */}
|
|
846
|
-
<button type="button" aria-label="Start voice input"><MicIcon /></button>
|
|
847
|
-
|
|
848
|
-
{/* meaningful on its own: give it a label */}
|
|
849
|
-
<SearchIcon size={24} label="Search" />
|
|
850
|
-
|
|
851
|
-
{/* filled variant: blue square, glyph colour picked for contrast */}
|
|
852
|
-
<AccessibilityIcon variant="filled" color="#005A9C" size={32} label="Accessibility settings" />
|
|
853
|
-
|
|
854
|
-
{/* any icon by name */}
|
|
855
|
-
<YuktaiIcon name="wand" />
|
|
856
|
-
</>
|
|
857
|
-
)
|
|
858
|
-
}
|
|
859
|
-
```
|
|
860
|
-
|
|
861
|
-
Importing from the main entry (`@yuktishaalaa/yuktai`) still works, but the `/icons` entry is smaller (about 30 KB) and safe on the server.
|
|
862
|
-
|
|
863
|
-
### Props
|
|
864
|
-
|
|
865
|
-
| Prop | Default | What it does |
|
|
866
|
-
|---|---|---|
|
|
867
|
-
| `size` | `20` | Width and height in pixels |
|
|
868
|
-
| `color` | `currentColor` | Outline: the line colour. Filled: the background colour |
|
|
869
|
-
| `variant` | `"outline"` | `"outline"` or `"filled"` |
|
|
870
|
-
| `glyphColor` | auto | Filled only. White or near-black, whichever has more contrast |
|
|
871
|
-
| `shape` | `"rounded"` | Filled only. `"rounded"` square or `"circle"` |
|
|
872
|
-
| `strokeWidth` | `2.5` | Line thickness |
|
|
873
|
-
| `label` | none | Adds `role="img"` and `aria-label`. Without it the icon is decorative (`aria-hidden`) |
|
|
874
|
-
|
|
875
|
-
Any other SVG attribute (`className`, `style`, `id`) is passed through.
|
|
876
|
-
|
|
877
|
-
### All 163 icons
|
|
878
|
-
|
|
879
|
-
| Component | `name` | Component | `name` |
|
|
107
|
+
| Task | TypeScript | Rust | Speed-up |
|
|
880
108
|
|---|---|---|---|
|
|
881
|
-
|
|
|
882
|
-
|
|
|
883
|
-
| `MoonIcon` | moon | `CheckIcon` | check |
|
|
884
|
-
| `MotionIcon` | motion | `ChevronLeftIcon` | left |
|
|
885
|
-
| `ReadingIcon` | reading | `ChevronRightIcon` | right |
|
|
886
|
-
| `TargetIcon` | target | `FirstIcon` | first |
|
|
887
|
-
| `SpeakerIcon` | speaker | `LastIcon` | last |
|
|
888
|
-
| `PaletteIcon` | palette | `SparkIcon` | spark |
|
|
889
|
-
| `SkipIcon` | skip | `AlertIcon` | alert |
|
|
890
|
-
| `CloseIcon` | close | `InfoIcon` | info |
|
|
891
|
-
| `PlusIcon` | plus | `FormIcon` | form |
|
|
892
|
-
| `MinusIcon` | minus | `EyeIcon` | eye |
|
|
893
|
-
| `ResetIcon` | reset | `LayoutIcon` | layout |
|
|
894
|
-
| `SearchIcon` | search | `WandIcon` | wand |
|
|
895
|
-
| `SortIcon` | sort | `UndoIcon` | undo |
|
|
896
|
-
| `SortUpIcon` | sortUp | `ToolsIcon` | tools |
|
|
897
|
-
| `SortDownIcon` | sortDown | `PlugIcon` | plug |
|
|
898
|
-
| `ChevronsIcon` | chevrons | `GridIcon` | grid |
|
|
899
|
-
| `CardsIcon` | cards | `ChatIcon` | chat |
|
|
900
|
-
| `MicIcon` | mic | `StopIcon` | stop |
|
|
901
|
-
| `DownloadIcon` | download | | |
|
|
902
|
-
|
|
903
|
-
**New in v5.3.2 (33):** `HomeIcon` (home), `MenuIcon` (menu), `BookIcon` (book), `CalendarIcon` (calendar), `ClockIcon` (clock), `PersonIcon` (person), `UsersIcon` (users), `GlobeIcon` (globe), `LampIcon` (lamp), `PlayIcon` (play), `PauseIcon` (pause), `SendIcon` (send), `ShareIcon` (share), `GiftIcon` (gift), `ImageIcon` (image), `FileIcon` (file), `ExternalIcon` (external), `ArrowUpIcon` (arrowUp), `ArrowLeftIcon` (arrowLeft), `ArrowRightIcon` (arrowRight), `HeadphonesIcon` (headphones), `MusicIcon` (music), `PinIcon` (pin), `MapIcon` (map), `PenIcon` (pen), `WalletIcon` (wallet), `InstallIcon` (install), `HelpIcon` (help), `TempleIcon` (temple), `MeditateIcon` (meditate), `TrophyIcon` (trophy), `BulbIcon` (bulb), `SunIcon` (sun).
|
|
904
|
-
|
|
905
|
-
**New in v5.3.3 (58):** `DeleteIcon` (delete), `RobotIcon` (robot), `HeartIcon` (heart), `HeartFilledIcon` (heartFilled), `HubIcon` (hub), `CodeIcon` (code), `TextIcon` (text), `BoldIcon` (bold), `ItalicIcon` (italic), `UnderlineIcon` (underline), `AlignLeftIcon` (alignLeft), `AlignCenterIcon` (alignCenter), `AlignRightIcon` (alignRight), `AlignJustifyIcon` (alignJustify), `QuoteIcon` (quote), `TitleIcon` (title), `FontIcon` (font), `SpellcheckIcon` (spellcheck), `AbcIcon` (abc), `PageBreakIcon` (pageBreak), `LinkIcon` (link), `StyleIcon` (style), `LockIcon` (lock), `UnlockIcon` (unlock), `KeyIcon` (key), `RedoIcon` (redo), `SwapIcon` (swap), `ShuffleIcon` (shuffle), `FullscreenIcon` (fullscreen), `FullscreenExitIcon` (fullscreenExit), `MergeIcon` (merge), `JoinIcon` (join), `TouchIcon` (touch), `VolumeOffIcon` (volumeOff), `MusicOffIcon` (musicOff), `MusicVideoIcon` (musicVideo), `MovieIcon` (movie), `SlideshowIcon` (slideshow), `StorageIcon` (storage), `ApiIcon` (api), `DataObjectIcon` (dataObject), `ComputerIcon` (computer), `PhoneIcon` (phone), `CloudIcon` (cloud), `WifiIcon` (wifi), `WifiOffIcon` (wifiOff), `SearchOffIcon` (searchOff), `EyeOffIcon` (eyeOff), `BookmarkIcon` (bookmark), `SchoolIcon` (school), `GavelIcon` (gavel), `ArchitectureIcon` (architecture), `BrainIcon` (brain), `VolunteerIcon` (volunteer), `RadioIcon` (radio), `RadioCheckedIcon` (radioChecked), `UploadIcon` (upload), `ArrowDownIcon` (arrowDown).
|
|
906
|
-
|
|
907
|
-
**New in v5.3.4 (31):** `FactCheckIcon` (factCheck), `ImageSearchIcon` (imageSearch), `DocumentScannerIcon` (documentScanner), `DashboardIcon` (dashboard), `CleaningIcon` (cleaning), `DragHandleIcon` (dragHandle), `ZoomInIcon` (zoomIn), `ZoomOutIcon` (zoomOut), `InsightsIcon` (insights), `ExploreIcon` (explore), `SaveIcon` (save), `LabelIcon` (label), `KeyboardIcon` (keyboard), `TrendingUpIcon` (trendingUp), `TrendingDownIcon` (trendingDown), `CakeIcon` (cake), `BarChartIcon` (barChart), `AdminIcon` (admin), `BugReportIcon` (bugReport), `SentimentSadIcon` (sentimentSad), `IntegrationIcon` (integration), `NamaskarIcon` (namaskar), `SunriseIcon` (sunrise), `SunsetIcon` (sunset), `LoginIcon` (login), `LogoutIcon` (logout), `SpeedIcon` (speed), `RepeatIcon` (repeat), `LoaderIcon` (loader), `StarIcon` (star), `ShieldCheckIcon` (shieldCheck).
|
|
908
|
-
|
|
909
|
-
`heartFilled` and `radioChecked` have a filled part that follows the icon colour, also in the filled variant.
|
|
910
|
-
|
|
911
|
-
`ICON_NAMES` lists every name, and the `IconName` type checks it, so `<YuktaiIcon name="mike" />` is a type error.
|
|
912
|
-
|
|
913
|
-
### WCAG built in
|
|
914
|
-
|
|
915
|
-
- **1.1.1 Non-text content:** decorative by default; pass `label` when the icon carries meaning on its own.
|
|
916
|
-
- **1.4.11 Non-text contrast:** the filled variant picks a glyph colour with at least 3:1 contrast, and warns in the console if a custom `glyphColor` falls below that. For outline icons, choose a `color` with 3:1 against your background, for example W3C blue `#005A9C` on white (7.1:1).
|
|
917
|
-
- **Forced colours (Windows High Contrast):** outline icons follow the text colour; filled icons switch to system colours.
|
|
918
|
-
- **2.5.8 Target size:** an icon is not a target. Put it inside a `<button>` of at least 24×24 px (44×44 is better on touch screens).
|
|
919
|
-
|
|
920
|
-
Helpers: `iconContrast(fg, bg)` returns the contrast ratio, `pickGlyphColor(bg)` returns the best glyph colour, and `iconSvg(name, options)` returns SVG markup as a string (for emails or `dangerouslySetInnerHTML`).
|
|
921
|
-
|
|
922
|
-
### Plain HTML
|
|
923
|
-
|
|
924
|
-
```html
|
|
925
|
-
<span id="mic"></span>
|
|
926
|
-
<script src="https://cdn.jsdelivr.net/npm/@yuktishaalaa/yuktai@5/vanilla/index.min.js"></script>
|
|
927
|
-
<script>
|
|
928
|
-
document.getElementById("mic").innerHTML = yuktai.icon("mic", { size: 24, label: "Voice input" })
|
|
929
|
-
</script>
|
|
930
|
-
```
|
|
109
|
+
| Grid search, 1 lakh rows | 342 ms | 9 ms | 36× |
|
|
110
|
+
| Ask page, 5,000 passages | 18.8 ms | 0.45 ms | 42× |
|
|
931
111
|
|
|
932
112
|
---
|
|
933
113
|
|
|
934
|
-
##
|
|
935
|
-
|
|
936
|
-
- **Zero API keys, zero cost, zero telemetry.** Everything runs in the browser.
|
|
937
|
-
- **Zero injected ids.** Injected nodes are tracked by JavaScript references, so they never collide with your app's ids.
|
|
938
|
-
- **Zero framework lock-in.** `core/renderer.ts` has no framework imports, and the vanilla build runs on any HTML page.
|
|
939
|
-
- **Never reads its own UI.** Panels are marked with `data-yuktai-panel`.
|
|
940
|
-
- **SSR safe.** No `window` errors on the server.
|
|
941
|
-
- **Every automatic fix can be undone.** The v5.2 copilot records each change it makes.
|
|
942
|
-
- **Honest limits.** Client-side pagination is for a few thousand rows; use server-side beyond that.
|
|
114
|
+
## Live demos
|
|
943
115
|
|
|
944
|
-
|
|
116
|
+
- 📖 Docs and playgrounds: https://yuktaidocs.netlify.app/
|
|
117
|
+
- Staff directory (Next.js): https://aksharatantra.miriyala.in/staffdirectory
|
|
118
|
+
- Plain HTML PWA: https://sandeepmiriyala03.github.io/yuktai/vanilla/
|
|
119
|
+
- Ratnalabala, a Telugu poetry app: https://ratnalabala.vercel.app/poems?view=grid
|
|
945
120
|
|
|
946
121
|
## Compatibility
|
|
947
122
|
|
|
948
|
-
|
|
949
|
-
|---|---|
|
|
950
|
-
| Next.js | 13, 14, 15, 16 |
|
|
951
|
-
| Plain HTML | Any page, one script tag (vanilla build) |
|
|
952
|
-
| React | 17, 18, 19 (19 needs `--legacy-peer-deps`) |
|
|
953
|
-
| Node.js | 18+ |
|
|
954
|
-
| Browsers | Chrome 90+, Firefox 90+, Safari 15+, Edge 90+, Samsung Internet 14+ |
|
|
955
|
-
|
|
956
|
-
---
|
|
957
|
-
|
|
958
|
-
## Roadmap
|
|
959
|
-
|
|
960
|
-
### Completed
|
|
961
|
-
|
|
962
|
-
| Version | What shipped |
|
|
963
|
-
|---|---|
|
|
964
|
-
| **v5.3.4** | 31 more icons (163 in total): charts, zoom, save, login/logout, sunrise/sunset, namaskar, star, shield and more, so AIHACK and VajasaneyaSandhya use yuktai icons everywhere |
|
|
965
|
-
| **v5.3.3** | 58 more icons (132 in total): delete, robot, heart, text-editor set, lock, link, storage, cloud, Wi-Fi and more, so Ratnalabala uses yuktai icons everywhere |
|
|
966
|
-
| **v5.3.2** | 33 more icons (home, menu, book, calendar, sun, lamp, temple, meditate, share, play, pause and more), first used on the Sri Yagnavalkya Jayanti site in place of Font Awesome and Material Icons |
|
|
967
|
-
| **v5.3.1** | **74 icons for Next.js and React** (41 in 5.3.1, 33 more in 5.3.2) from the new `@yuktishaalaa/yuktai/icons` entry, safe in Server Components; outline and filled variants with WCAG 1.4.11 contrast checks; same icons in the vanilla build |
|
|
968
|
-
| | Yuktisárathi brand on the demo: navy and gold logo, W3C blue `#005A9C` for links and controls |
|
|
969
|
-
| **v5.3** | **Vanilla JS build:** every module for plain HTML with one script tag, built from the same source as the npm package |
|
|
970
|
-
| | Vanilla grid: themes, card view, Telugu UI, ARIA grid keyboard navigation, question bar, assistant with custom rules and voice, WebMCP |
|
|
971
|
-
| | Vanilla page tools panel and floating accessibility button |
|
|
972
|
-
| | Live demo on GitHub Pages as an installable, offline PWA with the XERJ contributor badge |
|
|
973
|
-
| | Accessibility engine fixes: real labels are no longer overridden, hidden buttons are named correctly, nested landmarks, honest fix count, teal palette at 4.5:1 contrast |
|
|
974
|
-
| | CDN builds on jsDelivr and unpkg; 37 end-to-end browser checks with axe-core |
|
|
975
|
-
| **v5.2** | **Agentic AI Toolkit:** accessibility copilot, QA tester (15 WCAG checks), form review, design review, page understanding, page and data RAG |
|
|
976
|
-
| | Smart grid queries (lakh, crore, 10k), anomaly finder, BI copilot, multi-step task runner, voice accessibility commands in English and Telugu |
|
|
977
|
-
| | React: `AgenticPanel`, `AgenticGridBar`, `useAgenticGrid` |
|
|
978
|
-
| **v4.6.4** | YuktaiGrid Agentic AI + WebMCP, embedded Grid AI Assistant, English and Telugu UI, page-size switching, 7 inline SVG icons |
|
|
979
|
-
| **v4.x** | Accessibility engine, In-tab RAG (Gemini Nano + Transformers.js), autonomous AI agent, Vibe Coder |
|
|
123
|
+
Next.js 13–16 · React 17–19 (19 needs `--legacy-peer-deps`) · Node 18+ · Chrome, Edge, Firefox, Safari, Samsung Internet
|
|
980
124
|
|
|
981
|
-
|
|
125
|
+
## Honest limits
|
|
982
126
|
|
|
983
|
-
-
|
|
984
|
-
-
|
|
985
|
-
- Hindi
|
|
986
|
-
-
|
|
987
|
-
- Server-side paging helpers for the vanilla grid (100K+ rows)
|
|
127
|
+
- Grid questions use rules, not a language model; unusual phrasing may need rewording.
|
|
128
|
+
- Ask page uses keyword search (BM25), not embeddings.
|
|
129
|
+
- Telugu and Hindi data questions need `customRules` for now.
|
|
130
|
+
- Automatic checks don't replace testing with real users and screen readers.
|
|
988
131
|
|
|
989
|
-
|
|
990
|
-
|
|
991
|
-
- Multilingual RAG: Telugu, Hindi, Tamil, Bengali
|
|
992
|
-
- RTL layout support (Urdu, Sindhi, Kashmiri)
|
|
993
|
-
- Richer browser-native AI as Chrome's built-in APIs mature
|
|
994
|
-
- Multimodal grid experiences (images and charts in rows)
|
|
995
|
-
- A web component build (`<yuktai-grid>`) for any framework
|
|
996
|
-
|
|
997
|
-
---
|
|
998
|
-
|
|
999
|
-
## Contributing
|
|
1000
|
-
|
|
1001
|
-
Issues and pull requests are welcome at [github.com/sandeepmiriyala03/yuktai](https://github.com/sandeepmiriyala03/yuktai). For security issues, see [SECURITY.md](./SECURITY.md).
|
|
1002
|
-
|
|
1003
|
-
---
|
|
1004
|
-
|
|
1005
|
-
## Links
|
|
132
|
+
## Roadmap
|
|
1006
133
|
|
|
1007
|
-
-
|
|
1008
|
-
-
|
|
1009
|
-
- Demo: [aksharatantra.miriyala.in/staffdirectory](https://aksharatantra.miriyala.in/staffdirectory)
|
|
1010
|
-
- Showcase: [ratnalabala.vercel.app](https://ratnalabala.vercel.app/poems?view=grid)
|
|
1011
|
-
- Vanilla JS demo (PWA): [sandeepmiriyala03.github.io/yuktai/vanilla](https://sandeepmiriyala03.github.io/yuktai/vanilla/)
|
|
1012
|
-
- Vanilla JS (CDN): [cdn.jsdelivr.net/npm/@yuktishaalaa/yuktai/vanilla/index.min.js](https://cdn.jsdelivr.net/npm/@yuktishaalaa/yuktai/vanilla/index.min.js)
|
|
1013
|
-
- XERJ Corpus Hub: [hub.xerj.org](https://hub.xerj.org)
|
|
1014
|
-
- XERJ contributor profile: [hub.xerj.org/contributors/sandeepmiriyala03](https://hub.xerj.org/contributors/sandeepmiriyala03)
|
|
134
|
+
- **Next:** more Rust (filters, BI, typo-tolerant search, Telugu typed in English letters), Hindi voice commands
|
|
135
|
+
- **Later:** semantic RAG (hybrid search), a Python package, Angular/Vue and .NET support, more Indian-language interfaces
|
|
1015
136
|
|
|
1016
137
|
---
|
|
1017
138
|
|
|
1018
|
-
|
|
139
|
+
**Recognition:** part of the [XERJ Corpus Hub](https://hub.xerj.org) · [contributor profile](https://hub.xerj.org/contributors/sandeepmiriyala03)
|
|
1019
140
|
|
|
1020
|
-
|
|
141
|
+
**Contributing:** issues and PRs welcome at [GitHub](https://github.com/sandeepmiriyala03/yuktai). Security: [SECURITY.md](./SECURITY.md)
|
|
1021
142
|
|
|
1022
|
-
|
|
143
|
+
**License:** GPL-3.0 © Sandeep Miriyala, Yuktishaalaa AI Lab. AI coding assistants helped with learning, writing and testing; every design decision and release is mine.
|
|
1023
144
|
|
|
1024
|
-
**Free forever. Open source. Built for every user.**
|
|
145
|
+
**Free forever. Open source. Built for every user.**
|