From bad95edd7bab68a3a862fb17ba6aca5e69a714a1 Mon Sep 17 00:00:00 2001 From: datacas <4690232+datacas@users.noreply.github.com> Date: Tue, 27 Oct 2026 19:25:38 +0100 Subject: [PATCH] docs: add a bilingual landing page and a Spanish README The site is plain HTML/CSS served by GitHub Pages from docs/, with the same paper-and-chrome palette as the app, Spanish and English versions, canonical and hreflang links, Open Graph tags, JSON-LD and a sitemap. README.es.md mirrors the English README; both link to each other. The social preview image moves to docs/ so Pages can serve it. --- README.es.md | 235 +++++++++++++ README.md | 4 + docs/en/index.html | 342 +++++++++++++++++++ docs/index.html | 348 ++++++++++++++++++++ docs/robots.txt | 3 + docs/site.css | 475 +++++++++++++++++++++++++++ docs/sitemap.xml | 17 + {.github => docs}/social-preview.png | Bin 8 files changed, 1424 insertions(+) create mode 100644 README.es.md create mode 100644 docs/en/index.html create mode 100644 docs/index.html create mode 100644 docs/robots.txt create mode 100644 docs/site.css create mode 100644 docs/sitemap.xml rename {.github => docs}/social-preview.png (100%) diff --git a/README.es.md b/README.es.md new file mode 100644 index 0000000..3ceb646 --- /dev/null +++ b/README.es.md @@ -0,0 +1,235 @@ +

+ InkReset +

+ +

InkReset

+ +

+ Descargar la última versión para Windows +

+ +

+ Última versión + CI + Descargas + Licencia + Plataforma +

+ +

+ English · Español +

