# Migration from v2
## Summary
Version 3 is a complete rewrite of the widget, featuring a redesigned proof-of-work mechanism and an updated architecture.
## Breaking Changes
- `challengeurl` and `challengejson` have been replaced by `challenge`, which accepts either a URL or a JSON-encoded challenge.
- `floating` and `overlay` have been removed in favor of a unified `display` attribute.
- Only a limited set of configuration options can be provided via HTML attributes. Use the programmatic API for advanced configuration.
- CSS structure and custom properties have been refactored. If you applied custom styles or variables, update them accordingly.
- The obfuscation plugin now uses a different algorithm. Previously generated obfuscated data must be regenerated.
## Client
Basic usage remains unchanged. Importing the `altcha` npm package registers the Web Component.
```html
```
### Algorithms
ALTCHA supports multiple algorithms. `PBKDF2/*` and `SHA-*` are bundled with the main widget (unless using `altcha/external`). `Argon2` and `Scrypt` workers must be imported separately.
Supported algorithms:
- `PBKDF2/SHA-256`
- `PBKDF2/SHA-384`
- `PBKDF2/SHA-512`
- `SHA-256`
- `SHA-384`
- `SHA-512`
- `ARGON2ID`
- `SCRYPT`
Example (Vite with `altcha/external`):
```ts
import 'altcha/external';
import Argon2idWorker from 'altcha/workers/argon2id?worker';
import Pbkdf2Worker from 'altcha/workers/pbkdf2?worker';
import ScryptWorker from 'altcha/workers/scrypt?worker';
import ShaWorker from 'altcha/workers/sha?worker';
$altcha.algorithms.set('PBKDF2/SHA-256', () => new Pbkdf2Worker());
$altcha.algorithms.set('PBKDF2/SHA-384', () => new Pbkdf2Worker());
$altcha.algorithms.set('PBKDF2/SHA-512', () => new Pbkdf2Worker());
$altcha.algorithms.set('SHA-256', () => new ShaWorker());
$altcha.algorithms.set('SHA-384', () => new ShaWorker());
$altcha.algorithms.set('SHA-512', () => new ShaWorker());
$altcha.algorithms.set('ARGON2ID', () => new Argon2idWorker());
$altcha.algorithms.set('SCRYPT', () => new ScryptWorker());
```
If you are not using `Argon2` or `Scrypt`, and you are not importing `altcha/external`, no additional setup is required—`PBKDF2/*` and `SHA-*` are included by default.
The widget provides a global `$altcha` object to register algorithms, or to manage default configurations.
## Server-Side Rendering (SSR)
SSR support has been improved. The widget no longer throws errors in environments without `customElements`.
### SvelteKit
```html
```
### Next.js
```jsx
'use client'
import { useSyncExternalStore } from 'react';
import 'altcha';
import type {} from 'altcha/types/react';
export default function Altcha() {
const isClient = useSyncExternalStore(
() => () => {},
() => true,
() => false
);
return isClient
?
: Loading...;
}
```
### Nuxt
```html
```
## TypeScript
Framework-specific type definitions are no longer included automatically. Import them explicitly as needed:
- `altcha/types/jsx`
- `altcha/types/react`
- `altcha/types/svelte`
Example:
```ts
import type {} from 'altcha/types/react'; // or /svelte, /jsx
import type { WidgetAttributes, Challenge } from 'altcha/types';
```
## Obfuscation
The obfuscation plugin is now included in the main `altcha` package. The `@altcha/plugins` package should not be used, as it is intended only for v2.
The data obfuscation algorithm has changed, so any previously generated obfuscated values must be regenerated using the built-in functions provided by the plugin.
For implementation details, see the [README](/README.md#data-obfuscation).
## Server
### Challenge & Verification
The main `altcha` package can now be used in JavaScript and TypeScript server environments. It includes utilities for creating and verifying challenges. Alternatively, the version 2 of `altcha-lib` can be used as well.
```ts
import { createChallenge, solveChallenge, verifySolution, pbkdf2 } from 'altcha/lib';
const HMAC_SIGNATURE_SECRET = 'secret.key';
const HMAC_KEY_SIGNATURE_SECRET = 'second.secret.key';
const challenge = await createChallenge({
algorithm: 'PBKDF2/SHA-256',
cost: 5_000,
deriveKey: pbkdf2.deriveKey,
hmacKeySignatureSecret: HMAC_KEY_SIGNATURE_SECRET,
hmacSignatureSecret: HMAC_SIGNATURE_SECRET
});
const solution = await solveChallenge({
challenge,
deriveKey: pbkdf2.deriveKey
});
const result = await verifySolution({
challenge,
deriveKey: pbkdf2.deriveKey,
hmacKeySignatureSecret: HMAC_KEY_SIGNATURE_SECRET,
hmacSignatureSecret: HMAC_SIGNATURE_SECRET,
solution
});
```
Key server-side changes:
- **Probabilistic and deterministic modes:** When creating a challenge, you can pass a `counter` parameter to generate a **deterministic** challenge. If `counter` is omitted, a **probabilistic** challenge is created. See the [PoW documentation](https://playground.altcha.org/#/about) for details.
- **Two HMAC secrets:** In **deterministic** mode, you may provide a second HMAC secret (`hmacKeySignatureSecret`) to sign the derived key during challenge creation. This enables fast HMAC-only verification in the `verifySolution` function.