Serein
Rust로 만든 가볍고 성능 좋은 Discord 전용 네이티브 클라이언트
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기MVP para Shippear 3.0: armá un plan, compartilo por WhatsApp o QR y sumá gente. Puntos canjeables en lugares aliados.
저장소 README에서 가져옴
README 전체를 불러오는 중입니다.
README 전문 보기 ↗MVP armado para Shippear 3.0 (Rosario, 24 de octubre de 2026). Publicás un plan, lo compartís por WhatsApp o con un QR y se suma gente que no conocés pero tiene ganas de lo mismo. Cuando llegás al plan y te encontrás con otra persona del grupo, ganás puntos para canjear por descuentos en negocios asociados.
/e/<código>/pantalla: QR grande y contador de gente anotada que se actualiza solo cada 3 segundos. Cuando empiezan los encuentros, muestra también cuántas personas llegaron y cuántos encuentros hubo.https://planes-mvp.vercel.app/api/mcp, sin cuenta: buscar planes, ver uno y sumarse con nombre y celular. Para crear un plan, Claude devuelve un link a /crear con el formulario completo, y ahí Tiki pide iniciar sesión. La portada tiene un botón Conectar con Claude que abre el formulario de conector de claude.ai con todo cargado. El diseño está en docs/mcp.md.Todos ven todos los planes. La identidad visual sigue el template Next.js boilerplate de v0: fondo casi negro, rojo como color principal, Montserrat en los títulos e Inter en el texto.
Hace falta Node 20 o más nuevo y Docker.
npm install
cp .env.example .env.local
docker compose up -d
npm run db:reset
npm run dev
La app queda en http://localhost:3000.
Para probar el QR con el celular, abrí la app desde la compu con su IP de la red wifi (por ejemplo http://192.168.0.15:3000): el QR y los links usan la misma dirección con la que se abrió la página, así que un celular en la misma wifi los puede abrir. El navegador solo deja usar la cámara con HTTPS o en localhost, así que con la IP de la red el escáner de Llegué no abre: para probar un encuentro así, escaneá el QR con la cámara del teléfono, o usá la versión publicada.
npm run db:reset borra todo y vuelve a cargar los negocios de ejemplo de supabase/seed.sql. Para aplicar migraciones nuevas sin borrar datos: npm run db:migrate.
Con npm run dev andando, npm run test:mcp prueba el MCP con el cliente MCP oficial contra la base local. Para usarlo desde Claude Code: claude mcp add --transport http tiki-local http://localhost:3000/api/mcp.
supabase/migrations, en un esquema app que la API de Supabase no expone: solo el servidor de Next.js accede, con la cadena de conexión. En local corre en Docker y en producción en Supabase.httpOnly y en la base queda solo su hash. El primer navegador que se anota con un número queda vinculado: desde otro navegador esa persona se puede sumar igual, pero no ve ni canjea los puntos. Así nadie usa los puntos de otra persona con solo saber su número.app.accounts), con la contraseña guardada como hash scrypt y sesiones en una cookie httpOnly (en la base, solo el hash del token). La primera vez que organiza, la cuenta se vincula con su teléfono solo si ese número es nuevo o ya se anotó desde el mismo navegador. Después, entrar con la cuenta en otro celular vincula ese celular y le da acceso a sus puntos.app.points_ledger): el saldo es la suma. La llegada a un plan se paga una sola vez (lo asegura un índice único) y cada par de personas se cuenta una sola vez por plan, en app.encounters. Si quien organiza quita a alguien del plan, se le descuenta todo lo que ganó en ese plan. El cupo, el canje y los encuentros bloquean las filas correspondientes, así dos personas no ocupan el último lugar ni gastan el mismo saldo al mismo tiempo./e/<código>/encuentro/<token>. El token tiene el id de la persona, la ventana de 30 segundos en la que se generó y una firma HMAC hecha con ENCOUNTER_SECRET, así que nadie puede armar uno a mano. El servidor acepta solo la ventana actual y la anterior, por eso una captura mandada por WhatsApp vence en menos de un minuto. El encuentro cuenta solo entre dos personas anotadas en el plan, desde 2 horas antes hasta 6 horas después del horario. La cámara se lee en el navegador con BarcodeDetector (Chrome en Android) o con jsQR (Safari en iPhone).src/app/api/mcp y src/lib/mcp), con mcp-handler y Streamable HTTP sin estado. Lee con el rol de Postgres , que solo ve las columnas públicas y no puede escribir; la única escritura es sumarse, con la misma función SQL que la web. Cada pedido queda en (sin nombres ni teléfonos) y pasa por un límite por IP.Con un proyecto de Google Cloud (facturación activada y una API key restringida al dominio de la app) se puede:
src/lib/maps.ts.src/app/api/places/route.ts. El formulario solo habla con esa ruta, así que el cambio queda acotado ahí.npx supabase link y npx supabase db push, o pegando en orden los archivos de supabase/migrations en el SQL Editor. Después, supabase/seed.sql con los negocios reales.DATABASE_URL con la cadena del pooler compartido (aws-1-sa-east-1.pooler.supabase.com:6543; el host db.<proyecto>.supabase.co solo funciona por IPv6 y Vercel no llega), ENCOUNTER_SECRET y MCP_LOG_SECRET con textos largos y aleatorios (en .env.example está el comando para generarlos) y, si hace falta, NEXT_PUBLIC_SITE_URL con la URL pública.tiki_mcp_readerapp.mcp_requests/api/places. El plan muestra un mapa embebido de Google y un botón "Cómo llegar" que abre Google Maps con el recorrido.