+ +InkReset es una utilidad de escritorio de código abierto que lee y reinicia los +**contadores de tinta residual** de impresoras Epson por USB. Habla directamente con +la impresora mediante IEEE 1284.4 y los comandos de servicio de la EEPROM de Epson: +sin cuenta del fabricante, sin clave de licencia, sin servidor de activación y sin +acceso a la red. + +> **Reiniciar un contador no es mantenimiento.** +> Reiniciar el contador **no** limpia, sustituye ni vacía el absorbente físico de tinta +> residual. Atiende primero la almohadilla. Reiniciar una almohadilla saturada puede +> hacer que la tinta se desborde. + +## Hardware probado + +InkReset solo se ha probado de principio a fin en una **Epson XP-530** +(`MDL:XP-530 Series`): lectura de los dos contadores de residuos y prueba de escritura +segura. La base de datos integrada cubre muchos otros modelos Epson y el protocolo +debería funcionar en ellos, pero **esos modelos no están probados**. + +Si usas otra impresora, haz primero una lectura y la prueba de escritura segura, y +reinicia bajo tu responsabilidad. Los autores no se hacen responsables de los daños +causados a otras impresoras. + +--- + +## Funciones + +- **Detección automática.** Al arrancar, InkReset enumera las interfaces de impresora + USB, lee el identificador IEEE 1284 del dispositivo y resuelve el perfil + correspondiente en la base de datos integrada. +- **Lecturas reales.** Se lee por USB cada contador de residuos que expone el modelo, + con los valores de registro en bruto y el fondo de escala que declara la impresora. +- **Reinicio condicionado.** Solo se ejecuta si el modelo tiene una tabla de reinicio + verificada, el hardware sigue informando del mismo `MDL:` y el usuario escribe ese + modelo exactamente. Después se vuelven a leer los contadores para verificar la + escritura. +- **Prueba de escritura segura.** Una autoprueba dedicada reescribe un byte de la + EEPROM sin cambiarlo, demostrando que toda la ruta de escritura funciona sin alterar + ningún dato. +- **Interfaz bilingüe.** Español por defecto, inglés disponible en Preferencias. +- **Solo local.** Los ajustes y el historial viven en `localStorage`. No hay telemetría, + ni registro remoto, ni ninguna petición saliente. +- **Sondas sin interfaz.** El mismo núcleo nativo puede enumerar impresoras y leer + contadores desde la línea de comandos, sin abrir la ventana. + +## Capturas + +![Banco de servicio de InkReset leyendo una Epson XP-530](docs/bench.png) + +| Índice de modelos | Preferencias y puente de hardware | +| --- | --- | +| ![Índice de modelos](docs/models.png) | ![Preferencias](docs/settings.png) | + +![Sobre esta compilación](docs/about.png) + +## Tecnología + +| Capa | Tecnología | +| --- | --- | +| Interfaz | React 19, TypeScript, Vite | +| Contenedor de escritorio | Tauri 2 | +| Puente nativo | Rust | +| Transporte USB | Windows SetupAPI / `USBPRINT` + `ReadFile` / `WriteFile` solapados | +| Protocolo de impresora | Sesión IEEE 1284.4 + comandos de servicio de la EEPROM de Epson | + +La interfaz se dibuja dentro del WebView de Tauri. Cada escaneo, lectura y reinicio es +una transacción USB real ejecutada por el puente en Rust; la capa web solo describe la +intención. + +## Cómo funciona el protocolo + +InkReset implementa la sesión IEEE 1284.4 que usan las herramientas de servicio de +Epson: + +1. Entrar en modo 1284.4. +2. Inicializar la sesión y resolver el nombre del servicio a un id de socket. +3. Abrir un canal con los tamaños de paquete que declara el perfil del dispositivo. +4. Intercambiar concesiones y peticiones de crédito y enviar un paquete de datos por + cada byte de EEPROM. +5. Cerrar el canal y salir del modo 1284.4. + +El comando de EEPROM que viaja dentro de un paquete de datos es: + +``` +lectura: 7C 7C 00 41 BE A0 [addr_hi] +escritura: 7C 7C 00 42 BD 21 [addr_hi] +``` + +La impresora responde a una lectura con `EE:` y a una escritura con `OK`. +Las respuestas de control llevan el byte de estado y, para las tramas `0x7F`, el id de +error de la impresora. Un canal ya abierto (`0x03`) se trata como éxito; un canal +ocupado (`0x04`) se reintenta un número acotado de veces. + +Por modelo, una cadena de claves de especificación aporta el bloque de servicio +(token de fábrica y nombre de servicio), los contadores de residuos (`registers`, +`mask`, `shift`, `filter`) y la tabla de reinicio de pares `(dirección, valor)`. La +base de datos integrada incluye **1.022 registros de impresora** y **371 claves de +especificación**, de las cuales unas 930 resuelven a un bloque de servicio utilizable. + +## Requisitos + +- Windows 10 u 11 (el puente USB nativo es solo para Windows) +- Runtime de WebView2 +- Node.js 20+ +- Rust estable con la cadena de herramientas MSVC +- Visual Studio Build Tools con el Windows SDK + +En Linux y macOS la interfaz compila y la aplicación arranca, pero el puente se declara +no disponible y no se contacta con ningún dispositivo. + +## Compilar y ejecutar + +```bash +npm install + +npm run dev # solo interfaz en un navegador (sin acceso USB) +npm run tauri:dev # contenedor nativo con el puente USB real +npm run tauri:build # ejecutable e instalador de release +``` + +Una compilación de release debe incorporar la interfaz. Tauri lo hace mediante la +característica `custom-protocol`: + +```bash +cargo build --release --features custom-protocol +``` + +## Línea de comandos + +```bash +inkreset-studio.exe --probe +inkreset-studio.exe --probe --read-counters +inkreset-studio.exe --self-test +inkreset-studio.exe --raw-session --sockets 0A,FF --names EPSON-CTRL,EPSON-DATA +``` + +| Opción | Para qué sirve | +| --- | --- | +| `--probe` | Enumera las interfaces USBPRINT y escribe `%TEMP%\inkreset-probe.json` | +| `--probe --read-counters` | Además ejecuta la sesión 1284.4 de solo lectura e incluye los contadores | +| `--self-test` | Reescribe un byte de la EEPROM sin cambiarlo e informa del resultado | +| `--raw-session` | Vuelca el handshake 1284.4 trama a trama; nunca escribe en la EEPROM | + +Todos los comandos imprimen JSON por la salida estándar y escriben el mismo informe en +`%TEMP%`. + +## Modelo de seguridad + +- **Perfil verificado por el dispositivo.** El modelo se vuelve a leer del identificador + IEEE 1284 de la impresora antes de escribir; el webview no puede proporcionarlo. +- **Confirmación escrita.** El usuario debe teclear la cadena `MDL:` exacta. +- **Sin tabla de reinicio no hay escritura.** Los modelos con bloque de servicio pero + sin datos de reinicio son de solo lectura. +- **Verificación posterior.** Los contadores se leen de nuevo y se devuelven junto al + resultado del reinicio. +- **Aviso permanente.** La interfaz y todos los informes indican que reiniciar un + contador no atiende la almohadilla física. + +## Estructura del proyecto + +``` +src/ +├─ App.tsx # preferencias y proveedor de i18n +├─ Bench.tsx # estructura del banco de servicio +├─ components/ # medidores, paneles, diálogos, índice de modelos +├─ hooks/usePrinterSession.ts # estado del dispositivo e historial de sesión +├─ services/bridge/ # envoltorios de invoke() y PrinterTransport +├─ i18n/ # diccionario tipado español/inglés +└─ styles/global.css # sistema de diseño + +src-tauri/ +├─ src/protocol/mod.rs # tramas 1284.4, códec de EEPROM, decodificación +├─ src/spec_db.rs # base de datos de dispositivos integrada +├─ src/specs.json # registros de impresora y claves de especificación +├─ src/usb/windows.rs # enumeración SetupAPI y transporte solapado +├─ src/usb/ieee1284.rs # analizador del identificador IEEE 1284 +├─ src/commands.rs # comandos de Tauri +└─ tauri.conf.json # configuración de ventana y empaquetado +``` + +## Pruebas + +El módulo de protocolo no tiene dependencias de terceros, así que se puede probar por +separado: + +```bash +rustc --edition 2021 --test src-tauri/src/protocol/mod.rs -o /tmp/proto-test +/tmp/proto-test +``` + +En Windows, `cargo test` dentro de `src-tauri/` cubre además la base de datos de +dispositivos, el analizador del identificador IEEE 1284 y la sesión completa de +lectura y reinicio contra una impresora falsa con estado. + +## Limitaciones + +- **Solo USB.** Las impresoras conectadas por EpsonNet o WSD no aparecen. +- **Solo Epson.** La base de datos de dispositivos cubre modelos Epson. +- **Valores de registro en bruto.** Se aplican los campos `mask` y `shift`, pero no se + reconstruye la fórmula de porcentaje que usan algunas entradas de filtro; la interfaz + muestra el valor de registro en bruto y el fondo de escala de la impresora. +- **El índice de modelos es una lista de referencia curada**, no una garantía de que + cada modelo listado exponga contadores legibles o reiniciables. +- **Solo la Epson XP-530 está verificada en hardware.** Otros modelos deberían + funcionar, pero el usuario debe probarlos antes de reiniciar. + +## Licencia + +MIT — ver [LICENSE](LICENSE). + +--- + +**Sustituye o atiende siempre el absorbente físico de tinta residual antes de +reiniciar un contador.** diff --git a/README.md b/README.md index 5216687..5170bc3 100644 --- a/README.md +++ b/README.md @@ -16,6 +16,10 @@ Platform

