Describe un addon en una frase y descárgalo como zip listo para instalar. Es gratis, no requiere cuenta, y cada función global y evento que usa se comprueba con la lista de la API de la compilación 70338 de Forever.
Pregunta a nuestra IA sudorosa y degenerada sobre el creador de addons
Describe tu addon, qué comprobamos, repáralo tras un parche, ejemplos comprobados y más
Cualquier cosa que cubran nuestras guías. Las respuestas salen de esta página y del resto de nuestras guías, con los valores reales en gráficos y las secciones de la guía enlazadas. Es IA, así que comprueba la fuente antes de citarla.
Prueba
Describe tu addon
Gratis. Sin registro. El código es tuyo. ¿Se rompió tras un parche? Pega el error y lo arreglamos.
La creación personalizada está desactivada. Los ocho ejemplos comprobados siguen disponibles para descargar.
Elige un ejemplo o describe tu propia idea.
Tu addon
Aún no se ha probado en el juego. Cliente 1.60.1.70338.
Aviso de IA: creado con WoW Forever Guides Addon Maker (Claude), comprobado con la lista de la API del cliente de Forever.
local ADDON = ...
local NAME = "GuildChatFilter"
local errors = {}
local function safeCall(func)
return xpcall(func, function(err)
errors[#errors + 1] = tostring(err)
if #errors > 10 then table.remove(errors, 1) end
print(NAME .. " error: " .. tostring(err))
end)
end
local function showErrors()
if #errors == 0 then print(NAME .. ": no errors saved") return end
for i = 1, #errors do print(i .. ". " .. errors[i]) end
end
local seen = {}
local function repeatSpam(message)
local now = GetTime()
local count = 0
local kept = {}
for i = 1, #seen do
if now - seen[i].at < 30 then
kept[#kept + 1] = seen[i]
if seen[i].text == message then count = count + 1 end
end
end
kept[#kept + 1] = { text = message, at = now }
seen = kept
return count >= 2
end
local function filter(_, _, message)
if type(message) ~= "string" or message == "" then return false end
local hide = false
safeCall(function() hide = repeatSpam(message) end)
return hide
end
ChatFrame_AddMessageEventFilter("CHAT_MSG_GUILD", filter)
SLASH_GUILDCHATFILTER1 = "/guildfilter"
SlashCmdList["GUILDCHATFILTER"] = function(msg)
if msg == "errors" then showErrors() else print(NAME .. ": hiding guild lines that repeat within 30 seconds") end
end
Hacer brillar los objetos de misión
Muestra los objetos de misión de tus bolsas en una línea dorada. Aquí Forever no permite un brillo seguro en el botón de la bolsa, así que la lista sirve de señal.
Sin errores del comprobador. Aún no se ha probado en el juego. Cliente 1.60.1.70338.
local ADDON = ...
local NAME = "QuestItemSparkle"
local errors = {}
local function safeCall(func)
return xpcall(func, function(err)
errors[#errors + 1] = tostring(err)
if #errors > 10 then table.remove(errors, 1) end
print(NAME .. " error: " .. tostring(err))
end)
end
local function showErrors()
if #errors == 0 then print(NAME .. ": no errors saved") return end
for i = 1, #errors do print(i .. ". " .. errors[i]) end
end
local frame = CreateFrame("Frame", "QuestItemSparkleFrame", UIParent)
frame:SetSize(240, 72)
frame:SetPoint("CENTER", UIParent, "CENTER", 0, 160)
frame:SetMovable(true)
frame:EnableMouse(true)
frame:RegisterForDrag("LeftButton")
frame:SetScript("OnDragStart", function(self) self:StartMoving() end)
frame:SetScript("OnDragStop", function(self) self:StopMovingOrSizing() end)
local label = frame:CreateFontString(nil, "OVERLAY", "GameFontNormal")
label:SetPoint("CENTER")
label:SetText("QuestItemSparkleFrame")
local function scan()
local lines = {}
for bag = 0, 4 do
local slots = C_Container.GetContainerNumSlots(bag) or 0
for slot = 1, slots do
local isQuest = C_Container.GetContainerItemQuestInfo(bag, slot)
if isQuest then
local info = C_Container.GetContainerItemInfo(bag, slot)
local name = info and info.itemID and C_Item.GetItemInfo(info.itemID) or nil
lines[#lines + 1] = name or "Quest item"
end
end
end
if #lines == 0 then label:SetText("No quest items in your bags")
else label:SetText(table.concat(lines, "\n")) end
end
frame:RegisterEvent("BAG_UPDATE")
frame:RegisterEvent("PLAYER_LOGIN")
frame:SetScript("OnEvent", function() safeCall(scan) end)
SLASH_QUESTITEMSPARKLE1 = "/questitems"
SlashCmdList["QUESTITEMSPARKLE"] = function(msg)
if msg == "errors" then showErrors() else scan() end
end
Rechazar automáticamente invitaciones a grupo
Rechaza una invitación a grupo cuando llega. Desactívalo con /declineinvites off.
Sin errores del comprobador. Aún no se ha probado en el juego. Cliente 1.60.1.70338.
local ADDON = ...
local NAME = "DeclineInvites"
local errors = {}
local function safeCall(func)
return xpcall(func, function(err)
errors[#errors + 1] = tostring(err)
if #errors > 10 then table.remove(errors, 1) end
print(NAME .. " error: " .. tostring(err))
end)
end
local function showErrors()
if #errors == 0 then print(NAME .. ": no errors saved") return end
for i = 1, #errors do print(i .. ". " .. errors[i]) end
end
local on = true
local frame = CreateFrame("Frame")
frame:RegisterEvent("PARTY_INVITE_REQUEST")
frame:SetScript("OnEvent", function()
if not on then return end
safeCall(function()
DeclineGroup()
StaticPopup_Hide("PARTY_INVITE")
print(NAME .. ": declined a party invite")
end)
end)
SLASH_DECLINEINVITES1 = "/declineinvites"
SlashCmdList["DECLINEINVITES"] = function(msg)
if msg == "errors" then showErrors() return end
if msg == "off" then on = false print(NAME .. ": off") return end
on = true
print(NAME .. ": on")
end
Contar todos los monstruos que he matado
Cuenta las bajas del grupo con este personaje, incluidas las que no dan PE y las realizadas en grupo. Los recuentos se conservan en SavedVariables.
Sin errores del comprobador. Aún no se ha probado en el juego. Cliente 1.60.1.70338.
## Interface: 16001
## Title: Local Kill Count
## Notes: Local kill counts. No mob database.
## Author: You
## Version: 1.0.0
## X-Generator: WoW Forever Guides Addon Maker
## X-License: CC0 (public domain)
## SavedVariables: LocalKillCountDB
LocalKillCount.lua
LocalKillCount/LocalKillCount.lua
local ADDON = ...
local NAME = "LocalKillCount"
local errors = {}
local function safeCall(func)
return xpcall(func, function(err)
errors[#errors + 1] = tostring(err)
if #errors > 10 then table.remove(errors, 1) end
print(NAME .. " error: " .. tostring(err))
end)
end
local function showErrors()
if #errors == 0 then print(NAME .. ": no errors saved") return end
for i = 1, #errors do print(i .. ". " .. errors[i]) end
end
LocalKillCountDB = LocalKillCountDB or { total = 0, xp = 0, gray = 0, grouped = 0 }
local function bump(key)
LocalKillCountDB[key] = (LocalKillCountDB[key] or 0) + 1
end
local frame = CreateFrame("Frame")
frame:RegisterEvent("PARTY_KILL")
frame:SetScript("OnEvent", function()
safeCall(function()
local before = UnitXP("player")
local grouped = IsInGroup()
C_Timer.After(0.5, function()
safeCall(function()
bump("total")
if grouped then bump("grouped") end
local after = UnitXP("player")
if issecretvalue(before) then return end
if issecretvalue(after) then return end
if after == before then bump("gray") else bump("xp") end
end)
end)
end)
end)
local function report()
local db = LocalKillCountDB
print(NAME .. ": " .. (db.total or 0) .. " kills, " .. (db.xp or 0) .. " with XP, " .. (db.gray or 0) .. " with no XP, " .. (db.grouped or 0) .. " while grouped")
end
SLASH_LOCALKILLCOUNT1 = "/kills"
SlashCmdList["LOCALKILLCOUNT"] = function(msg)
if msg == "errors" then showErrors() else report() end
end
Precio de venta en cada descripción emergente
Añade el precio de venta al vendedor a la descripción emergente de un objeto, o una línea que indica que el precio aún no se ha cargado.
Sin errores del comprobador. Aún no se ha probado en el juego. Cliente 1.60.1.70338.
local ADDON = ...
local NAME = "VendorPriceTip"
local errors = {}
local function safeCall(func)
return xpcall(func, function(err)
errors[#errors + 1] = tostring(err)
if #errors > 10 then table.remove(errors, 1) end
print(NAME .. " error: " .. tostring(err))
end)
end
local function showErrors()
if #errors == 0 then print(NAME .. ": no errors saved") return end
for i = 1, #errors do print(i .. ". " .. errors[i]) end
end
local function coins(copper)
if type(copper) ~= "number" or copper <= 0 then return nil end
local gold = math.floor(copper / 10000)
local silver = math.floor((copper % 10000) / 100)
local rest = copper % 100
return gold .. "g " .. silver .. "s " .. rest .. "c"
end
local function addPrice(tip)
safeCall(function()
local _, link = tip:GetItem()
if not link then return end
local sell = select(11, C_Item.GetItemInfo(link))
local line = coins(sell)
if not line then
C_Item.RequestLoadItemDataByID(link)
line = "Vendor price not loaded"
end
tip:AddLine(line, 1, 0.82, 0.45)
end)
end
GameTooltip:HookScript("OnTooltipSetItem", addPrice)
if TooltipDataProcessor and TooltipDataProcessor.AddTooltipPostCall and Enum and Enum.TooltipDataType and Enum.TooltipDataType.Item then
TooltipDataProcessor.AddTooltipPostCall(Enum.TooltipDataType.Item, addPrice)
end
SLASH_VENDORPRICETIP1 = "/vendorprice"
SlashCmdList["VENDORPRICETIP"] = function(msg)
if msg == "errors" then showErrors() else print(NAME .. ": vendor price is added to item tooltips") end
end
PE por hora y tiempo hasta el siguiente nivel
Muestra los PE por hora y un tiempo aproximado hasta subir de nivel. El tiempo inactivo y un nivel recién alcanzado no provocan divisiones por cero.
Sin errores del comprobador. Aún no se ha probado en el juego. Cliente 1.60.1.70338.
## Interface: 16001
## Title: XP Per Hour
## Notes: XP per hour and time to level.
## Author: You
## Version: 1.0.0
## X-Generator: WoW Forever Guides Addon Maker
## X-License: CC0 (public domain)
XpPerHour.lua
XpPerHour/XpPerHour.lua
local ADDON = ...
local NAME = "XpPerHour"
local errors = {}
local function safeCall(func)
return xpcall(func, function(err)
errors[#errors + 1] = tostring(err)
if #errors > 10 then table.remove(errors, 1) end
print(NAME .. " error: " .. tostring(err))
end)
end
local function showErrors()
if #errors == 0 then print(NAME .. ": no errors saved") return end
for i = 1, #errors do print(i .. ". " .. errors[i]) end
end
local frame = CreateFrame("Frame", "XpPerHourFrame", UIParent)
frame:SetSize(240, 72)
frame:SetPoint("CENTER", UIParent, "CENTER", 0, 160)
frame:SetMovable(true)
frame:EnableMouse(true)
frame:RegisterForDrag("LeftButton")
frame:SetScript("OnDragStart", function(self) self:StartMoving() end)
frame:SetScript("OnDragStop", function(self) self:StopMovingOrSizing() end)
local label = frame:CreateFontString(nil, "OVERLAY", "GameFontNormal")
label:SetPoint("CENTER")
label:SetText("XpPerHourFrame")
local state = { start = nil, xp = nil, last = nil }
local function paint(now)
local xp = UnitXP("player")
local maxXp = UnitXPMax("player")
if issecretvalue(xp) then label:SetText("XP is hidden right now") return end
if issecretvalue(maxXp) then label:SetText("XP is hidden right now") return end
if not state.start or not state.xp then
state.start = now
state.xp = xp
state.last = now
label:SetText("Waiting for XP")
return
end
if now - state.last > 120 then label:SetText("Idle. No recent XP.") return end
local gained = xp - state.xp
local elapsed = now - state.start
if gained <= 0 or elapsed < 1 then label:SetText("Waiting for XP") return end
local perHour = gained / elapsed * 3600
if perHour <= 0 then label:SetText("Waiting for XP") return end
local remain = maxXp - xp
if remain < 0 then remain = 0 end
local minutes = math.floor(remain / perHour * 60)
label:SetText(math.floor(perHour) .. " XP/hour, about " .. minutes .. " min")
end
local elapsed = 0
frame:SetScript("OnUpdate", function(_, gap)
elapsed = elapsed + gap
if elapsed < 1 then return end
elapsed = 0
safeCall(function() paint(GetTime()) end)
end)
frame:RegisterEvent("PLAYER_XP_UPDATE")
frame:RegisterEvent("PLAYER_LEVEL_UP")
frame:SetScript("OnEvent", function(_, event)
safeCall(function()
if event == "PLAYER_LEVEL_UP" then state.start = nil state.xp = nil state.last = nil end
if event == "PLAYER_XP_UPDATE" then state.last = GetTime() end
paint(GetTime())
end)
end)
SLASH_XPPERHOUR1 = "/xphour"
SlashCmdList["XPPERHOUR"] = function(msg)
if msg == "errors" then showErrors() else paint(GetTime()) print(NAME .. ": " .. (label:GetText() or "")) end
end
frame:Show()
Avísame cuando pierda mi buff
Fuera de combate, muestra el nombre del buff que configures cuando no lo tienes. Permanece oculto en combate.
Sin errores del comprobador. Aún no se ha probado en el juego. Cliente 1.60.1.70338.
## Interface: 16001
## Title: Buff Reminder
## Notes: Out-of-combat reminder when one buff is missing.
## Author: You
## Version: 1.0.0
## X-Generator: WoW Forever Guides Addon Maker
## X-License: CC0 (public domain)
## SavedVariables: BuffReminderDB
BuffReminder.lua
BuffReminder/BuffReminder.lua
local ADDON = ...
local NAME = "BuffReminder"
local errors = {}
local function safeCall(func)
return xpcall(func, function(err)
errors[#errors + 1] = tostring(err)
if #errors > 10 then table.remove(errors, 1) end
print(NAME .. " error: " .. tostring(err))
end)
end
local function showErrors()
if #errors == 0 then print(NAME .. ": no errors saved") return end
for i = 1, #errors do print(i .. ". " .. errors[i]) end
end
local frame = CreateFrame("Frame", "BuffReminderFrame", UIParent)
frame:SetSize(240, 72)
frame:SetPoint("CENTER", UIParent, "CENTER", 0, 160)
frame:SetMovable(true)
frame:EnableMouse(true)
frame:RegisterForDrag("LeftButton")
frame:SetScript("OnDragStart", function(self) self:StartMoving() end)
frame:SetScript("OnDragStop", function(self) self:StopMovingOrSizing() end)
local label = frame:CreateFontString(nil, "OVERLAY", "GameFontNormal")
label:SetPoint("CENTER")
label:SetText("BuffReminderFrame")
BuffReminderDB = BuffReminderDB or { spell = "" }
frame:Hide()
local function remind()
if InCombatLockdown() or UnitAffectingCombat("player") then frame:Hide() return end
local spell = BuffReminderDB.spell or ""
if spell == "" then frame:Hide() return end
local aura = C_UnitAuras.GetAuraDataBySpellName("player", spell, "HELPFUL")
if issecretvalue(aura) then frame:Hide() return end
if aura then frame:Hide() return end
label:SetText("Buff down: " .. spell)
frame:Show()
end
frame:RegisterEvent("UNIT_AURA")
frame:RegisterUnitEvent("UNIT_AURA", "player")
frame:RegisterEvent("PLAYER_REGEN_DISABLED")
frame:RegisterEvent("PLAYER_REGEN_ENABLED")
frame:SetScript("OnEvent", function() safeCall(remind) end)
SLASH_BUFFREMINDER1 = "/buffremind"
SlashCmdList["BUFFREMINDER"] = function(msg)
if msg == "errors" then showErrors() return end
if msg == "" then print(NAME .. ": /buffremind Spell Name") return end
BuffReminderDB.spell = msg
print(NAME .. ": watching " .. msg)
remind()
end
Lista de preparación de banda para mi hermandad
Una lista personal que marcas antes de una banda. No lee la lista de miembros de la hermandad.
Sin errores del comprobador. Aún no se ha probado en el juego. Cliente 1.60.1.70338.
## Interface: 16001
## Title: Raid Prep List
## Notes: A personal raid prep checklist.
## Author: You
## Version: 1.0.0
## X-Generator: WoW Forever Guides Addon Maker
## X-License: CC0 (public domain)
## SavedVariables: RaidPrepDB
RaidPrepList.lua
RaidPrepList/RaidPrepList.lua
local ADDON = ...
local NAME = "RaidPrepList"
local errors = {}
local function safeCall(func)
return xpcall(func, function(err)
errors[#errors + 1] = tostring(err)
if #errors > 10 then table.remove(errors, 1) end
print(NAME .. " error: " .. tostring(err))
end)
end
local function showErrors()
if #errors == 0 then print(NAME .. ": no errors saved") return end
for i = 1, #errors do print(i .. ". " .. errors[i]) end
end
local frame = CreateFrame("Frame", "RaidPrepFrame", UIParent)
frame:SetSize(240, 72)
frame:SetPoint("CENTER", UIParent, "CENTER", 0, 160)
frame:SetMovable(true)
frame:EnableMouse(true)
frame:RegisterForDrag("LeftButton")
frame:SetScript("OnDragStart", function(self) self:StartMoving() end)
frame:SetScript("OnDragStop", function(self) self:StopMovingOrSizing() end)
local label = frame:CreateFontString(nil, "OVERLAY", "GameFontNormal")
label:SetPoint("CENTER")
label:SetText("RaidPrepFrame")
RaidPrepDB = RaidPrepDB or { items = { "Food", "Water", "Flasks", "Repair" }, done = {} }
local function line()
local parts = {}
for i = 1, #RaidPrepDB.items do
local item = RaidPrepDB.items[i]
local mark = RaidPrepDB.done[item] and "[x] " or "[ ] "
parts[#parts + 1] = mark .. item
end
if #parts == 0 then label:SetText("Checklist is empty") else label:SetText(table.concat(parts, "\n")) end
end
frame:SetScript("OnMouseUp", function()
safeCall(function()
if #RaidPrepDB.items == 0 then return end
local item = RaidPrepDB.items[1]
for i = 1, #RaidPrepDB.items do
if not RaidPrepDB.done[RaidPrepDB.items[i]] then item = RaidPrepDB.items[i] break end
end
RaidPrepDB.done[item] = not RaidPrepDB.done[item]
line()
end)
end)
line()
SLASH_RAIDPREPLIST1 = "/raidprep"
SlashCmdList["RAIDPREPLIST"] = function(msg)
if msg == "errors" then showErrors() return end
local add = msg:match("^add%s+(.+)$")
if add then
RaidPrepDB.items[#RaidPrepDB.items + 1] = add
line()
print(NAME .. ": added " .. add)
return
end
if msg == "reset" then RaidPrepDB.done = {} line() print(NAME .. ": cleared") return end
line()
print(NAME .. ": click the box to tick the next open line")
end
La creación personalizada está desactivada. Los ejemplos comprobados siguen disponibles para descargar.
El creador ha alcanzado su límite por ahora. Los ejemplos comprobados siguen disponibles para descargar.
Has agotado las creaciones o cambios de hoy. Los ejemplos comprobados siguen disponibles para descargar.
No se superó la comprobación. Inténtalo de nuevo. Los ejemplos siguen disponibles para descargar.
La creación personalizada no está configurada en este servidor. Los ejemplos siguen disponibles para descargar.
El creador no terminó. Tu descripción sigue en el cuadro.
Esa creación tardó demasiado y se detuvo. Tu descripción sigue en el cuadro.
Se perdió la conexión. Tu descripción y el último addon válido siguen aquí.
Detenido. Tu descripción sigue en el cuadro.
Ese enlace ha caducado o se ha eliminado la copia guardada.
Este navegador no guardó ese addon, así que no puede modificarlo.
Actualiza la página e inténtalo desde wowforeverguides.com.
Esa solicitud no era válida. Usa una frase corta e inténtalo de nuevo.
La creación personalizada necesita el script de verificación. Los ejemplos siguen disponibles para descargar.
Creando. Puede tardar un minuto.
Comprobando archivos y reparando problemas.
Guardado en este navegador durante 90 días. Cualquiera que tenga el enlace para compartir puede leer la última copia.
Este navegador ha bloqueado el almacenamiento. La clave de propietario solo dura en esta pestaña y este addon no se guarda.
No se pudo guardar la lista de este navegador.
Copiado.
Selecciona el código y cópialo manualmente.
La copia guardada se ha eliminado.
Eliminarlo
Enlace para compartir copiado. No incluye tu clave de propietario.
La última comprobación falló, así que no hay descarga. La copia válida anterior no cambia.
Esa solicitud fue rechazada.
Una pregunta antes de crear.
Ya existe un addon publicado que hace esto.
Addon compartido. Solo lectura.
Los cambios y reparaciones se aplican a una creación guardada. Describe tu propio addon para obtener una.
Ejemplo comprobado. Aún no se ha probado en el juego.
Los addons pueden mostrar información que el cliente ya te proporciona. No pueden jugar por ti.Blizzard: Developer Q&A, 17 de septiembre de 2026. Las listas siguientes corresponden a lo que hacen los ocho ejemplos. Lee qué funciona y qué falla antes de depender de uno.
Qué pueden y qué no pueden hacer los addons
Pueden:
Notas y listas de comprobación
Líneas en descripciones emergentes
Marcadores del mapa y minimapa
Ayudas para bolsas y vendedores
Filtros de chat
Sonidos
Seguimiento fuera de combate
No pueden:
Lanzar un hechizo automáticamente
Seleccionar una unidad automáticamente
Mover tu personaje automáticamente
Leer valores de combate ocultos
Analizar el registro de combate
Instalación en cinco pasos
La estructura de carpetas es la misma que en instalar addons.
Descarga el zip.
Abre tu carpeta AddOns.
Descomprímelo en su propia carpeta.
Actívalo en la pantalla de personajes.
Escribe /reload si no aparece.
Preguntas frecuentes
¿Es gratis?
Sí. Los límites diarios permiten que sea gratis para todos. Los ocho ejemplos se descargan sin cuenta.
¿Necesito saber Lua?
No. Puedes leer todos los archivos si quieres. Cada ejemplo consta de un archivo .toc y uno .lua.
¿Es seguro el código de addons escrito por IA?
Una creación personalizada no contiene llamadas de red, y puedes leer el código fuente. El comprobador compara cada función global y evento con la lista de la API de la compilación 70338 de Forever y con la política de addons de Blizzard, y avisa sobre métodos de widgets que no puede confirmar. Esto no garantiza que el addon sea seguro en combate, y ninguno de estos archivos se ha probado aún en el juego.
¿Se permiten addons en WoW Forever?
Sí, con la API moderna y los límites de combate de Midnight. La página de addons recoge la respuesta del 17 de septiembre.
¿Por qué no puede crear un addon de rotación o lanzamiento automático?
El creador no genera automatización de combate ni código que intente eludir acciones protegidas, que el juego bloquea. Comprueba cada creación con la política de addons de interfaz de Blizzard. Pide una nota, una lista, una línea de descripción emergente o un recordatorio fuera de combate.
¿Funciona WeakAuras en Forever?
Wowhead escribió que WeakAuras dejó de desarrollarse antes de los cambios de addons de Midnight. Otro autor publicó una bifurcación, y Musca Auras publica un archivo para Forever. Blizzard no ha dicho que WeakAuras en sí funcione. La página de addons recoge esos informes.
¿Puedo compartir o publicar mi addon?
Sí. Los archivos de ejemplo son de dominio público, CC0. Úsalos, modifícalos y publícalos. No es necesario dar crédito. Pega esta línea cuando un sitio pida un aviso de uso de IA. Aviso de IA: creado con WoW Forever Guides Addon Maker (Claude), comprobado con la lista de la API del cliente de Forever.
¿Y si falla tras un parche?
Pega el error en Reparar. Si la copia nueva no supera la comprobación, se conserva la última copia válida y no se ofrece la descarga de la fallida.
¿Qué IA lo escribe?
Claude, de Anthropic, escribe un borrador personalizado. Después, nuestro comprobador comprueba cada función global y evento con la lista de la API de la compilación 70338 y señala los métodos de widgets que no puede confirmar. Aún no se ha probado nada en el juego, así que lee los archivos antes de depender de uno.
¿Qué almacenáis?
Los proyectos guardados contienen tu petición y tus archivos. Está prevista su eliminación 90 días después de su último cambio. Eliminar usa la clave del propietario para borrar un proyecto guardado y todas sus versiones.
La página de privacidad explica el acceso mediante enlaces para compartir, el almacenamiento del navegador y la conservación independiente de la caché y del proveedor.
Los nombres y eventos se comprueban con el cliente 1.60.1.70338. Estos archivos no se han probado en el juego.
¿Tiras por la analítica? Necesidad = Clicky, GA4 y Microsoft Clarity con cookies y repeticiones de sesión, para ver qué guías ayudan. Pasar = ninguna analítica.Privacidad