+

+ English · Español +

+ InkReset is an open-source desktop utility that reads and resets the **waste-ink counters** of Epson printers over USB. It talks to the printer directly through IEEE 1284.4 and the Epson EEPROM service commands — no vendor account, no licence diff --git a/docs/en/index.html b/docs/en/index.html new file mode 100644 index 0000000..8727633 --- /dev/null +++ b/docs/en/index.html @@ -0,0 +1,342 @@ + + + + + +InkReset — Reset your Epson waste ink pad counter over USB (Windows) + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+ +
+
+
+
Local service bench · Windows x64
+

Waste ink,
under control.

+

+ Read and reset the waste ink pad counter of your Epson over USB. No account, + no licence key and no network: the app talks to the printer directly through + IEEE 1284.4. +

+ +

Free · Open source · MIT · No install required

+
+
+ InkReset showing an Epson XP-530: main pad at 19 % and borderless pad at 0 % +
+
+
+ +
+
+ +

+ A counter reset is not maintenance. + It does not clean, replace or empty the physical absorber. Service the pad first: + resetting a saturated pad can make ink overflow. +

+
+
+ +
+
+
+
Tested hardware
+
+

+ InkReset has only been tested end to end on an Epson XP-530 + (MDL:XP-530 Series): reading both counters and the safe write test. +

+

+ The embedded database covers many other Epson models and the protocol should + work on them, but those models are untested. On a different printer, run a + read and the safe write test first, then reset at your own risk. The authors + accept no responsibility for damage caused to other printers. +

+
+
+
+
+ +
+
+
+

What it does, plainly

+

Everything on screen is a real USB transaction executed by the native Rust + bridge.

+
+
+
+ 01 +

Automatic discovery

+

On launch it enumerates USB printer interfaces, reads the IEEE 1284 device ID + and resolves the model profile from the embedded database.

+
+
+ 02 +

Real readings

+

Every counter the model exposes, with raw register values and the full-scale + value the printer itself reports.

+
+
+ 03 +

Gated reset

+

The model is re-read from the device and has to be typed exactly. Without a + verified reset table, nothing is written.

+
+
+ 04 +

Safe write test

+

A self-test writes one EEPROM byte back unchanged, proving the whole write + path works before you touch a counter.

+
+
+ 05 +

Local only

+

No telemetry, no licence server and no outbound request. Settings and history + stay on the machine.

+
+
+ 06 +

Bilingual UI

+

Spanish by default, English available in Settings. No feature depends on the + language.

+
+
+
+
+ +
+
+
+

Screenshots

+

Taken with a real XP-530 connected over USB.

+
+
+
+ InkReset main panel with the waste counters and the reset protocol +
+
+ Index of 846 documented Epson models +
+
+ Settings and hardware bridge with the detected printer profile +
+
+
+
+ +
+
+
+

Install

+

Windows 10 or 11, 64-bit. No account, no key, no activation.

+
+
+
+
Recommended
+

Installer

+

Installs the app and creates a shortcut. It can be removed from Settings like + any other program.

+

NSIS installer (.exe)

+
+
+
No install
+

Portable

+

A single executable. Handy for a service USB stick.

+

Portable build (.exe)

+
+
+
Managed
+

MSI package

+

For group policy or endpoint management tooling.

+

MSI package

+
+
+
+
+ +
+
+
+

Safety model

+

Writing to a printer EEPROM is irreversible. The app is built around that.

+
+
    +
  • Device-verified profile. The model string is re-read from the printer + before a write; the UI cannot supply it.
  • +
  • Typed confirmation. The exact MDL: string has to be typed.
  • +
  • No table, no write. Models without reset data are read-only.
  • +
  • Verification after write. Counters are read again and returned with the + result.
  • +
  • Never unverified bytes. Every frame is checked against the profile + before it leaves.
  • +
  • Persistent warning. The UI states that a reset does not service the + physical pad.
  • +
+
+
+ +
+
+
+

Frequently asked

+
+
+ Is it free? +

Yes. The code is MIT and the published builds are free. No “pro” edition, no + key and no reset limit.

+
+
+ Does it send data anywhere? +

No. The app opens no network connections: it talks to the printer over USB and + keeps settings in local storage. No telemetry, no remote logging.

+
+
+ Will it work with my Epson? +

Probably, but only an XP-530 is verified. The database ships 1,022 printer + records and 371 spec keys, and roughly 930 resolve to a usable service block. If + your model is untested, run a read and the safe write test first, and accept the + risk.

+
+
+ What is the waste ink pad counter? +

An internal counter the printer increments on every head cleaning. When it + reaches the limit the firmware stops printing even though the printer still + works. Resetting returns the counter to zero; it does not replace the pad, which + is still soaked with ink.

+
+
+ Do I need a licence key or an internet connection? +

No. There is no activation, no server and no account check. The executable + works offline.

+
+
+ Why Windows only? +

The USB bridge uses Windows SetupAPI and the USBPRINT device. On + Linux and macOS the front end builds and runs, but the bridge reports itself as + unavailable and no device is contacted.

+
+
+
+ +
+
+

Resetting an Epson waste ink pad counter

+

+ When an Epson reports that the waste ink pad is at the end of its service life, + the firmware blocks printing even though the print head may still be fine. The + message refers to an internal counter that adds up every cleaning cycle; the + physical absorber is a separate thing and has to be dealt with too. +

+

How it works with InkReset

+
    +
  1. Connect the printer over USB and turn it on. Detection is automatic.
  2. +
  3. Check the counter readings: current value and full scale.
  4. +
  5. Run the safe write test, which writes one byte back unchanged.
  6. +
  7. Reset only if the model shows a verified reset table, and type its exact + MDL: string.
  8. +
  9. Read again to confirm the counter reached zero.
  10. +
+

Before you reset

+

+ Replace or clean the pad. A zeroed counter over a saturated absorber only delays + the problem and can end in a spill inside the machine. If you would rather not take + the printer apart, have the maintenance done by a service centre and use InkReset + for the software side only. +

+

Which models are covered

+

+ The embedded database targets the Epson family with IEEE 1284.4 support, from + Expression Home and WorkForce to EcoTank and the XP, WF, ET and L series. Even so, + the only model verified on hardware is the XP-530. +

+
+
+ +
+ +
+
+ INKRESET + local service tool + + GitHub + MIT + Español +
+
+ Independent open-source reconstruction, not affiliated with the original + manufacturer. Epson is a trademark of Seiko Epson Corporation. +
+
+ + + diff --git a/docs/index.html b/docs/index.html new file mode 100644 index 0000000..887a02b --- /dev/null +++ b/docs/index.html @@ -0,0 +1,348 @@ + + + + + +InkReset — Reinicia el contador de la almohadilla de tu Epson por USB (Windows) + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+ +
+
+
+
Banco de servicio local · Windows x64
+

Tinta residual,
bajo control.

+

+ Lee y reinicia el contador de la almohadilla de residuos de tu Epson por USB. + Sin cuenta, sin clave de licencia y sin conexión: la aplicación habla + directamente con la impresora mediante IEEE 1284.4. +

+ +

Gratis · Código abierto · MIT · Sin instalador obligatorio

+
+
+ InkReset mostrando los contadores de una Epson XP-530: almohadilla principal al 19 % y almohadilla sin bordes al 0 % +
+
+
+ +
+
+ +

+ Reiniciar el contador no es mantenimiento. + No limpia, no sustituye y no vacía el absorbente físico. Atiende la almohadilla + primero: reiniciar una almohadilla saturada puede hacer que la tinta se desborde. +

+
+
+ +
+
+
+
Hardware probado
+
+

+ InkReset solo se ha probado de principio a fin en una Epson XP-530 + (MDL:XP-530 Series): lectura de los dos contadores y prueba de + escritura segura. +

+

+ La base de datos integrada cubre muchos otros modelos Epson y el protocolo + debería funcionar en ellos, pero esos modelos no están probados. Si usas + otra impresora, haz primero una lectura y la prueba de escritura segura, y + reinicia bajo tu responsabilidad. Los autores no se hacen responsables de los + daños causados a otras impresoras. +

+
+
+
+
+ +
+
+
+

Lo que hace, sin adornos

+

Todo lo que ocurre en pantalla es una transacción USB real ejecutada por el + puente nativo en Rust.

+
+
+
+ 01 +

Detección automática

+

Al abrir, enumera las interfaces de impresora USB, lee el identificador + IEEE 1284 y resuelve el perfil del modelo en la base de datos integrada.

+
+
+ 02 +

Lecturas reales

+

Cada contador que expone el modelo, con sus registros en bruto y el fondo de + escala que declara la propia impresora.

+
+
+ 03 +

Reinicio condicionado

+

El modelo se vuelve a leer del dispositivo y hay que teclearlo exactamente. + Sin tabla de reinicio verificada, no se escribe nada.

+
+
+ 04 +

Prueba de escritura segura

+

Una autoprueba reescribe un byte de la EEPROM sin cambiarlo y demuestra que + toda la ruta de escritura funciona.

+
+
+ 05 +

Solo local

+

Sin telemetría, sin servidor de licencias y sin ninguna petición saliente. + Ajustes e historial se quedan en el equipo.

+
+
+ 06 +

Interfaz bilingüe

+

Español por defecto, inglés disponible en Preferencias. Ninguna función + depende del idioma.

+
+
+
+
+ +
+
+
+

Capturas

+

Tomadas con una XP-530 real conectada por USB.

+
+
+
+ Panel principal de InkReset con los contadores de residuos y el protocolo de reinicio +
+
+ Índice de 846 modelos Epson documentados +
+
+ Preferencias y puente de hardware con el perfil de la impresora detectada +
+
+
+
+ +
+
+
+

Instalar

+

Windows 10 u 11, 64 bits. No hay cuenta, ni clave, ni activación.

+
+
+
+
Recomendado
+

Instalador

+

Instala la aplicación y crea el acceso directo. Se puede desinstalar desde + Configuración como cualquier otro programa.

+

Instalador NSIS (.exe)

+
+
+
Sin instalar
+

Portable

+

Un único ejecutable. Útil para llevar la herramienta en un pendrive de + servicio.

+

Compilación portable (.exe)

+
+
+
Empresa
+

Paquete MSI

+

Para despliegue con directivas de grupo o herramientas de gestión.

+

Paquete MSI

+
+
+
+
+ +
+
+
+

Modelo de seguridad

+

Escribir en la EEPROM de una impresora es irreversible. La aplicación está + construida alrededor de esa idea.

+
+
    +
  • Perfil verificado por el dispositivo. El modelo se relee de la impresora + antes de escribir; la interfaz no puede proporcionarlo.
  • +
  • Confirmación escrita. Hay que teclear la cadena MDL: exacta.
  • +
  • Sin tabla de reinicio no hay escritura. Los modelos sin datos de reinicio + son de solo lectura.
  • +
  • Verificación posterior. Los contadores se vuelven a leer y se devuelven + con el resultado.
  • +
  • Nunca se envían bytes sin verificar. Cada trama se comprueba contra el + perfil antes de salir.
  • +
  • Aviso permanente. La interfaz recuerda que reiniciar no atiende la + almohadilla física.
  • +
+
+
+ +
+
+
+

Preguntas frecuentes

+
+
+ ¿Es gratis? +

Sí. El código es MIT y las versiones publicadas son gratuitas. No hay versión + «pro», ni clave, ni límite de reinicios.

+
+
+ ¿Envía datos a algún sitio? +

No. La aplicación no abre conexiones de red: habla con la impresora por USB y + guarda los ajustes en el almacenamiento local del equipo. No hay telemetría ni + registro remoto.

+
+
+ ¿Funciona con mi impresora Epson? +

Probablemente, pero solo está verificada una XP-530. La base de datos incluye + 1.022 registros de impresora y 371 claves de especificación, y unas 930 resuelven + a un bloque de servicio utilizable. Si tu modelo no está probado, ejecuta primero + una lectura y la prueba de escritura segura, y asume el riesgo.

+
+
+ ¿Qué es el contador de la almohadilla de residuos? +

Es un contador interno que la impresora incrementa con cada limpieza de + cabezales. Cuando llega al límite, el firmware se detiene aunque la impresora + funcione. Reiniciarlo devuelve el contador a cero; no sustituye la almohadilla, + que sigue llena de tinta.

+
+
+ ¿Necesito clave de licencia o conexión a internet? +

No. No hay activación, ni servidor, ni comprobación de cuenta. El ejecutable + funciona sin red.

+
+
+ ¿Por qué solo Windows? +

El puente USB usa SetupAPI y el dispositivo USBPRINT de Windows. En Linux y + macOS la interfaz compila y arranca, pero el puente se declara no disponible y no + se contacta con ningún dispositivo.

+
+
+
+ +
+
+

Reiniciar el contador de la almohadilla en una Epson

+

+ Cuando una Epson muestra el aviso de que la almohadilla de tinta residual está + al final de su vida útil, el firmware bloquea la impresión aunque el cabezal siga + funcionando. El mensaje hace referencia a un contador interno que suma cada + limpieza; el absorbente físico es otra cosa y también hay que atenderlo. +

+

Cómo se hace con InkReset

+
    +
  1. Conecta la impresora por USB y enciéndela. La detección es automática.
  2. +
  3. Comprueba la lectura de los contadores: valor actual y fondo de escala.
  4. +
  5. Ejecuta la prueba de escritura segura, que reescribe un byte sin cambiarlo.
  6. +
  7. Reinicia solo si el modelo aparece con tabla de reinicio verificada y escribes + su MDL: exacto.
  8. +
  9. Vuelve a leer para confirmar que el contador quedó a cero.
  10. +
+

Antes de reiniciar

+

+ Sustituye o limpia la almohadilla. Un contador a cero con un absorbente saturado + solo retrasa el problema y puede acabar en un derrame dentro del equipo. Si no + quieres desmontar la impresora, lleva el mantenimiento a un servicio técnico y usa + InkReset solo para la parte lógica. +

+

Qué modelos están cubiertos

+

+ La base de datos integrada está pensada para la familia Epson con soporte de + IEEE 1284.4, desde las Expression Home y WorkForce hasta las EcoTank y las series + XP, WF, ET y L. Aun así, la única verificada en hardware es la XP-530. +

+
+
+ +
+ +
+
+ INKRESET + herramienta local de servicio + + GitHub + MIT + English +
+
+ Reconstrucción independiente de código abierto, sin relación con el fabricante + original. Epson es una marca registrada de Seiko Epson Corporation. +
+
+ + + diff --git a/docs/robots.txt b/docs/robots.txt new file mode 100644 index 0000000..44ce032 --- /dev/null +++ b/docs/robots.txt @@ -0,0 +1,3 @@ +User-agent: * +Allow: / +Sitemap: https://datacas.github.io/inkreset/sitemap.xml diff --git a/docs/site.css b/docs/site.css new file mode 100644 index 0000000..23442c8 --- /dev/null +++ b/docs/site.css @@ -0,0 +1,475 @@ +/* InkReset landing — shares the app's paper-and-chrome palette. */ + +:root { + --paper: #f1ecdf; + --paper-deep: #e7e1d1; + --surface: #faf7ee; + --surface-raised: #fffdf7; + --ink: #141815; + --ink-soft: #38403a; + --muted: #6e756c; + --muted-strong: #555d55; + --line: #d9d2bf; + --line-soft: #e6e0d0; + + --accent: #e0472a; + --accent-deep: #b6341b; + --accent-soft: #f7ded6; + --good: #2c7a58; + --warning: #a9721a; + --warning-soft: #f4e6c8; + + --chrome: #191e1b; + --chrome-2: #222823; + --chrome-line: #38423a; + --chrome-text: #e9e5d8; + --chrome-muted: #9aa397; + + --radius-sm: 10px; + --radius-md: 14px; + --radius-lg: 20px; + --shadow-md: 0 1px 0 rgba(20, 24, 21, 0.04), 0 22px 44px -30px rgba(20, 24, 21, 0.55); + + --font-display: 'Space Grotesk', system-ui, sans-serif; + --font-body: 'Manrope', system-ui, -apple-system, sans-serif; + --font-mono: 'IBM Plex Mono', ui-monospace, SFMono-Regular, monospace; +} + +*, +*::before, +*::after { box-sizing: border-box; } + +html { scroll-behavior: smooth; } + +body { + margin: 0; + color: var(--ink); + background: var(--paper); + font-family: var(--font-body); + font-size: 16px; + line-height: 1.6; + -webkit-font-smoothing: antialiased; +} + +img { max-width: 100%; height: auto; display: block; } +a { color: inherit; } + +.wrap { + width: min(1180px, 100% - 48px); + margin-inline: auto; +} + +.mono { + font-family: var(--font-mono); + font-size: 11px; + letter-spacing: 0.16em; + text-transform: uppercase; +} + +/* --- top bar ------------------------------------------------------------ */ + +.topbar { + position: sticky; + top: 0; + z-index: 20; + background: rgba(25, 30, 27, 0.96); + backdrop-filter: blur(8px); + border-bottom: 1px solid var(--chrome-line); + color: var(--chrome-text); +} + +.topbar-inner { + display: flex; + align-items: center; + gap: 18px; + height: 62px; +} + +.brand { + display: flex; + align-items: center; + gap: 10px; + text-decoration: none; + font-family: var(--font-display); + font-weight: 700; + letter-spacing: 0.14em; + font-size: 15px; +} + +.brand img { width: 26px; height: 26px; border-radius: 7px; } + +.topnav { + display: flex; + gap: 22px; + margin-left: auto; + font-size: 13.5px; +} + +.topnav a { + text-decoration: none; + color: var(--chrome-muted); + transition: color 0.15s; +} + +.topnav a:hover { color: var(--chrome-text); } + +.lang { + border: 1px solid var(--chrome-line); + border-radius: 999px; + padding: 5px 11px; + text-decoration: none; + font-size: 11px; + letter-spacing: 0.12em; + color: var(--chrome-muted); +} + +/* --- buttons ------------------------------------------------------------ */ + +.btn { + display: inline-flex; + align-items: center; + gap: 9px; + padding: 13px 22px; + border-radius: 999px; + font-weight: 700; + font-size: 14.5px; + text-decoration: none; + border: 1px solid transparent; + transition: transform 0.12s, background 0.15s, box-shadow 0.15s; +} + +.btn:hover { transform: translateY(-1px); } + +.btn-primary { + background: var(--accent); + color: #fff; + box-shadow: 0 12px 24px -14px rgba(224, 71, 42, 0.9); +} + +.btn-primary:hover { background: var(--accent-deep); } + +.btn-ghost { + border-color: var(--line); + background: var(--surface); + color: var(--ink); +} + +.btn-ghost:hover { border-color: var(--ink-soft); } + +.topbar .btn { + padding: 9px 16px; + font-size: 13px; +} + +/* --- hero --------------------------------------------------------------- */ + +.hero { + position: relative; + padding: 72px 0 56px; + overflow: hidden; + background: + radial-gradient(700px 420px at 12% -10%, rgba(224, 71, 42, 0.10), transparent 70%), + linear-gradient(180deg, var(--paper) 0%, #f4f0e4 100%); +} + +.hero::after { + content: ''; + position: absolute; + inset: 0; + pointer-events: none; + background-image: + linear-gradient(to right, rgba(20, 24, 21, 0.045) 1px, transparent 1px), + linear-gradient(to bottom, rgba(20, 24, 21, 0.045) 1px, transparent 1px); + background-size: 56px 56px; + mask-image: radial-gradient(70% 60% at 50% 30%, #000 30%, transparent 100%); +} + +.hero-grid { + position: relative; + z-index: 1; + display: grid; + grid-template-columns: minmax(0, 1fr) minmax(0, 0.92fr); + gap: 56px; + align-items: center; +} + +.kicker { color: var(--accent); margin-bottom: 18px; } + +h1 { + margin: 0 0 18px; + font-family: var(--font-display); + font-size: clamp(38px, 5.2vw, 62px); + line-height: 1.02; + letter-spacing: -0.02em; +} + +.lead { + margin: 0 0 28px; + max-width: 54ch; + font-size: 17.5px; + color: var(--muted-strong); +} + +.cta-row { + display: flex; + flex-wrap: wrap; + gap: 12px; + align-items: center; +} + +.meta { + margin-top: 20px; + color: var(--muted); + font-family: var(--font-mono); + font-size: 11.5px; + letter-spacing: 0.1em; + text-transform: uppercase; +} + +.hero-shot { + border-radius: var(--radius-lg); + border: 1px solid var(--line); + background: var(--surface); + padding: 10px; + box-shadow: var(--shadow-md); +} + +.hero-shot img { border-radius: 12px; } + +/* --- warning strip ------------------------------------------------------ */ + +.strip { + background: var(--chrome); + color: var(--chrome-text); + border-block: 1px solid var(--chrome-line); +} + +.strip-inner { + display: flex; + align-items: flex-start; + gap: 14px; + padding: 18px 0; + font-size: 14.5px; +} + +.strip b { color: #fff; } +.strip .mark { color: var(--accent); font-size: 18px; line-height: 1.2; } + +/* --- sections ----------------------------------------------------------- */ + +section { padding: 68px 0; } + +.section-head { max-width: 62ch; margin-bottom: 34px; } + +h2 { + margin: 0 0 12px; + font-family: var(--font-display); + font-size: clamp(26px, 3.2vw, 36px); + letter-spacing: -0.01em; + line-height: 1.1; +} + +.section-head p { margin: 0; color: var(--muted-strong); } + +/* tested hardware */ +.tested { + display: grid; + grid-template-columns: 220px minmax(0, 1fr); + gap: 28px; + align-items: start; + padding: 28px; + border: 1px solid var(--line); + border-left: 4px solid var(--warning); + border-radius: var(--radius-md); + background: var(--surface); +} + +.tested .tag { color: var(--warning); } +.tested p { margin: 0 0 10px; color: var(--muted-strong); } +.tested p:last-child { margin-bottom: 0; } + +/* feature grid */ +.cards { + display: grid; + grid-template-columns: repeat(3, minmax(0, 1fr)); + gap: 16px; +} + +.card { + padding: 22px; + border: 1px solid var(--line); + border-radius: var(--radius-md); + background: var(--surface); +} + +.card h3 { + margin: 0 0 8px; + font-family: var(--font-display); + font-size: 17px; + letter-spacing: -0.01em; +} + +.card p { margin: 0; font-size: 14.5px; color: var(--muted-strong); } + +.card .num { + display: block; + margin-bottom: 12px; + font-family: var(--font-mono); + font-size: 11px; + letter-spacing: 0.14em; + color: var(--accent); +} + +/* screenshots */ +.shots { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 16px; +} + +.shot { + border: 1px solid var(--line); + border-radius: var(--radius-md); + background: var(--surface); + padding: 8px; +} + +.shot.wide { grid-column: 1 / -1; } + +.shot img { border-radius: 8px; } + +/* install */ +.install { + display: grid; + grid-template-columns: repeat(3, minmax(0, 1fr)); + gap: 16px; +} + +.step { + padding: 22px; + border-radius: var(--radius-md); + background: var(--surface-raised); + border: 1px solid var(--line); +} + +.step h3 { margin: 6px 0 10px; font-family: var(--font-display); font-size: 17px; } + +.step code { + display: block; + margin: 10px 0; + padding: 10px 12px; + border-radius: 8px; + background: var(--chrome); + color: var(--chrome-text); + font-family: var(--font-mono); + font-size: 12.5px; + overflow-x: auto; + white-space: nowrap; +} + +.step p { margin: 0; font-size: 14px; color: var(--muted-strong); } + +.step a { color: var(--accent-deep); } + +/* safety list */ +.safety { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 14px 28px; + margin: 0; + padding: 0; + list-style: none; +} + +.safety li { + position: relative; + padding-left: 22px; + color: var(--muted-strong); + font-size: 14.5px; +} + +.safety li::before { + content: ''; + position: absolute; + left: 0; + top: 9px; + width: 8px; + height: 8px; + border-radius: 2px; + background: var(--accent); +} + +/* faq */ +.faq details { + border-top: 1px solid var(--line); + padding: 16px 0; +} + +.faq details:last-child { border-bottom: 1px solid var(--line); } + +.faq summary { + cursor: pointer; + font-weight: 700; + font-size: 15.5px; + list-style: none; + display: flex; + justify-content: space-between; + gap: 16px; +} + +.faq summary::-webkit-details-marker { display: none; } +.faq summary::after { content: '+'; color: var(--accent); font-weight: 400; } +.faq details[open] summary::after { content: '−'; } + +.faq p { margin: 10px 0 0; color: var(--muted-strong); font-size: 14.5px; max-width: 78ch; } + +/* seo article */ +.article { background: var(--paper-deep); border-block: 1px solid var(--line); } +.article p { color: var(--muted-strong); max-width: 76ch; } +.article h3 { font-family: var(--font-display); font-size: 18px; margin: 26px 0 8px; } +.article ol { color: var(--muted-strong); max-width: 76ch; padding-left: 20px; } +.article li { margin-bottom: 8px; } + +/* footer */ +footer { + background: var(--chrome); + color: var(--chrome-muted); + padding: 34px 0; + font-size: 13px; +} + +.foot { + display: flex; + flex-wrap: wrap; + gap: 14px 28px; + align-items: center; +} + +.foot .brand { font-size: 13px; color: var(--chrome-text); } +.foot .spacer { margin-left: auto; } +.foot a { text-decoration: none; color: var(--chrome-text); } +.foot a:hover { color: var(--accent); } + +@media (max-width: 980px) { + .hero-grid { grid-template-columns: 1fr; gap: 36px; } + .cards { grid-template-columns: repeat(2, minmax(0, 1fr)); } + .install { grid-template-columns: 1fr; } + .tested { grid-template-columns: 1fr; gap: 12px; } + .topnav { display: none; } +} + +@media (max-width: 680px) { + .cards, + .shots, + .safety { grid-template-columns: 1fr; } + .hero { padding: 44px 0 36px; } + section { padding: 48px 0; } + .wrap { width: min(1180px, 100% - 32px); } + .btn { width: 100%; justify-content: center; } + .topbar .btn { width: auto; } +} + +@media (prefers-reduced-motion: reduce) { + html { scroll-behavior: auto; } + .btn:hover { transform: none; } +} diff --git a/docs/sitemap.xml b/docs/sitemap.xml new file mode 100644 index 0000000..3c7b805 --- /dev/null +++ b/docs/sitemap.xml @@ -0,0 +1,17 @@ + + + + https://datacas.github.io/inkreset/ + + + weekly + 1.0 + + + https://datacas.github.io/inkreset/en/ + + + weekly + 0.8 + + diff --git a/.github/social-preview.png b/docs/social-preview.png similarity index 100% rename from .github/social-preview.png rename to docs/social-preview.png