mirror of
https://github.com/fmhy/edit.git
synced 2025-08-01 00:32:30 +10:00
m9ve website code outsidr
This commit is contained in:
parent
15a56af368
commit
df4eecc405
87 changed files with 3108 additions and 59 deletions
14
website/LICENSE
Normal file
14
website/LICENSE
Normal file
|
@ -0,0 +1,14 @@
|
|||
Copyright (c) taskylizard. Apache License 2.0
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
3
website/README.md
Normal file
3
website/README.md
Normal file
|
@ -0,0 +1,3 @@
|
|||
This is the website source code to be used with [VitePress](https://vitepress.dev/).
|
||||
|
||||
Licensed under the Apache License v2.0, see [LICENSE](./LICENSE) for more information.
|
BIN
website/fonts/Inter-Bold.otf
Normal file
BIN
website/fonts/Inter-Bold.otf
Normal file
Binary file not shown.
BIN
website/fonts/Inter-Medium.otf
Normal file
BIN
website/fonts/Inter-Medium.otf
Normal file
Binary file not shown.
BIN
website/fonts/Inter-Regular.otf
Normal file
BIN
website/fonts/Inter-Regular.otf
Normal file
Binary file not shown.
BIN
website/fonts/Inter-SemiBold.otf
Normal file
BIN
website/fonts/Inter-SemiBold.otf
Normal file
Binary file not shown.
43
website/hooks/Template.vue
Normal file
43
website/hooks/Template.vue
Normal file
|
@ -0,0 +1,43 @@
|
|||
<script setup lang="ts">
|
||||
defineProps<{ title: string; description?: string }>()
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<span
|
||||
tw="w-full h-full bg-black flex flex-col"
|
||||
style="
|
||||
background-image: linear-gradient(
|
||||
43deg,
|
||||
#b794f4 2%,
|
||||
#b18df2 7.5%,
|
||||
#ab87ef 13%,
|
||||
#9f7aea 24%,
|
||||
#8c6ee2 32%,
|
||||
#7864d8 40%,
|
||||
#4c51bf 56%,
|
||||
#4949ae 60.5%,
|
||||
#46419b 65%,
|
||||
#3c366b 74%,
|
||||
#2f315d 80.5%,
|
||||
#272d47 87%,
|
||||
#1a202c 100%
|
||||
);
|
||||
"
|
||||
>
|
||||
<span
|
||||
tw="p-10 w-full min-h-0 grow flex flex-col items-center justify-between"
|
||||
>
|
||||
<span tw="w-full flex justify-between items-center text-5xl font-medium">
|
||||
<span tw="flex items-center">
|
||||
<span tw="text-zinc-100 ml-2 mt-1 font-semibold">
|
||||
freemediaheckyeah
|
||||
</span>
|
||||
</span>
|
||||
</span>
|
||||
<span tw="w-full pr-56 flex flex-col items-start justify-end">
|
||||
<span style="color: #f3f4f6" tw="text-6xl font-bold" v-html="title" />
|
||||
<span style="color: #c0caf5" tw="mt-2 text-4xl" v-html="description" />
|
||||
</span>
|
||||
</span>
|
||||
</span>
|
||||
</template>
|
23
website/hooks/index.ts
Normal file
23
website/hooks/index.ts
Normal file
|
@ -0,0 +1,23 @@
|
|||
/**
|
||||
* Copyright (c) 2025 taskylizard. Apache License 2.0.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
/**
|
||||
* Barrel generated using @taskylizard/tasker.
|
||||
*/
|
||||
|
||||
export * from './meta'
|
||||
export * from './opengraph'
|
||||
export * from './rss'
|
||||
export * from './satoriConfig'
|
124
website/hooks/meta.ts
Normal file
124
website/hooks/meta.ts
Normal file
|
@ -0,0 +1,124 @@
|
|||
/**
|
||||
* Copyright (c) 2025 taskylizard. Apache License 2.0.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
import type { HeadConfig, TransformContext } from 'vitepress'
|
||||
|
||||
export function generateMeta(context: TransformContext, hostname: string) {
|
||||
const head: HeadConfig[] = []
|
||||
const { pageData } = context
|
||||
|
||||
if (pageData.isNotFound) return head
|
||||
if (Object.keys(pageData.frontmatter).length === 0) return head
|
||||
|
||||
const url = `${hostname}/${pageData.relativePath.replace(/((^|\/)index)?\.md$/, '$2')}`
|
||||
|
||||
head.push(
|
||||
['link', { rel: 'canonical', href: url }],
|
||||
['meta', { property: 'og:url', content: url }],
|
||||
['meta', { name: 'twitter:url', content: url }],
|
||||
['meta', { name: 'twitter:card', content: 'summary_large_image' }],
|
||||
['meta', { property: 'og:title', content: pageData.frontmatter.title }],
|
||||
['meta', { name: 'twitter:title', content: pageData.frontmatter.title }]
|
||||
)
|
||||
|
||||
if (pageData.frontmatter.description) {
|
||||
head.push(
|
||||
[
|
||||
'meta',
|
||||
{
|
||||
property: 'og:description',
|
||||
content: pageData.frontmatter.description
|
||||
}
|
||||
],
|
||||
[
|
||||
'meta',
|
||||
{
|
||||
name: 'twitter:description',
|
||||
content: pageData.frontmatter.description
|
||||
}
|
||||
]
|
||||
)
|
||||
}
|
||||
|
||||
if (pageData.frontmatter.image) {
|
||||
head.push([
|
||||
'meta',
|
||||
{
|
||||
property: 'og:image',
|
||||
content: `${hostname}/${pageData.frontmatter.image.replace(/^\//, '')}`
|
||||
}
|
||||
])
|
||||
head.push([
|
||||
'meta',
|
||||
{
|
||||
name: 'twitter:image',
|
||||
content: `${hostname}/${pageData.frontmatter.image.replace(/^\//, '')}`
|
||||
}
|
||||
])
|
||||
} else {
|
||||
const url = pageData.filePath.replace('index.md', '').replace('.md', '')
|
||||
const imageUrl = `${url}/__og_image__/og.png`
|
||||
.replaceAll('//', '/')
|
||||
.replace(/^\//, '')
|
||||
|
||||
head.push(
|
||||
['meta', { property: 'og:image', content: `${hostname}/${imageUrl}` }],
|
||||
['meta', { property: 'og:image:width', content: '1200' }],
|
||||
['meta', { property: 'og:image:height', content: '628' }],
|
||||
['meta', { property: 'og:image:type', content: 'image/png' }],
|
||||
[
|
||||
'meta',
|
||||
{ property: 'og:image:alt', content: pageData.frontmatter.title }
|
||||
],
|
||||
['meta', { name: 'twitter:image', content: `${hostname}/${imageUrl}` }],
|
||||
['meta', { name: 'twitter:image:width', content: '1200' }],
|
||||
['meta', { name: 'twitter:image:height', content: '628' }],
|
||||
[
|
||||
'meta',
|
||||
{ name: 'twitter:image:alt', content: pageData.frontmatter.title }
|
||||
]
|
||||
)
|
||||
}
|
||||
|
||||
if (pageData.frontmatter.tag) {
|
||||
head.push([
|
||||
'meta',
|
||||
{ property: 'article:tag', content: pageData.frontmatter.tag }
|
||||
])
|
||||
}
|
||||
|
||||
if (pageData.frontmatter.date) {
|
||||
head.push([
|
||||
'meta',
|
||||
{
|
||||
property: 'article:published_time',
|
||||
content: pageData.frontmatter.date
|
||||
}
|
||||
])
|
||||
}
|
||||
|
||||
if (pageData.lastUpdated && pageData.frontmatter.lastUpdated !== false) {
|
||||
head.push([
|
||||
'meta',
|
||||
{
|
||||
property: 'article:modified_time',
|
||||
content: new Date(pageData.lastUpdated).toISOString()
|
||||
}
|
||||
])
|
||||
}
|
||||
|
||||
return head
|
||||
}
|
141
website/hooks/opengraph.ts
Normal file
141
website/hooks/opengraph.ts
Normal file
|
@ -0,0 +1,141 @@
|
|||
/**
|
||||
* Copyright (c) 2025 taskylizard. Apache License 2.0.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
import type { ContentData, SiteConfig } from 'vitepress'
|
||||
import type { SatoriOptions } from 'x-satori/vue'
|
||||
import { mkdir, readFile, writeFile } from 'node:fs/promises'
|
||||
import { dirname, resolve } from 'node:path'
|
||||
import { fileURLToPath } from 'node:url'
|
||||
import { renderAsync } from '@resvg/resvg-js'
|
||||
import consola from 'consola'
|
||||
import { createContentLoader } from 'vitepress'
|
||||
import { satoriVue } from 'x-satori/vue'
|
||||
import { headers } from '../transformer/constants'
|
||||
|
||||
const __dirname = dirname(fileURLToPath(import.meta.url))
|
||||
const __fonts = resolve(__dirname, '../fonts')
|
||||
|
||||
export async function generateImages(config: SiteConfig) {
|
||||
const pages = await createContentLoader('**/*.md', { excerpt: true }).load()
|
||||
const template = await readFile(resolve(__dirname, './Template.vue'), 'utf-8')
|
||||
|
||||
const fonts: SatoriOptions['fonts'] = [
|
||||
{
|
||||
name: 'Inter',
|
||||
data: await readFile(resolve(__fonts, 'Inter-Regular.otf')),
|
||||
weight: 400,
|
||||
style: 'normal'
|
||||
},
|
||||
{
|
||||
name: 'Inter',
|
||||
data: await readFile(resolve(__fonts, 'Inter-Medium.otf')),
|
||||
weight: 500,
|
||||
style: 'normal'
|
||||
},
|
||||
{
|
||||
name: 'Inter',
|
||||
data: await readFile(resolve(__fonts, 'Inter-SemiBold.otf')),
|
||||
weight: 600,
|
||||
style: 'normal'
|
||||
},
|
||||
{
|
||||
name: 'Inter',
|
||||
data: await readFile(resolve(__fonts, 'Inter-Bold.otf')),
|
||||
weight: 700,
|
||||
style: 'normal'
|
||||
}
|
||||
]
|
||||
|
||||
for (const page of pages) {
|
||||
await generateImage({
|
||||
page,
|
||||
template,
|
||||
outDir: config.outDir,
|
||||
fonts
|
||||
})
|
||||
}
|
||||
return consola.info('Generated opengraph images.')
|
||||
}
|
||||
|
||||
interface GenerateImagesOptions {
|
||||
page: ContentData
|
||||
template: string
|
||||
outDir: string
|
||||
fonts: SatoriOptions['fonts']
|
||||
}
|
||||
|
||||
async function generateImage({
|
||||
page,
|
||||
template,
|
||||
outDir,
|
||||
fonts
|
||||
}: GenerateImagesOptions) {
|
||||
const { frontmatter, url } = page
|
||||
|
||||
const _page = getPage(url)
|
||||
const title =
|
||||
frontmatter.layout === 'home'
|
||||
? (frontmatter.hero.name ?? frontmatter.title)
|
||||
: frontmatter.title
|
||||
? frontmatter.title
|
||||
: _page?.title
|
||||
|
||||
const description =
|
||||
frontmatter.layout === 'home'
|
||||
? (frontmatter.hero.tagline ?? frontmatter.description)
|
||||
: frontmatter.description
|
||||
? frontmatter.description
|
||||
: _page?.description
|
||||
|
||||
// consola.info(url, title, description)
|
||||
const options: SatoriOptions = {
|
||||
width: 1200,
|
||||
height: 628,
|
||||
fonts,
|
||||
props: {
|
||||
title,
|
||||
description
|
||||
}
|
||||
}
|
||||
|
||||
const svg = await satoriVue(options, template)
|
||||
|
||||
const render = await renderAsync(svg)
|
||||
|
||||
const outputFolder = resolve(outDir, url.slice(1), '__og_image__')
|
||||
const outputFile = resolve(outputFolder, 'og.png')
|
||||
|
||||
await mkdir(outputFolder, { recursive: true })
|
||||
|
||||
await writeFile(outputFile, render.asPng())
|
||||
}
|
||||
|
||||
function getPage(page: string) {
|
||||
// Get the page name
|
||||
const pageName = `${page}.md`.slice(1).split('/').at(-1)
|
||||
|
||||
// Find the header
|
||||
// TODO: This is a hacky way to find the header
|
||||
const header = Object.entries(headers).find(([key]) => key === pageName)
|
||||
if (!header) return
|
||||
|
||||
const { title, description } = header[1]
|
||||
|
||||
return {
|
||||
title,
|
||||
description
|
||||
}
|
||||
}
|
64
website/hooks/rss.ts
Normal file
64
website/hooks/rss.ts
Normal file
|
@ -0,0 +1,64 @@
|
|||
/**
|
||||
* Copyright (c) 2025 taskylizard. Apache License 2.0.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
import type { ContentData, SiteConfig } from 'vitepress'
|
||||
import { writeFileSync } from 'node:fs'
|
||||
import path from 'node:path'
|
||||
import consola from 'consola'
|
||||
import { Feed } from 'feed'
|
||||
import { createContentLoader } from 'vitepress'
|
||||
|
||||
export async function generateFeed(
|
||||
meta: { hostname: string; description: string },
|
||||
config: SiteConfig
|
||||
) {
|
||||
const feed: Feed = new Feed({
|
||||
id: meta.hostname,
|
||||
link: meta.hostname,
|
||||
title: 'FMHY blog',
|
||||
description: meta.description,
|
||||
language: 'en-US',
|
||||
image: 'https://github.com/fmhy.png',
|
||||
favicon: `${meta.hostname}/favicon.ico`,
|
||||
copyright: 'Copyright (c) 2023-present FMHY'
|
||||
})
|
||||
|
||||
const posts: ContentData[] = await createContentLoader('posts/*.md', {
|
||||
excerpt: true,
|
||||
render: true,
|
||||
transform: (rawData) => {
|
||||
return rawData.sort((a, b) => {
|
||||
return (
|
||||
Number(new Date(b.frontmatter.date)) -
|
||||
Number(new Date(a.frontmatter.date))
|
||||
)
|
||||
})
|
||||
}
|
||||
}).load()
|
||||
|
||||
for (const { url, frontmatter, html } of posts) {
|
||||
feed.addItem({
|
||||
title: frontmatter.title as string,
|
||||
id: `${meta.hostname}${url.replace(/\/\d+\./, '/')}`,
|
||||
link: `${meta.hostname}${url.replace(/\/\d+\./, '/')}`,
|
||||
date: frontmatter.date,
|
||||
content: html?.replaceAll('​', '')
|
||||
})
|
||||
}
|
||||
|
||||
writeFileSync(path.join(config.outDir, 'feed.rss'), feed.rss2())
|
||||
return consola.info('Generated rss feed.')
|
||||
}
|
63
website/hooks/satoriConfig.ts
Normal file
63
website/hooks/satoriConfig.ts
Normal file
|
@ -0,0 +1,63 @@
|
|||
/**
|
||||
* Copyright (c) 2025 taskylizard. Apache License 2.0.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
import type { SatoriOptions } from 'x-satori/vue'
|
||||
import { readFile } from 'node:fs/promises'
|
||||
import { dirname, resolve } from 'node:path'
|
||||
import { fileURLToPath } from 'node:url'
|
||||
import { defineSatoriConfig } from 'x-satori/vue'
|
||||
|
||||
const __dirname = dirname(fileURLToPath(import.meta.url))
|
||||
const __fonts = resolve(__dirname, '../fonts')
|
||||
|
||||
const fonts: SatoriOptions['fonts'] = [
|
||||
{
|
||||
name: 'Inter',
|
||||
data: await readFile(resolve(__fonts, 'Inter-Regular.otf')),
|
||||
weight: 400,
|
||||
style: 'normal'
|
||||
},
|
||||
{
|
||||
name: 'Inter',
|
||||
data: await readFile(resolve(__fonts, 'Inter-Medium.otf')),
|
||||
weight: 500,
|
||||
style: 'normal'
|
||||
},
|
||||
{
|
||||
name: 'Inter',
|
||||
data: await readFile(resolve(__fonts, 'Inter-SemiBold.otf')),
|
||||
weight: 600,
|
||||
style: 'normal'
|
||||
},
|
||||
{
|
||||
name: 'Inter',
|
||||
data: await readFile(resolve(__fonts, 'Inter-Bold.otf')),
|
||||
weight: 700,
|
||||
style: 'normal'
|
||||
}
|
||||
]
|
||||
|
||||
export default defineSatoriConfig({
|
||||
width: 1200,
|
||||
height: 628,
|
||||
fonts,
|
||||
props: {
|
||||
title: 'Title',
|
||||
description:
|
||||
'Lorem ipsum dolor sit amet, qui minim labore adipisicing minim sint cillum sint consectetur cupidatat.',
|
||||
dir: '/j'
|
||||
}
|
||||
})
|
5
website/index.ts
Normal file
5
website/index.ts
Normal file
|
@ -0,0 +1,5 @@
|
|||
export { transformsPlugin, transform, transformGuide } from './transformer'
|
||||
export { headersPlugin } from './markdown/headers'
|
||||
export { toggleStarredPlugin } from './markdown/toggle-starred'
|
||||
export { defs, emojiRender, movePlugin } from './markdown/emoji'
|
||||
export { generateFeed, generateImages, generateMeta } from './hooks'
|
44
website/markdown/base64.ts
Normal file
44
website/markdown/base64.ts
Normal file
|
@ -0,0 +1,44 @@
|
|||
/**
|
||||
* Copyright (c) 2025 taskylizard. Apache License 2.0.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
import type { MarkdownRenderer } from 'vitepress'
|
||||
|
||||
// FIXME: tasky: possibly write less horror jank?
|
||||
export function base64DecodePlugin(md: MarkdownRenderer) {
|
||||
const decode = (str: string): string =>
|
||||
Buffer.from(str, 'base64').toString('binary')
|
||||
// Save the original rule for backticks
|
||||
const defaultRender =
|
||||
md.renderer.rules.code_inline ||
|
||||
function (tokens, idx, options, _env, self) {
|
||||
return self.renderToken(tokens, idx, options)
|
||||
}
|
||||
|
||||
md.renderer.rules.code_inline = function (tokens, idx, options, env, self) {
|
||||
if (
|
||||
!env.frontmatter.title ||
|
||||
(env.frontmatter.title && env.frontmatter.title !== 'base64')
|
||||
) {
|
||||
return defaultRender(tokens, idx, options, env, self)
|
||||
}
|
||||
const token = tokens[idx]
|
||||
const content = token.content
|
||||
|
||||
return `<button class='base64' onclick="(function(btn){ const codeEl = btn.querySelector('code'); navigator.clipboard.writeText('${decode(
|
||||
content
|
||||
)}').then(() => { const originalText = codeEl.textContent; codeEl.textContent = 'Copied'; setTimeout(() => codeEl.textContent = originalText, 3000); }).catch(console.error); })(this)"><code>${content}</code></button>`
|
||||
}
|
||||
}
|
58
website/markdown/emoji.ts
Normal file
58
website/markdown/emoji.ts
Normal file
|
@ -0,0 +1,58 @@
|
|||
/**
|
||||
* Copyright (c) 2025 taskylizard. Apache License 2.0.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
import type { MarkdownRenderer } from 'vitepress'
|
||||
import { icons as twemoji } from '@iconify-json/twemoji'
|
||||
|
||||
export const defs = {
|
||||
...Object.fromEntries(
|
||||
Object.entries(twemoji.icons).map(([key]) => {
|
||||
return [key, '']
|
||||
})
|
||||
)
|
||||
}
|
||||
|
||||
export function emojiRender(md: MarkdownRenderer) {
|
||||
md.renderer.rules.emoji = (tokens, idx) => {
|
||||
if (tokens[idx].markup.startsWith('star')) {
|
||||
return `<span class="i-twemoji-${tokens[idx].markup} starred"></span>`
|
||||
}
|
||||
return `<span class="i-twemoji-${tokens[idx].markup}"></span>`
|
||||
}
|
||||
}
|
||||
|
||||
export function movePlugin(
|
||||
plugins: { name: string }[],
|
||||
pluginAName: string,
|
||||
order: 'before' | 'after',
|
||||
pluginBName: string
|
||||
) {
|
||||
const pluginBIndex = plugins.findIndex((p) => p.name === pluginBName)
|
||||
if (pluginBIndex === -1) return
|
||||
|
||||
const pluginAIndex = plugins.findIndex((p) => p.name === pluginAName)
|
||||
if (pluginAIndex === -1) return
|
||||
|
||||
if (order === 'before' && pluginAIndex > pluginBIndex) {
|
||||
const pluginA = plugins.splice(pluginAIndex, 1)[0]
|
||||
plugins.splice(pluginBIndex, 0, pluginA)
|
||||
}
|
||||
|
||||
if (order === 'after' && pluginAIndex < pluginBIndex) {
|
||||
const pluginA = plugins.splice(pluginAIndex, 1)[0]
|
||||
plugins.splice(pluginBIndex, 0, pluginA)
|
||||
}
|
||||
}
|
84
website/markdown/headers.ts
Normal file
84
website/markdown/headers.ts
Normal file
|
@ -0,0 +1,84 @@
|
|||
/**
|
||||
* Copyright (c) 2025 taskylizard. Apache License 2.0.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
/**
|
||||
* Copyright (c) 2024 taskylizard
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
import type { MarkdownRenderer } from 'vitepress'
|
||||
import { headers } from '../transformer/constants'
|
||||
|
||||
const titles = Object.keys(headers).map((key) => headers[key].title)
|
||||
|
||||
export const headersPlugin = (md: MarkdownRenderer) => {
|
||||
// Add the Feedback component in the heading, before the link.
|
||||
//
|
||||
// Adding it after the link is closed prevents vitepress from properly
|
||||
// indexing the file's content.
|
||||
|
||||
md.renderer.rules.heading_open = (tokens, idx, options, env, self) => {
|
||||
const result = self.renderToken(tokens, idx, options)
|
||||
|
||||
const idxClose =
|
||||
idx +
|
||||
tokens.slice(idx).findIndex((token) => token.type === 'heading_close')
|
||||
if (idxClose <= idx) return result
|
||||
|
||||
const level = tokens[idx].tag.slice(1)
|
||||
if (!titles.includes(env.frontmatter.title) || level !== '2') return result
|
||||
|
||||
// Find the token for the link.
|
||||
//
|
||||
// The token after `heading_open` contains the link as a child token.
|
||||
const children = tokens[idx + 1].children || []
|
||||
const linkOpenToken = children.findLast((c) => c.type === 'link_open')
|
||||
if (!linkOpenToken) return result
|
||||
|
||||
const heading = tokens[idxClose - 1]
|
||||
|
||||
linkOpenToken.meta = linkOpenToken.meta || {}
|
||||
linkOpenToken.meta.feedback = {
|
||||
heading: heading.content
|
||||
}
|
||||
|
||||
return result
|
||||
}
|
||||
|
||||
const defaultRender = md.renderer.rules.link_open
|
||||
|
||||
md.renderer.rules.link_open = (tokens, idx, options, env, self) => {
|
||||
const result = defaultRender!!!!!!!!!!(tokens, idx, options, env, self)
|
||||
|
||||
const meta = tokens[idx].meta
|
||||
if (!meta || !meta.feedback) return result
|
||||
|
||||
const heading = meta.feedback.heading || ''
|
||||
if (!heading) return result
|
||||
|
||||
return `<Feedback heading="${heading}" />${result}`
|
||||
}
|
||||
}
|
39
website/markdown/toggle-starred.ts
Normal file
39
website/markdown/toggle-starred.ts
Normal file
|
@ -0,0 +1,39 @@
|
|||
/**
|
||||
* Copyright (c) 2025 taskylizard. Apache License 2.0.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
import type { MarkdownRenderer } from 'vitepress'
|
||||
|
||||
const excluded = ['Beginners Guide']
|
||||
|
||||
export function toggleStarredPlugin(md: MarkdownRenderer) {
|
||||
md.renderer.rules.list_item_open = (tokens, index, options, env, self) => {
|
||||
const contentToken = tokens[index + 2]
|
||||
|
||||
// Ensure the token exists
|
||||
if (contentToken) {
|
||||
const content = contentToken.content
|
||||
|
||||
if (
|
||||
!excluded.includes(env.frontmatter.title) &&
|
||||
(content.includes(':star:') || content.includes(':glowing-star:'))
|
||||
) {
|
||||
return `<li class="starred">`
|
||||
}
|
||||
}
|
||||
|
||||
return self.renderToken(tokens, index, options)
|
||||
}
|
||||
}
|
18
website/posts/Internet-Archive.md
Normal file
18
website/posts/Internet-Archive.md
Normal file
|
@ -0,0 +1,18 @@
|
|||
---
|
||||
title: Internet Archive Breach
|
||||
description: Internet Archive was hacked
|
||||
date: 2024-10-09
|
||||
next: false
|
||||
|
||||
prev: false
|
||||
|
||||
footer: true
|
||||
---
|
||||
|
||||
<Post authors="nbats" />
|
||||
|
||||
#### Internet Archive was hacked today, all 31 million accounts have had their details leaked. If you have an account its *highly* recommended to change your password on the site, as well as anywhere else you are using the same login details.
|
||||
|
||||
* https://www.bleepingcomputer.com/news/security/internet-archive-hacked-data-breach-impacts-31-million-users/
|
||||
|
||||
* https://haveibeenpwned.com/
|
82
website/posts/april-2023.md
Normal file
82
website/posts/april-2023.md
Normal file
|
@ -0,0 +1,82 @@
|
|||
---
|
||||
title: Monthly Updates [April]
|
||||
description: April 2023 updates.
|
||||
date: 2023-04-01
|
||||
next: false
|
||||
|
||||
prev: false
|
||||
|
||||
footer: true
|
||||
---
|
||||
|
||||
<Post authors="nbats"/>
|
||||
|
||||
:::info
|
||||
These update threads only contains major updates. If you're interested
|
||||
in seeing all minor changes you can follow our
|
||||
[Commits Page](https://github.com/fmhy/FMHYedit/commits/main) on GitHub or
|
||||
[Updates Channel](https://redd.it/17f8msf) in Discord.
|
||||
:::
|
||||
|
||||
### Wiki Updates
|
||||
|
||||
- Added
|
||||
[🤖 Artificial Intelligence](https://www.reddit.com/r/FREEMEDIAHECKYEAH/wiki/ai)
|
||||
section.
|
||||
|
||||
- Added Optimization, Tabletop, and Git Gud subsections in
|
||||
[Gaming](/gamingpiracyguide/#gaming-tools).
|
||||
|
||||
- Split [Language Learning](/edupiracyguide/#language-learning) into
|
||||
subsections.
|
||||
|
||||
- Split [Shopping](/miscguide/#shopping) into subsections.
|
||||
|
||||
- Split the learning portion of [Dev Tools](/devtools/) into subsections.
|
||||
|
||||
- Added Art Education section to [Image Tools](/img-tools/#art-education).
|
||||
|
||||
- Added NoFap section to NSFW to save souls.
|
||||
|
||||
- Added [New Headers](https://imgur.com/a/YXWUZun) to the subreddit.
|
||||
|
||||
---
|
||||
|
||||
### Stars Added ⭐
|
||||
|
||||
- Starred [ChatPDF](/ai/#ai-chatbots) in AI chatbots. AI that turns any book
|
||||
into a chatbot.
|
||||
|
||||
- Starred [Foogle](/videopiracyguide/#drives--directories) in Video Download.
|
||||
Fast, single click video downloads.
|
||||
|
||||
- Starred [JustChill](/videopiracyguide/#dedicated-hosts) in Streaming Sites.
|
||||
Nice UI, fast 1080p.
|
||||
|
||||
- Starred [movie-web](/videopiracyguide/#multi-hosts) Streaming Sites. Nice UI,
|
||||
fast 1080p.
|
||||
|
||||
- Starred [Primewire](/videopiracyguide/#multi-hosts) in Streaming Sites.
|
||||
Primewire has started adding links to pirated content again.
|
||||
|
||||
- Starred [Wotaku](https://wotaku.pages.dev/) in Indexes. Awesome Japanese
|
||||
piracy index.
|
||||
|
||||
- Starred [RLSLOAD](/downloadpiracyguide/#software-sites) in software sites.
|
||||
Software site with single click downloads.
|
||||
|
||||
- Starred [Flameshot](/img-tools/#screenshot-tools) in Screenshot Tools. Some
|
||||
people like this more than ShareX.
|
||||
|
||||
---
|
||||
|
||||
### Things Removed
|
||||
|
||||
- Removed FTUApps. FTU got caught with [malware](https://redd.it/120xk62) by
|
||||
/r/Piracy.
|
||||
|
||||
- Removed star from FileCR. They added new anti-adblock measures recently, and
|
||||
adblock defenders are no longer working for many users.
|
||||
|
||||
- Removed anti-anti-copy userscript. Script enables F7 "Caret Browsing mode"
|
||||
without telling the user its been enabled, or how to turn it off.
|
120
website/posts/april-2024.md
Normal file
120
website/posts/april-2024.md
Normal file
|
@ -0,0 +1,120 @@
|
|||
---
|
||||
title: Monthly Updates [April]
|
||||
description: April 2024 updates
|
||||
date: 2024-04-01
|
||||
next: false
|
||||
|
||||
prev: false
|
||||
|
||||
footer: true
|
||||
---
|
||||
|
||||
<Post authors="nbats"/>
|
||||
|
||||
:::info
|
||||
These update threads only contains major updates. If you're interested
|
||||
in seeing all minor changes you can follow our
|
||||
[Commits Page](https://github.com/fmhy/FMHYedit/commits/main) on GitHub or
|
||||
[Updates Channel](https://redd.it/17f8msf) in Discord.
|
||||
:::
|
||||
|
||||
### Wiki Updates
|
||||
|
||||
- Split Android Tools into subsections:
|
||||
[Optimization](https://fmhy.net/android-iosguide#optimization),
|
||||
[Battery](https://fmhy.net/android-iosguide#battery-tools),
|
||||
[Keyboard](https://fmhy.net/android-iosguide#keyboard-text),
|
||||
[Screen](https://fmhy.net/android-iosguide#screen-tools),
|
||||
[Files](https://fmhy.net/android-iosguide#android-file-tools),
|
||||
[Root / Flash](https://fmhy.net/android-iosguide#root-flash),
|
||||
[Productivity](https://fmhy.net/android-iosguide#productivity-calendars),
|
||||
[Maps](https://fmhy.net/android-iosguide#maps-location),
|
||||
[Notifications](https://fmhy.net/android-iosguide#notifications-widgets) and
|
||||
[Social Media](https://fmhy.net/android-iosguide#social-media-apps).
|
||||
|
||||
- Added [Abandonware](https://fmhy.net/gamingpiracyguide#abandonware),
|
||||
[MOBA](https://fmhy.net/gamingpiracyguide#moba-tools),
|
||||
[Gacha](https://fmhy.net/gamingpiracyguide#gacha-tools),
|
||||
[Counter-Strike](https://fmhy.net/gamingpiracyguide#counter-strike-tools),
|
||||
[Doom](https://fmhy.net/gamingpiracyguide#doom-tools) and
|
||||
[Controller Tool](https://fmhy.net/gamingpiracyguide#controller-tools)
|
||||
sections to Gaming.
|
||||
|
||||
- Added [Toys / Figures](https://fmhy.net/miscguide#toys-figures) section to
|
||||
Shopping.
|
||||
|
||||
- Added [Manga](https://fmhy.net/android-iosguide#android-manga) section to
|
||||
Android Reading.
|
||||
|
||||
- Added [MPV Shaders](https://fmhy.net/storage#mpv-shaders) section to Video
|
||||
Tools.
|
||||
|
||||
- Added [Email](https://fmhy.net/adblockvpnguide#email-privacy) section to
|
||||
Privacy.
|
||||
|
||||
- Added [Regex](https://fmhy.pages.dev/devtools#regex-tools) section to Dev
|
||||
Tools.
|
||||
|
||||
- Our [FMHY Social](https://social.fmhy.net/@fmhy) (fediverse instance /
|
||||
account) is now live.
|
||||
|
||||
- Removed wiki from saidit. Its our least used version so we're not sure its
|
||||
worth the effort. If enough people want it back we'll reconsider.
|
||||
|
||||
---
|
||||
|
||||
### Stars Added ⭐
|
||||
|
||||
- Starred [Streamed](https://fmhy.net/videopiracyguide#live-sports) in Live
|
||||
Sports. Fast streams, no ads.
|
||||
|
||||
- Starred [Poke](https://fmhy.net/social-media-tools#youtube-frontends) in
|
||||
YouTube Frontends. Nice UI, download support, no ads.
|
||||
|
||||
- Starred [Motrix](https://fmhy.net/file-tools#download-managers) in Download
|
||||
Managers. Some people prefer this over Jdownloader / IDM.
|
||||
|
||||
- Starred [Openlib](https://fmhy.net/android-iosguide#android-reading) in
|
||||
Android Reading. Anna’s Archive app.
|
||||
|
||||
- Starred [Stacher](https://fmhy.net/social-media-tools#youtube-downloaders) in
|
||||
YouTube Downloaders. Modern YT-DL GUI.
|
||||
|
||||
- Starred [DeepLX](https://fmhy.net/text-tools#translators) in Translators.
|
||||
Unlimited DeepL.
|
||||
|
||||
- Starred [Claude](https://fmhy.net/ai#online-chatbots) in Online Chatbots.
|
||||
Works better than things like gemini.
|
||||
|
||||
- Starred [Soft98](https://fmhy.net/downloadpiracyguide#software-sites) in
|
||||
Software Sites. Big library, single click DDL.
|
||||
|
||||
- Starred [JellyPlayer](https://fmhy.net/video-tools#jellyfin-tools) in Jellyfin
|
||||
Tools. Modern Jellyfin client.
|
||||
|
||||
- Starred [UniGetUI](https://fmhy.net/system-tools#package-managers) in Package
|
||||
Managers. Nice user-interface for Winget.
|
||||
|
||||
- Starred [Zipline](https://fmhy.net/img-tools#screenshot-tools) in Screenshot
|
||||
Tools. Self-hosted, feature-rich ShareX server.
|
||||
|
||||
- Starred [WSABuilds](https://fmhy.net/android-iosguide#android-emulators) in
|
||||
Android Emulators. Pre-built WSA binaries that will continue to be
|
||||
[updated](https://ibb.co/R4hssDc).
|
||||
|
||||
- Starred [SmartImage](https://fmhy.net/img-tools#reverse-image-search) in
|
||||
Reverse Image Search. Multi-site reverse image search tool.
|
||||
|
||||
---
|
||||
|
||||
### Things Removed
|
||||
|
||||
- Removed free-mp3-download as they've shutdown.
|
||||
|
||||
- Removed HolyUnblocker as they've
|
||||
[shutdown](https://github.com/QuiteAFancyEmerald/Holy-Unblocker?tab=readme-ov-file#important-message-original).
|
||||
|
||||
- Removed WSA as support for it has been [dropped](https://ibb.co/zxB565S).
|
||||
|
||||
- Unstarred FlixHQ in Streaming. This used to be good but seems to be a lot
|
||||
slower recently.
|
76
website/posts/april-2025.md
Normal file
76
website/posts/april-2025.md
Normal file
|
@ -0,0 +1,76 @@
|
|||
---
|
||||
title: Monthly Updates [April]
|
||||
description: April 2025 updates
|
||||
date: 2025-04-01
|
||||
next: false
|
||||
|
||||
prev: false
|
||||
|
||||
footer: true
|
||||
---
|
||||
|
||||
<Post authors="nbats"/>
|
||||
|
||||
:::info
|
||||
These update threads only contains major updates. If you're interested
|
||||
in seeing all minor changes you can follow our
|
||||
[Commits Page](https://github.com/fmhy/FMHYedit/commits/main) on GitHub or
|
||||
[Updates Channel](https://redd.it/17f8msf) in Discord.
|
||||
:::
|
||||
|
||||
# Wiki Updates
|
||||
|
||||
- Added a **[Guide](https://fmhy.net/other/selfhosting)** to set up and run your own instance of FMHY locally.
|
||||
|
||||
- Added a **[Userscript](https://greasyfork.org/en/scripts/528660-fmhy-safelink-guard)** version of the FMHY Safeguard.
|
||||
|
||||
- You can now choose [custom text colors](https://i.imgur.com/kXNRPjM.mp4) for the site using the icons in the sidebar + updated the feedback system to be more prominent.
|
||||
|
||||
- Cleaned up Drama Streaming section, removed dead / bad sites, and starred a few that seemed to work the best, [before vs after](https://i.imgur.com/E3QTrUn.png).
|
||||
|
||||
- Cleaned up Japanese Learning section, note that no sites were removed, just moved, [before vs after](https://i.imgur.com/wPboWjk.png).
|
||||
|
||||
|
||||
- Added usage limit tags to the [AI Video Generators](https://fmhy.net/ai#video-generation).
|
||||
|
||||
- Better organized font section + split into [Generators](https://fmhy.net/text-tools#font-text-generators) and [Customization](https://fmhy.net/text-tools#font-customization).
|
||||
|
||||
- Added a few [New Criteria](https://i.imgur.com/s7UGdIz.png) to our streaming site grading system.
|
||||
|
||||
***
|
||||
|
||||
# Stars Added ⭐
|
||||
|
||||
- Starred [DAB Music Player](https://fmhy.net/audiopiracyguide#download-sites) in Audio DDL. Single click FLAC album downloads, has web app + desktop apps for for windows, mac, and linux, with android support coming soon.
|
||||
|
||||
- Starred [IronFox](https://fmhy.net/storage#privacy-based) in Android Privacy Browsers. Firefox-based browser with a focus on privacy / security. Feature-rich, recommended by the librewolf dev team, and our community seems to really like it.
|
||||
|
||||
- Starred [AdGuardExtra](https://fmhy.net/social-media-tools#twitch-adblockers) in Twitch Adblockers. This seems to be the best way to block them now.
|
||||
|
||||
- Starred [AMP4](https://fmhy.net/social-media-tools#youtube-downloaders) in YouTube Video Downloaders, ad-free, supports playlists and 3 hour long videos.
|
||||
|
||||
- Starred [JustDeleteMe](https://fmhy.net/adblockvpnguide#web-privacy) in Web Privacy. Directory of links to more easily delete your accounts from web services.
|
||||
|
||||
- Starred [PocketCasts](https://fmhy.net/audiopiracyguide) in Podcast Streaming. Popular iOS podcast player that recently added both desktop + web apps.
|
||||
|
||||
- Starred [ADS-B Exchange](https://fmhy.net/miscguide#flights) in Flights section, one of the only that doesn't lock features behind paywalls.
|
||||
|
||||
- Replaced star for xManager with [ReVanced Manager](https://fmhy.net/android-iosguide#android-audio) in Ad-Free Spotify as it has more features, less issues, and xManager itself recommends it.
|
||||
|
||||
- Removed star for bark as its limited, and star for Tortoise TTS as it doesn't sound good, and instead starred [TTS Online](https://fmhy.net/ai#text-to-speech), which sounds better and has a 10k daily character limit.
|
||||
|
||||
***
|
||||
|
||||
# Things Removed
|
||||
|
||||
- Removed TorrentGalaxy, doesn't look like its coming back anytime soon sadly.
|
||||
|
||||
- Removed The Last Disaster from Audio DDL as they've shut down.
|
||||
|
||||
- Removed TOTV from Live TV as every channel seems to be YouTube videos now.
|
||||
|
||||
- Unstarred Plex as they've made remote streaming [paid only](https://www.plex.tv/blog/important-2025-plex-updates/), and increased their prices at the same time.
|
||||
|
||||
- Unstarred PSArips as their download process is very annoying.
|
||||
|
||||
- Unstarred Bookracy as its been having issues for awhile now.
|
111
website/posts/aug-2023.md
Normal file
111
website/posts/aug-2023.md
Normal file
|
@ -0,0 +1,111 @@
|
|||
---
|
||||
title: Monthly Updates [August]
|
||||
description: September 2023 updates.
|
||||
date: 2023-08-01
|
||||
next: false
|
||||
|
||||
prev: false
|
||||
|
||||
footer: true
|
||||
---
|
||||
|
||||
<Post authors="nbats"/>
|
||||
|
||||
:::info
|
||||
These update threads only contains major updates. If you're interested
|
||||
in seeing all minor changes you can follow our
|
||||
[Commits Page](https://github.com/fmhy/FMHYedit/commits/main) on GitHub or
|
||||
[Updates Channel](https://redd.it/17f8msf) in Discord.
|
||||
:::
|
||||
|
||||
### Wiki Updates
|
||||
|
||||
- Moved fmhy.ml to **[fmhy.net](/)**, and updated its UI to more closely match
|
||||
[fmhy.pages.dev](/).
|
||||
- Separated Android Tools into subcategories:
|
||||
[Device](/android-iosguide/#android-device),
|
||||
[Utilities](/android-iosguide/#android-utilities),
|
||||
[Internet](/android-iosguide/#android-internet),
|
||||
[Camera](/android-iosguide/#android-camera) and
|
||||
[Customization](/android-iosguide/#customization).
|
||||
|
||||
- Added a [Engineering](/edupiracyguide/#engineering) section to Educational.
|
||||
|
||||
- Renamed Multi Hosts to [Multi Server](/videopiracyguide/#multi-server),
|
||||
Dedicated Hosts to [Single Server](/videopiracyguide/#single-server), and
|
||||
bumped Multi above Single as they're generally better.
|
||||
|
||||
- Moved all the APK sections out of storage, and back into the main
|
||||
[Android section](/android-iosguide/#android-apks).
|
||||
|
||||
- Combined all [Indian Language sites](/non-english/#indian-languages) into one
|
||||
section in Non-Eng, as most host content for more than one language.
|
||||
|
||||
---
|
||||
|
||||
### Stars Added ⭐
|
||||
|
||||
- Starred [Ova Games](/gamingpiracyguide/#download-games) in Game Download. Big
|
||||
library, fast hosts.
|
||||
|
||||
- Starred [SmashyStream](/videopiracyguide/#multi-server) in Streaming Sites.
|
||||
Nice UI, fast 1080p.
|
||||
|
||||
- Starred [BlackPearlOrigin](/storage/#game-libraries--launcher) in Game
|
||||
Launchers. New game launcher and downloader, made by our friends.
|
||||
|
||||
- Starred Androeed and Modyolo in [Modded APKs](/android-iosguide/#modded-apks).
|
||||
|
||||
- Starred [Skraper](/gamingpiracyguide/#emulation--roms) in Emulation. Automate
|
||||
ROM Covers / Metadata.
|
||||
|
||||
- Starred [ROMhacking](/gamingpiracyguide/#rom-sites) in ROM Sites. One of the
|
||||
oldest sites for fan translations.
|
||||
|
||||
- Starred [FreeSports](/videopiracyguide/#live-tv--sports) in Live Sports. A
|
||||
live sports site that isn't flooded with ads like most are.
|
||||
|
||||
- Starred [SoccerCatch](/videopiracyguide/#sports-streaming) in Sports
|
||||
Streaming. Full Match replays.
|
||||
|
||||
- Starred [DownloadPirate](/storage/#vfx-sites) in VFX Sites. Popular site for
|
||||
video effects and software.
|
||||
|
||||
- Starred [SophiApp](/storage/#windows-10-debloater) in debloaters. Gives good
|
||||
explanations for its tweaks making it safer for new users.
|
||||
|
||||
- Starred
|
||||
[Actually Good Distros](https://ash.fail/blog/20230625-actually-good-distro-recomendations-for-beginners.html)
|
||||
in Linux. Beginner distro guides.
|
||||
|
||||
---
|
||||
|
||||
### Things Removed
|
||||
|
||||
- Removed Bromite as they've [stopped updates](https://i.imgur.com/uM3ryHR.png),
|
||||
and replaced it with [Cromite](https://github.com/uazo/cromite) which will
|
||||
continue to be updated by one of their devs.
|
||||
|
||||
- Removed AI Text Detectors as they're known for
|
||||
[being inaccurate](https://arstechnica.com/information-technology/2023/07/openai-discontinues-its-ai-writing-detector-due-to-low-rate-of-accuracy/).
|
||||
|
||||
- Unstarred SoftArchive in Software as people have become annoyed with their
|
||||
slow hosts.
|
||||
|
||||
- Unstarred LookMovie in Streaming as people don't like the fact 1080p is behind
|
||||
premium.
|
||||
|
||||
- Unstarred QuickBoost in Tweaking as the app doesn't give details as to what
|
||||
each tweak actually does.
|
||||
|
||||
- Unstarred Sockshare in Streaming as their original domain died, and it doesn't
|
||||
have the best UI anyways.
|
||||
|
||||
- Removed AnimeKaizoku from Anime Streaming as they've shutdown.
|
||||
|
||||
- Removed DeepFloyd from Image Generators as its been paused for over a month.
|
||||
|
||||
- Removed Appnee from Software Sites. The MAS team found that they host many
|
||||
[unsafe activators](https://i.imgur.com/KmDKUw4.png). We don't think Appnee is
|
||||
purposefully malicious, they just need to be more careful and clean things up
|
||||
before we can add them again.
|
133
website/posts/aug-2024.md
Normal file
133
website/posts/aug-2024.md
Normal file
|
@ -0,0 +1,133 @@
|
|||
---
|
||||
title: Monthly Updates [August]
|
||||
description: August 2024 updates
|
||||
date: 2024-08-01
|
||||
next: false
|
||||
|
||||
prev: false
|
||||
|
||||
footer: true
|
||||
---
|
||||
|
||||
<Post authors="nbats"/>
|
||||
|
||||
:::info
|
||||
These update threads only contains major updates. If you're interested
|
||||
in seeing all minor changes you can follow our
|
||||
[Commits Page](https://github.com/fmhy/FMHYedit/commits/main) on GitHub or
|
||||
[Updates Channel](https://redd.it/17f8msf) in Discord.
|
||||
:::
|
||||
|
||||
### Wiki Updates
|
||||
|
||||
- Added [URL Tools](https://fmhy.net/internet-tools#url-tools) section with
|
||||
subsections: [Shorteners](https://fmhy.net/internet-tools#url-shorteners),
|
||||
[Unshorteners](https://fmhy.net/internet-tools#url-unshorteners),
|
||||
[Site Checks](https://fmhy.net/internet-tools#down-site-checkers) and
|
||||
[Domain / DNS](https://fmhy.net/internet-tools#domain-dns).
|
||||
|
||||
- Split Search Tools into subsections:
|
||||
[Search Engines](https://fmhy.net/internet-tools#search-engines),
|
||||
[Custom Engines](https://fmhy.net/internet-tools#custom-search-engines) and
|
||||
[Google Tools](https://fmhy.net/internet-tools#google-search-tools).
|
||||
|
||||
- Split Multiplayer Tools into subsections:
|
||||
[Fixes](https://fmhy.net/gaming-tools#multiplayer-fixes),
|
||||
[Mods](https://fmhy.net/gaming-tools#multiplayer-mods) and
|
||||
[Servers](https://fmhy.net/gaming-tools#multiplayer-servers).
|
||||
|
||||
- Split Game Dev Tools into subsections:
|
||||
[Game Engines](https://fmhy.net/devtools#game-engines),
|
||||
[Asset Creation](https://fmhy.net/devtools#asset-creation) and
|
||||
[Map Creators](https://fmhy.net/devtools#map-creators-editors).
|
||||
|
||||
- Added [Office Suites](https://fmhy.net/text-tools#office-suites) section to
|
||||
Text Tools.
|
||||
|
||||
- Added [Wallpaper Managers](https://fmhy.net/system-tools#wallpaper-managers)
|
||||
section to Customization.
|
||||
|
||||
- Added [Captcha Tools](https://fmhy.net/internet-tools#captcha-tools) section
|
||||
to Internet Tools.
|
||||
|
||||
- Added [Tumblr Tools](https://fmhy.net/social-media-tools#tumblr-tools) section
|
||||
to Social Media Tools.
|
||||
|
||||
- Added [VTuber Tools](https://fmhy.net/video-tools#vtuber-tools) section to
|
||||
Video Tools.
|
||||
|
||||
- Added warning to Vadapav NOT to use DL managers to bulk download anymore as
|
||||
they're [banning](https://ibb.co/VvrZMXQ) for it now. You can still use DL
|
||||
managers, just download at a reasonable pace please.
|
||||
|
||||
- Decided to pull the plug on the feedback forum (feedback.fmhy.net), and
|
||||
instead enable the
|
||||
[forums feature](https://discord.com/blog/forum-channels-space-for-organized-conversation)
|
||||
in our [discord](https://discord.gg/5W9QJKuPkD). We now have forums for giving
|
||||
suggestions, getting support, and testing links.
|
||||
|
||||
---
|
||||
|
||||
### Stars Added ⭐
|
||||
|
||||
- Starred [lucida](https://fmhy.net/audiopiracyguide#audio-ripping-sites) in
|
||||
Audio Ripping. Multi-site audio ripping with 320kb / FLAC support.
|
||||
|
||||
- Starred [Proton Docs](https://fmhy.net/text-tools#online-editors) in Text
|
||||
Tools. Protons google docs alternative.
|
||||
|
||||
- Starred [Pikimov](https://fmhy.net/video-tools#online-editors) in Online Video
|
||||
Editors. Online adobe after effects alternative.
|
||||
|
||||
- Starred [Flowstreams](https://fmhy.net/videopiracyguide#live-sports) in Live
|
||||
Sports. Live sports / music events.
|
||||
|
||||
- Starred [FullReplays](https://fmhy.net/videopiracyguide#sports-replays) in
|
||||
sports replays. Full soccer match replays.
|
||||
|
||||
- Starred [Aurora Store](https://fmhy.net/android-iosguide#untouched-apks) in
|
||||
Untouched APKs. FOSS version of the Play Store.
|
||||
|
||||
- Starred [No Trace](https://fmhy.net/adblockvpnguide#privacy-indexes) in
|
||||
Privacy Indexes. In-depth privacy guides / anti-surveillance.
|
||||
|
||||
- Starred
|
||||
[Futo Keyboard / Voice](https://fmhy.net/android-iosguide#keyboard-text) in
|
||||
Android Keyboard Tools. Privacy-focused keyboards.
|
||||
|
||||
- Starred [Piko](https://fmhy.net/android-iosguide#social-media-apps) in Android
|
||||
Social Media. ReVanced patches for X.com.
|
||||
|
||||
- Starred [auto-mcs](https://fmhy.net/storage#minecraft-server-tools) in
|
||||
Minecraft Server Tools. Simple Minecraft server setup.
|
||||
|
||||
- Starred [Vijay's Virtual Vibes](https://fmhy.net/miscguide#random) in Fun
|
||||
Sites. Find random sites.
|
||||
|
||||
- Starred [Codeium](https://fmhy.net/ai#coding-ais) in Coding AIs. Popular
|
||||
coding AI with unlimited GPT-3.5.
|
||||
|
||||
- Starred [Print Chess](https://fmhy.net/gamingpiracyguide#strategy) in Strategy
|
||||
Games. Printable paper chess set.
|
||||
|
||||
- Starred both Streamflix and PrimeFlix in
|
||||
[Multi Host](https://fmhy.net/videopiracyguide). Both sites have improved a
|
||||
lot recently.
|
||||
|
||||
- Re-added + Starred [Gmailnator](https://fmhy.net/internet-tools#temp-mail).
|
||||
Temp mail site with gmail address'.
|
||||
|
||||
---
|
||||
|
||||
### Things Removed
|
||||
|
||||
- Removed Fmovies as its been offline for weeks. We've replaced it with
|
||||
[FBOX](https://fmhy.net/videopiracyguide#multi-server) for now.
|
||||
|
||||
- Removed Cipher Files as they've [shutdown](https://ibb.co/gzYX4Gb).
|
||||
|
||||
- Removed Homeworkify as they've [shutdown](https://ibb.co/wJp6B3b).
|
||||
|
||||
- Unstarred both Awesome Privacy and Hitchhiker’s Guide in Privacy Indexes, and
|
||||
bumped PrivacyGuides.org to the top. PrivacyGuides is high quality and updated
|
||||
more often than others.
|
123
website/posts/dec-2023.md
Normal file
123
website/posts/dec-2023.md
Normal file
|
@ -0,0 +1,123 @@
|
|||
---
|
||||
title: Monthly Updates [December] 250k members!!
|
||||
description: Thank you all for 250K members! ♡
|
||||
date: 2023-12-01
|
||||
next: false
|
||||
|
||||
prev: false
|
||||
|
||||
footer: true
|
||||
---
|
||||
|
||||
:::info
|
||||
These update threads only contains major updates. If you're interested
|
||||
in seeing all minor changes you can follow our
|
||||
[Commits Page](https://github.com/fmhy/FMHYedit/commits/main) on GitHub or
|
||||
[Updates Channel](https://redd.it/17f8msf) in Discord.
|
||||
:::
|
||||
|
||||
<Post authors="nbats,taskylizard" />
|
||||
|
||||
---
|
||||
|
||||
### Wiki Updates
|
||||
|
||||
- Separated Tool sections into their own pages: [System Tools](/system-tools),
|
||||
[File Tools](/file-tools), [Internet Tools](/internet-tools),
|
||||
[Text Tools](/text-tools), [Video Tools](/video-tools) and
|
||||
[Audio Tools](/audio-tools).
|
||||
|
||||
- Separated Health into subsections: [Mental](/miscguide#mental-health),
|
||||
[Physical](/miscguide#physical-health),
|
||||
[Nutritional](/miscguide#nutritional-health),
|
||||
[Sexual](/miscguide#sexual-health) and [Detoxing](/miscguide#detoxing).
|
||||
|
||||
- Added a section for [Open-Source Games](/gamingpiracyguide#open-source-games)
|
||||
in Gaming.
|
||||
|
||||
- Added a section for [Animation Tools](/video-tools#animation-tools) in Video
|
||||
Tools.
|
||||
|
||||
- Added a section for [Academic Papers](/readingpiracyguide#academic-papers) in
|
||||
Educational Reading.
|
||||
|
||||
- Added sections for [Illustrations](/img-tools#illustrations) and
|
||||
[Textures / Patterns](/storage#textures-patterns) in Images.
|
||||
|
||||
- Added sections in Linux for [Video](/linuxguide#linux-video),
|
||||
[Audio](/linuxguide#linux-audio), [Images](/linuxguide#linux-images) and
|
||||
[File Tools](/linuxguide#file-tools).
|
||||
|
||||
- Made a ["safe for work"](https://rentry.org/piracy) version of our index with
|
||||
no NSFW link listed.
|
||||
|
||||
- Added a [collapsible list](https://i.imgur.com/wnOXvKG.png) of all the Tool
|
||||
sections to our sites sidebar.
|
||||
|
||||
---
|
||||
|
||||
### Stars Added ⭐
|
||||
|
||||
- Starred [Streamflix](/videopiracyguide#multi-server) in Streaming Sites. Nice
|
||||
UI, fast 1080p, ran by members of our community.
|
||||
|
||||
- Starred [watch.lonelil](/videopiracyguide#multi-server) in Streaming Sites.
|
||||
Nice UI, fast 4K + 1080p, live tv.
|
||||
|
||||
- Starred [Game Bounty](/gamingpiracyguide#download-games) in Game Download.
|
||||
Fast hosts, pre-installs, clean uploads, ran by members of our community.
|
||||
|
||||
- Starred [AbandonwareGames](/storage#abandonware-games) in Abandonware Games.
|
||||
Nice site with a big library of oldschool games.
|
||||
|
||||
- Starred [Heroic Games Launcher](/gamingpiracyguide#steam-epic) in Steam /
|
||||
Epic. Open-source Epic Games launcher.
|
||||
|
||||
- Starred [TG Archive](/downloadpiracyguide#download-directories) in Download
|
||||
Directories. Telegram file archive + search tool.
|
||||
|
||||
- Starred [BleachBit](/system-tools#system-debloating) in system debloating.
|
||||
Popular system file cleaning tool.
|
||||
|
||||
- Starred [YT-DLP-GUI](/video-tools#youtube-download) in YouTube Download. Nice
|
||||
GUI for YT-DL with single click installer.
|
||||
|
||||
- Starred [EverythingToolbar](/system-tools#system-tweaks) in System Tweaks.
|
||||
Adds lots of features to Windows toolbar.
|
||||
|
||||
- Starred [DeepL](/text-tools#translators) in Translators. People feel this
|
||||
gives some of the best results.
|
||||
|
||||
- Starred [Magpie](/gamingpiracyguide#optimization-tools) in Gaming
|
||||
Optimization. Enable AMD FSR on any game or device.
|
||||
|
||||
- Starred [TrollStore](/android-iosguide#ios-apps) in iOS Apps. Permanently
|
||||
install non-appstore iOS apps w/o pc, paid dev account or being jailbroken.
|
||||
|
||||
- Starred [SmartTube](/videopiracyguide#smart-tv-firestick) in Smart TV /
|
||||
Firestick. Ad-free YouTube app. Previously called SmartTubeNext.
|
||||
|
||||
---
|
||||
|
||||
### Things Removed
|
||||
|
||||
- Removed both AppsTorrent and nMac as they're listed as unsafe by
|
||||
[MacSerialJunkie](https://i.imgur.com/De9u5Ox.png).
|
||||
|
||||
- Removed both LocalCDN and Decentraleyes as they're redundant with with
|
||||
[Total Cookie Protection](https://blog.privacyguides.org/2021/12/01/firefox-privacy-2021-update/#localcdn-and-decentraleyes)
|
||||
enabled.
|
||||
|
||||
- Removed NovaAI as they've
|
||||
[decided to shutdown](https://www.reddit.com/r/Piracy/comments/17pzrzj/nova_oss_the_api_that_provided_free_gpt4_and/).
|
||||
|
||||
- Replaced all CurseForge links with Modrinth as people feel CurseForge
|
||||
[doesn't cooperate](https://youtu.be/Vhdwz5apiQQ?si=xgzkQFa1S7hZNa5-) with
|
||||
their user-base well.
|
||||
|
||||
- Unstarred 12ft.io as it can no longer bypass non-javascript based paywalls.
|
||||
|
||||
- Removed FileListing as they've shutdown their servers.
|
||||
|
||||
- Removed GreaseMonkey as it hasn't been updated in 3 years + has a possible
|
||||
history of tracking users.
|
86
website/posts/dec-2024.md
Normal file
86
website/posts/dec-2024.md
Normal file
|
@ -0,0 +1,86 @@
|
|||
---
|
||||
title: Monthly Updates [December]
|
||||
description: December 2024 updates.
|
||||
date: 2024-12-01
|
||||
next: false
|
||||
|
||||
prev: false
|
||||
|
||||
footer: true
|
||||
---
|
||||
|
||||
<Post authors="nbats"/>
|
||||
|
||||
:::info
|
||||
These update threads only contains major updates. If you're interested
|
||||
in seeing all minor changes you can follow our
|
||||
[Commits Page](https://github.com/fmhy/FMHYedit/commits/main) on GitHub or
|
||||
[Updates Channel](https://redd.it/17f8msf) in Discord.
|
||||
:::
|
||||
|
||||
### Wiki Updates
|
||||
|
||||
|
||||
- Added [FFmpeg section](https://fmhy.net/video-tools#ffmpeg-tools) to Video Tools.
|
||||
|
||||
- Added [Anti-Censorship](https://fmhy.net/adblockvpnguide#anti-censorship) section to Proxies.
|
||||
|
||||
- Added [Spotify Playlist Tools](https://fmhy.net/audiopiracyguide#spotify-playlists) section to Audio.
|
||||
|
||||
- Added [Household Management](https://fmhy.net/miscguide#household) section to Misc.
|
||||
|
||||
- Added new subsections to YouTube: [Video Tools](https://fmhy.net/social-media-tools#video-tools) / [Playlist Tools](https://fmhy.net/social-media-tools#playlist-tools) / [Archiving](https://fmhy.net/social-media-tools#youtube-archiving)
|
||||
|
||||
- Split Webhosting into subsections: [Free Webhosting](https://fmhy.net/storage#free-webhosting-sites) / [Static Pages](https://fmhy.net/storage#static-page-hosting) / [Dynamic Pages](https://fmhy.net/storage#dynamic-page-hosting) / [Site Builders](https://fmhy.net/storage#website-builders)
|
||||
|
||||
- Split [Smart TV](https://fmhy.net/videopiracyguide#smart-tv-firestick) and [Android TV](https://fmhy.net/videopiracyguide#android-tv) into separate sections.
|
||||
|
||||
- Split [Physical Health](https://fmhy.net/miscguide#physical-health) and [Workout](https://fmhy.net/miscguide#workout-exercise) into separate sections.
|
||||
|
||||
- Split [Single Server](https://fmhy.net/videopiracyguide#single-server) and [Free w/ Ads](https://fmhy.net/videopiracyguide#free-w-ads) streaming into separate sections.
|
||||
|
||||
- Moved IPTV Tools out of storage into its own [dedicated section](https://fmhy.net/videopiracyguide#iptv-tools).
|
||||
|
||||
- Cleaned up both [DNS Resolver](https://fmhy.net/storage#free-dns-resolvers) + [VPN Config](https://fmhy.net/storage#free-vpn-configs) sections.
|
||||
|
||||
- Went through [AI section](https://fmhy.net/ai) and tagged bots that don't require signup.
|
||||
|
||||
***
|
||||
|
||||
### Stars Added ⭐
|
||||
|
||||
- Starred [Windows 10 After EOL](https://fmhy.net/system-tools#windows-updates) in Windows Updates. Continue to receive updates after Win10's End-Of-Life in Oct 2025.
|
||||
|
||||
- Starred [Directory Opus](https://fmhy.net/file-tools#file-explorers) in File Explorers. Powerful and highly customizable windows file manager.
|
||||
|
||||
- Starred [Censorship Bypass Guide](https://fmhy.net/adblockvpnguide#anti-censorship) in Anti-Censorship. Easy to follow censorship bypass guides.
|
||||
|
||||
- Starred [Mistral](https://fmhy.net/ai#online-chatbots) in Online Chatbots. Feature-rich bot which includes web search, a canvas tool, image generation and more.
|
||||
|
||||
- Starred [OnTheSpot](https://fmhy.net/audiopiracyguide#audio-ripping-tools) in Audio Ripping. Spotify Downloader with a GUI that still works after the spotify's changes.
|
||||
|
||||
- Starred [LanguageTool](https://fmhy.net/text-tools#grammar-check) in Grammar Check. This seemed to pick up the most errors when compared to other options.
|
||||
|
||||
- Starred [BlockAway](https://fmhy.net/adblockvpnguide#proxy-sites) in Proxy Sites. Popular proxy site that seems to work well for most people.
|
||||
|
||||
- Starred [Plutonium](https://fmhy.net/gaming-tools#multiplayer-mods) in Multiplayer Mods. The most popular COD multiplayer server mod, works with multiple games.
|
||||
|
||||
- Starred [webOS Dev Manager](https://fmhy.net/videopiracyguide#smart-tv-firestick). LG TV Homebrew Installer + Guide.
|
||||
|
||||
- Starred [Citrus Search](https://fmhy.net/readingpiracyguide#academic-papers) in Academic Papers. Easily search and find similar papers for any topic.
|
||||
|
||||
***
|
||||
|
||||
### Things Removed
|
||||
|
||||
- Removed free warp keys as they're being revoked now.
|
||||
|
||||
- Removed DramaCool as they're [shutting down](https://x.com/dramacoolcom/status/1861628424147869919). We're aware GogoAnime has also stopped updates, but we're waiting for more news before removing them.
|
||||
|
||||
- Removed both SusFlix and BFlix as they've been offline for over a week.
|
||||
|
||||
- Unstarred multiple streaming sites as we had so many stars they became meaningless. [Before vs. After](https://i.ibb.co/QPxKLm2/image.png).
|
||||
|
||||
- Unstarred Claude as free tier is too limited now.
|
||||
|
||||
- Unstarred ClearURLs as its mostly redundant with adblockers like uBO.
|
24
website/posts/discord.md
Normal file
24
website/posts/discord.md
Normal file
|
@ -0,0 +1,24 @@
|
|||
---
|
||||
title: Public Discord Server
|
||||
description: Our new space to chat in.
|
||||
date: 2023-10-24
|
||||
next: false
|
||||
|
||||
prev: false
|
||||
|
||||
footer: true
|
||||
---
|
||||
|
||||
<Post authors="nbats" />
|
||||
|
||||
# Public URL: https://rentry.co/fmhy-invite
|
||||
|
||||
---
|
||||
|
||||
## Server Rules
|
||||
|
||||
1. Please be kind and helpful to one another, especially beginners.
|
||||
2. No selling or advertising anything paid.
|
||||
3. No direct links to pirated content.
|
||||
4. No NSFW content (or requests) outside of NSFW channels.
|
||||
5. No racism, sexism, ableism, homophobia, transphobia.
|
138
website/posts/feb-2024.md
Normal file
138
website/posts/feb-2024.md
Normal file
|
@ -0,0 +1,138 @@
|
|||
---
|
||||
title: Monthly Updates [Feb]
|
||||
description: Febuary 2024 updates.
|
||||
date: 2024-02-01
|
||||
next: false
|
||||
|
||||
prev: false
|
||||
|
||||
footer: true
|
||||
---
|
||||
|
||||
<Post authors="nbats" />
|
||||
|
||||
:::info
|
||||
These update threads only contains major updates. If you're interested
|
||||
in seeing all minor changes you can follow our
|
||||
[Commits Page](https://github.com/fmhy/FMHYedit/commits/main) on GitHub or
|
||||
[Updates Channel](https://redd.it/17f8msf) in Discord.
|
||||
:::
|
||||
|
||||
### Wiki Updates
|
||||
|
||||
- Our official pastebin, **[snowbin](https://pastes.fmhy.net/)** is now live!
|
||||
Keep in mind pastes only last for 7 days, and as of now you can't make edits,
|
||||
but we may add features like this in the future.
|
||||
|
||||
- Ran a [poll](https://i.imgur.com/73paJlr.png) regarding streaming sites, and
|
||||
used the results to help us re-order the
|
||||
[streaming section.](/videopiracyguide)
|
||||
|
||||
- Turned Spotify into its own section w/ subsections:
|
||||
[Clients](/audiopiracyguide#spotify-clients),
|
||||
[Adblockers](/audiopiracyguide#spotify-adblockers),
|
||||
[Download](/audiopiracyguide#spotify-download) and
|
||||
[Tools](/audiopiracyguide#spotify-tools).
|
||||
|
||||
- Added a section for [Soundtracks](/audiopiracyguide#media-soundtracks) in
|
||||
Audio.
|
||||
|
||||
- Added sections for [Computer Science](/devtools#computer-science) and
|
||||
[Docker](/devtools#docker-tools) in Dev Tools.
|
||||
|
||||
- Added a section for
|
||||
[Two-Factor Authentication](/adblockvpnguide#two-factor-authentication) in Web
|
||||
Privacy.
|
||||
|
||||
- Re-organized [Magazine Sites](/readingpiracyguide#magazines) + added filehosts
|
||||
to their descriptions.
|
||||
|
||||
- Removed OnStream from unsafe sites. The ["evidence"](https://rentry.co/upo2r)
|
||||
we had listed wasn't very solid. If someone has more proof we can re-consider,
|
||||
but for now we don't have reason enough to call them unsafe. Keep in mind its
|
||||
not posted in the wiki, just removed from our unsafe list.
|
||||
|
||||
- We recently moved off Netlify, and soon after a scammer
|
||||
[took over the domain](https://i.imgur.com/rByoHnf.png). If you had this page
|
||||
bookmarked we'd highly recommend you remove it, and update to our
|
||||
[new domain](/). We've tried reporting it to Netlify, but so far they haven't
|
||||
done anything.
|
||||
|
||||
- Grammar issues have been fixed
|
||||
[throughout the wiki](https://github.com/fmhy/FMHYedit/pull/1337) /
|
||||
[2](https://github.com/fmhy/FMHYedit/pull/1340) /
|
||||
[3](https://github.com/fmhy/FMHYedit/pull/1339). Remember that anyone can send
|
||||
[pull requests](https://github.com/fmhy/FMHYedit) to our github so don't be
|
||||
afraid to help us fix things like this.
|
||||
|
||||
- Added a mirror of our site to [github.io](https://fmhy.github.io/FMHYedit/).
|
||||
|
||||
---
|
||||
|
||||
### Stars Added ⭐
|
||||
|
||||
- Starred updated guides for both [Windows Piracy](/system-tools#windows-isos)
|
||||
and [Office Piracy](/text-tools#text-editors).
|
||||
|
||||
- Starred [Buzzheavier](/file-tools#file-hosts) in File Hosts. No upload limit,
|
||||
files last forever.
|
||||
|
||||
- Starred [Linqbin](/internet-tools#url-tools) in URL Tools. Privacy focused
|
||||
temp link shortener/pastebin, made by one of our discord mods.
|
||||
|
||||
- Starred [Gnarly Repacks](/gamingpiracyguide#game-repacks) in Game Repacks +
|
||||
ROMs. Trusted repacker who's been around for years.
|
||||
|
||||
- Starred [PrimeFlix](/videopiracyguide#multi-server) in Streaming Sites. Nice
|
||||
UI, fast 1080p, lots of hosts.
|
||||
|
||||
- Starred [LightDLMovies](/videopiracyguide#download-sites) in Video Download.
|
||||
Fast, single click, 1080p downloads.
|
||||
|
||||
- Starred [Flugel Anime](/videopiracyguide#anime-downloading) in Anime DDL.
|
||||
Archive of nyaa.si with fast downloads.
|
||||
|
||||
- Starred [Divisions by zero](/social-media-tools#fediverse-tools) in Fediverse
|
||||
Tools. The best piracy focused instance on Lemmy.
|
||||
|
||||
- Starred [CRACKSurl](/downloadpiracyguide#software-sites) in Software Sites.
|
||||
Clean scans + admins are members of FMHY.
|
||||
|
||||
- Starred [PDF Drive](/readingpiracyguide#pdf-search) in PDF Sites as their
|
||||
downloads are working again.
|
||||
|
||||
- Starred [Bypass All Shortlinks](/adblockvpnguide#redirect-bypass) in Redirect
|
||||
Bypass. This is a fork of the original script with all tracking elements
|
||||
removed.
|
||||
|
||||
---
|
||||
|
||||
### Things Removed
|
||||
|
||||
- Removed Tachiyomi as it is
|
||||
[no longer being developed](https://tachiyomi.org/news/2024-01-13-goodbye).
|
||||
We've replaced it with its successor
|
||||
[Mihon](/android-iosguide#android-reading), and keep in mind the forks linked
|
||||
there still work.
|
||||
|
||||
- Removed Revanced Extended in YouTube Apps as its been
|
||||
[archived](https://redd.it/1abt4kk).
|
||||
|
||||
- Removed Nitter in Frontends as the lead dev decided to
|
||||
[call it quits](https://github.com/zedeus/nitter/issues/1155#issuecomment-1913361757).
|
||||
|
||||
- Removed Erai-Raws in Anime DDL as they're closing registrations.
|
||||
|
||||
- Removed WorldCinema in Video DDL as they've gone premium only.
|
||||
|
||||
- Removed /r/ApkApps Megathread as its no longer updated.
|
||||
|
||||
- Removed Lunar Client in Minecraft Launchers as its closed-source and their
|
||||
privacy policy is [very poor](https://i.imgur.com/2Wtds7l.png).
|
||||
|
||||
- Unstarred LibreWolf as Mullvad Browser is a similar project with
|
||||
[auto updates](https://i.imgur.com/GTzWHR0.png).
|
||||
|
||||
- Unstarred Zoo in AI Chatbots as its no longer unlimited.
|
||||
|
||||
- Unstarred Phind in AI Chatbots as it no longer offers free GPT-4.
|
70
website/posts/feb-2025.md
Normal file
70
website/posts/feb-2025.md
Normal file
|
@ -0,0 +1,70 @@
|
|||
---
|
||||
title: Monthly Updates [Feb]
|
||||
description: February 2025 updates.
|
||||
date: 2025-02-01
|
||||
next: false
|
||||
|
||||
prev: false
|
||||
|
||||
footer: true
|
||||
---
|
||||
|
||||
<Post authors="nbats" />
|
||||
|
||||
:::info
|
||||
These update threads only contains major updates. If you're interested
|
||||
in seeing all minor changes you can follow our
|
||||
[Commits Page](https://github.com/fmhy/FMHYedit/commits/main) on GitHub or
|
||||
[Updates Channel](https://redd.it/17f8msf) in Discord.
|
||||
:::
|
||||
|
||||
|
||||
### Wiki Updates
|
||||
|
||||
- Added [Concerts / Live Shows](https://fmhy.net/audiopiracyguide#concerts-live-shows) section to Audio.
|
||||
|
||||
- Added [Genre Specific](https://fmhy.net/audiopiracyguide#genre-specific) section to Audio Downloading.
|
||||
|
||||
- Added [Drinks section](https://fmhy.net/miscguide#drinks) under Food.
|
||||
|
||||
- Moved [Collaboration Platforms](https://fmhy.net/miscguide#collaboration-platforms) out of storage, cleaned up section, and added labels.
|
||||
|
||||
- For individual notes we've stopped linking to pastebins, and instead link our own [GitHub page](https://github.com/fmhy/FMHY/wiki/FMHY‐Notes.md).
|
||||
|
||||
- Added a [Site Grading System](https://github.com/fmhy/FMHY/wiki/Stream-Site-Grading) for streaming to help more fairly sort them. This is currently a work in progress and more categories will be added to further separate sites at the top, such as mobile optimization, ad-free streaming, watch list syncing & more.
|
||||
|
||||
***
|
||||
|
||||
### Stars Added ⭐
|
||||
|
||||
- Starred [DeepSeek](https://fmhy.net/ai#online-chatbots) in Online Chatbots. V3 is unlimited and people seem to be really liking it so far.
|
||||
|
||||
- Starred [AnimeZ](https://fmhy.net/videopiracyguide#anime-streaming) in Anime Streaming. Has fast streams and did well in our polls.
|
||||
|
||||
- Starred [OOMoye](https://fmhy.net/videopiracyguide#download-sites) + [PKMovies](https://fmhy.net/videopiracyguide#drives-directories) under Video Download. Both have big libraries, fast hosts and single click downloads.
|
||||
|
||||
- Starred [Ludusavi](https://fmhy.net/gaming-tools#game-saves) in Game Saves. Feature-rich game save manager that supports all platforms.
|
||||
|
||||
- Starred [TV Garden](https://fmhy.net/videopiracyguide#live-tv) in Live TV. Nice UI, lots of channels and consistent compared to similar options.
|
||||
|
||||
- Starred [PipePipe](https://fmhy.net/android-iosguide#android-youtube-apps) in Android YouTube Apps. Feature-rich fork of NewPipe w/ SponsorBlock / ReturnYTDislikes.
|
||||
|
||||
- Starred [PokéRogue](https://fmhy.net/gaming-tools#pokemon-tools) in Pokémon section. Popular and fun Pokémon dungeon crawler.
|
||||
|
||||
- Starred [WatchParty](https://fmhy.net/video-tools#stream-sync) in Stream Sync. Feature-rich app video sync app that seems to work well for people.
|
||||
|
||||
- Starred [Gifski + EZGif](https://fmhy.net/img-tools#gif-tools) under GIF Tools. High quality GIF creation tools.
|
||||
|
||||
- Starred [Blatant's IPA Library](https://fmhy.net/android-iosguide#telegram-channels-1) in iOS Apps. High quality iOS app releases, stands out compared to similar TG groups.
|
||||
|
||||
- Starred [Reaper](https://fmhy.net/audiopiracyguide#audio-editors) under Audio Editors. Feature-rich digital audio workstation. Says its a trial, but trial never actually ends.
|
||||
|
||||
- Added star back to [SteamGG](https://fmhy.net/gamingpiracyguide#download-games) in Game DDL. Game download site with pre-installs and good hosts, similar to SteamRIP.
|
||||
|
||||
***
|
||||
|
||||
### Things Removed
|
||||
|
||||
- Unstarred Firehawk52 as Deezer ARLs are being nuked instantly now.
|
||||
|
||||
- Unstarred IPALibrary, and replaced it with [CodeVN](https://fmhy.net/android-iosguide#ios-ipas) as this is where IPALibrary sources their apps.
|
48
website/posts/filecr-malware.md
Normal file
48
website/posts/filecr-malware.md
Normal file
|
@ -0,0 +1,48 @@
|
|||
---
|
||||
title: We Removed FileCR as we Found Malware
|
||||
description: Update on FileCR
|
||||
date: 2023-08-14
|
||||
next: false
|
||||
|
||||
prev: false
|
||||
|
||||
footer: true
|
||||
---
|
||||
|
||||
<Post authors="nbats" />
|
||||
|
||||
# FileCR Malware
|
||||
|
||||
Note: The malware is not exclusive to FileCR and we don't have proof FileCR is
|
||||
intentionally hosting it, but they haven't removed it. Possible sources of the
|
||||
malware include some uploaders on sanet, but it seems to be coming from multiple
|
||||
sources.
|
||||
|
||||
Since the malware has been found coming from multiple sources, info about the
|
||||
malware itself has moved to [here](https://rentry.co/big_load_malware). Check
|
||||
there for technical info or to check if you've been infected.
|
||||
|
||||
So far, malware has been found in the following cracks, but it is likely it is
|
||||
undiscovered in many more downloads because of how large their catalog is.
|
||||
|
||||
- https://filecr.com/windows/kms-matrix/
|
||||
- https://filecr.com/windows/windows-activator-by-goddy/
|
||||
- https://filecr.com/windows/stardock-start11
|
||||
- https://filecr.com/windows/malwarebytes-premium
|
||||
- https://filecr.com/windows/navicat-premium (Navicat Premium 16.2.3)
|
||||
- https://filecr.com/windows/outbyte-driver-updater
|
||||
- https://filecr.com/windows/jetbrains-pycharm (Premium release, you need
|
||||
https://greasyfork.org/en/scripts/403170-bypass-filecrypt to access)
|
||||
- https://filecr.com/windows/avast-premier-antivirus
|
||||
|
||||
So far FileCR has not responded at all, which is unusual as they are usually
|
||||
very active and have removed malware in the past as quickly as 6 hours. Because
|
||||
the malware is included in multiple unrelated cracks and because they have not
|
||||
responded at all to reports, they are likely to be in some way involved in
|
||||
spreading or creating the malware. Also, some of the malware had descriptions
|
||||
written just for FileCR, which is unusual, and the description for KMS matrix
|
||||
contains lies about the activation given by the software.
|
||||
|
||||
## [Samples](https://rentry.co/big_load_malware#samples)
|
||||
|
||||
## [Am I infected?](https://rentry.co/big_load_malware#am-i-infected)
|
141
website/posts/jan-2024.md
Normal file
141
website/posts/jan-2024.md
Normal file
|
@ -0,0 +1,141 @@
|
|||
---
|
||||
title: Monthly Updates [Jan] & Happy New Year!
|
||||
description: Happy New Year everyone! We've made a lot of progress this year.
|
||||
date: 2024-01-01
|
||||
next: false
|
||||
|
||||
prev: false
|
||||
|
||||
footer: true
|
||||
---
|
||||
|
||||
<Post authors="nbats,zinklog,Q,Kai,taskylizard" />
|
||||
|
||||
Hi everyone, happy new year! As we bid farewell to '23, let's take a moment to
|
||||
reflect on the remarkable journey FMHY has had this year:
|
||||
|
||||
- We made a new website, enriched with an array of handcrafted features (by me,
|
||||
of course) to enhance your experience and make browsing the wiki pleasant on
|
||||
all devices (mobile included!)
|
||||
- We opened our Discord server and reached 10k members, which introduced many
|
||||
new great people to this community and made contribution easy
|
||||
- We've reached 250k+ members and 31 million views on reddit!
|
||||
- Our FMHYedit repository oversaw an impressive 1k+ pull requests made by the
|
||||
community and merged over 8k commits!
|
||||
- This wiki has grown to be more than just a piracy index, so we felt it's about
|
||||
time other sections get some love. As such, we organized and separated tools
|
||||
sections into their own pages, which allowed us to move a lot of useful tools
|
||||
out of storage and make it a lot easier to discover them
|
||||
- We started the debloat arc of FMHY and went from 27k links to 24k! We've
|
||||
removed a lot of dead, useless, and niche links / categories, as well as
|
||||
re-organized a lot of sections for better clarity and easier navigation
|
||||
|
||||
As we enter 2024, we eagerly anticipate building on our achievements and
|
||||
evolving together. FMHY wouldn't be what it is today without the love and
|
||||
support of everyone in this community. Thank you for being an integral part of
|
||||
FMHY. Here's to another year of growth and success! 💙
|
||||
|
||||
### Wiki Updates
|
||||
|
||||
- Made our own instances for both **[SearX](https://searx.fmhy.net/)** +
|
||||
**[Whoogle](https://whoogle.fmhy.net/)**.
|
||||
|
||||
- Made a [Posts](/posts) page on our site, so you can see all updates without
|
||||
needing reddit. You can also follow via [RSS](/feed.rss).
|
||||
|
||||
- Created a new category for [Social Media Tools](/social-media-tools), and
|
||||
added subsections for popular sites that needed them. (Reddit, Discord,
|
||||
YouTube etc.)
|
||||
|
||||
- Added sections for [Game Soundtracks](/audiopiracyguide#game-soundtracks),
|
||||
[IRC Tools](/downloadpiracyguide#irc-tools) and
|
||||
[Coding AIs](/devtools#coding-ais).
|
||||
|
||||
- Split Career into subsections: [Remote Jobs](/miscguide#remote-jobs),
|
||||
[Tech Jobs](/miscguide#tech-jobs), [Startup](/miscguide#startup) and
|
||||
[Finance / Crypto](/miscguide#finance-crypto)
|
||||
|
||||
- Split Game Mods into subsections:
|
||||
[Mod Indexes](/gamingpiracyguide#mod-indexes) and
|
||||
[Single Mods](/gamingpiracyguide#game-mods)
|
||||
|
||||
- Split News into subsections: [Aggregators](/miscguide#aggregators) and
|
||||
[Tech News](/miscguide#tech-news)
|
||||
|
||||
- Re-organized both
|
||||
[Android Operating Systems](/android-iosguide#operating-systems) +
|
||||
[App Launchers](/android-iosguide#app-launchers), and moved them out of
|
||||
storage.
|
||||
|
||||
---
|
||||
|
||||
### Stars Added ⭐
|
||||
|
||||
- Starred [Braflix](/videopiracyguide#streaming-sites) in Streaming Sites. Fast
|
||||
streams, no ads, nice UI, 4K + 1080p.
|
||||
|
||||
- Starred [Liber3](/readingpiracyguide#ebooks) in Reading Sites. Big library,
|
||||
nice UI, single click downloads.
|
||||
|
||||
- Starred [Screenbox](/video-tools#video-players) in Video Players. Open-source,
|
||||
VLC based video player with nice UI.
|
||||
|
||||
- Starred [Vesktop](/social-media-tools#discord-clients) in Discord Clients.
|
||||
Lightweight desktop client built with Vencord.
|
||||
|
||||
- Starred [SydneyQt](/ai#proprietary-llms) in AI Chatbots. Jailbroken Bing AI.
|
||||
|
||||
- Starred [App Manager](/android-iosguide#foss-apks) in FOSS APKs. Open-source
|
||||
Android app package manager.
|
||||
|
||||
- Starred [scrcpy](/android-iosguide#android-device) in Android Tools. Manage
|
||||
mobile devices via desktop.
|
||||
|
||||
- Starred [KernelSU](/android-iosguide#android-device) in Android Device. Root
|
||||
tool that some people prefer over Magisk.
|
||||
|
||||
- Starred [Onion Browser](/android-iosguide#ios-privacy) in iOS Privacy.
|
||||
Recommended by Tor on their site.
|
||||
|
||||
- Starred [Wii Guide](/gamingpiracyguide#homebrew) in Homebrew.
|
||||
|
||||
- Starred [Video2x](/video-tools#video-tools-1) in Video Tools. Lossless
|
||||
video/GIF/image upscaler.
|
||||
|
||||
- Starred [VCRedist](/system-tools#windows-updates) in Windows Updates. Easily
|
||||
download all Microsoft Visual C++ redists.
|
||||
|
||||
- Starred [CanvasBlocker](/adblockvpnguide#privacy-extensions) in Privacy
|
||||
Extensions. Prevent Javascript API fingerprinting.
|
||||
|
||||
---
|
||||
|
||||
### Things Removed
|
||||
|
||||
- Removed SevenGamers as they've
|
||||
[decided to shut down](https://i.imgur.com/C5sgVqI.png).
|
||||
|
||||
- Removed YasDL as they uploaded a version of StarDock with the same malware
|
||||
that filecr and others have gotten removed for.
|
||||
|
||||
- Removed Torrentz2 as they've stopped indexing new torrents.
|
||||
|
||||
- Unstarred LookMovie as they've added a
|
||||
[10 second wait](https://i.imgur.com/I0D9Hyt.png) before videos play.
|
||||
|
||||
- Unstarred DS4Windows in gaming tools. You can just add games to steam and turn
|
||||
on PS4 controller support by right clicking the game.
|
||||
|
||||
- Unstarred Ideogram as its no longer unlimited.
|
||||
|
||||
- Removed EveryNoiseAtOnce as the dev has been
|
||||
[let go from Spotify](https://i.imgur.com/AaIrcAc.png).
|
||||
|
||||
- Removed CryptoStorm as its [possibly unsafe](https://i.imgur.com/VDlSY1T.png).
|
||||
The owner has no ties to it anymore apparently, but its still hard to trust a
|
||||
company with a history this dark.
|
||||
|
||||
- Removed our backups from NotABug. Their site goes down nearly
|
||||
[every day](https://i.imgur.com/Vx8Ou68.png) at this point, and its become a
|
||||
nightmare to keep 25 wiki pages updated there. If they ever fix their issues
|
||||
we may bring it back.
|
68
website/posts/jan-2025.md
Normal file
68
website/posts/jan-2025.md
Normal file
|
@ -0,0 +1,68 @@
|
|||
---
|
||||
title: Monthly Updates [January]
|
||||
description: January 2025 updates.
|
||||
date: 2025-01-01
|
||||
next: false
|
||||
|
||||
prev: false
|
||||
|
||||
footer: true
|
||||
---
|
||||
|
||||
<Post authors="nbats"/>
|
||||
|
||||
:::info
|
||||
These update threads only contains major updates. If you're interested
|
||||
in seeing all minor changes you can follow our
|
||||
[Commits Page](https://github.com/fmhy/FMHYedit/commits/main) on GitHub or
|
||||
[Updates Channel](https://redd.it/17f8msf) in Discord.
|
||||
:::
|
||||
|
||||
|
||||
### Wiki Updates
|
||||
|
||||
* Created **[guides.fmhy.lol](https://guides.fmhy.lol/)** which lists all the guides we have throughout FMHY.
|
||||
|
||||
* Re-ordered [Game DDL](https://fmhy.net/gamingpiracyguide#download-games) based on [poll results](https://challonge.com/1mqmqrdq). Congrats to CS.RIN for coming out on top.
|
||||
|
||||
* Added both [Sideloading](https://fmhy.net/android-iosguide#ios-sideloading) and [Social Media App](https://fmhy.net/android-iosguide#social-media-apps-1) sections to iOS.
|
||||
|
||||
* Added [Last.fm section](https://fmhy.net/audiopiracyguide#last-fm-tools) to Audio Tracking.
|
||||
|
||||
* Cleaned up Font section + split it into subcategories: [Open Source](https://fmhy.net/text-tools#open-source-freeware) / [Free Fonts](https://fmhy.net/text-tools#free-fonts).
|
||||
|
||||
* Added guides + better descriptions to all the [Jailbreaking Tools](https://fmhy.net/android-iosguide#ios-jailbreaking).
|
||||
|
||||
* Added License Tags to [Stock Photo Sites](https://fmhy.net/img-tools#stock-images).
|
||||
|
||||
* De-bloated [IDEs section](https://fmhy.net/devtools#ides-code-editors) in dev tools.
|
||||
|
||||
---
|
||||
|
||||
### Stars Added ⭐
|
||||
|
||||
* Starred [Image FX](https://fmhy.net/ai#image-generation) in Image Gen + [Video FX](https://fmhy.net/ai#video-generation) in Video Gen. AI generators made by Google, US only.
|
||||
|
||||
* Starred [Alu](https://fmhy.net/adblockvpnguide#proxy-sites) in Proxy Sites. Proxy site similar to things like HolyUnblocker.
|
||||
|
||||
* Starred [Lively](https://fmhy.net/system-tools#wallpaper-managers) in Wallpaper Managers. Feature-rich live wallpaper manager for Windows.
|
||||
|
||||
* Starred [BandLab](https://fmhy.net/audiopiracyguide#browser-editors-synths) in Audio Browser Editors. Popular and feature-rich digital audio workstation.
|
||||
|
||||
* Starred [Kvaesitso](https://fmhy.net/android-iosguide#app-launchers) in Android App Launchers. Feature-rich, search focused launcher.
|
||||
|
||||
* Starred [SideStore](https://fmhy.net/android-iosguide#ios-sideloading) in iOS Sideloading. Fork of AltStore that doesn't require PC.
|
||||
|
||||
* Starred [uYouEnhanced](https://fmhy.net/android-iosguide#ios-youtube-apps) in iOS YouTube apps. Modded YouTube IPA.
|
||||
|
||||
* Starred [The Book of Secret Knowledge](https://fmhy.net/linuxguide#software-sites) in Linux Software. Lists, manuals, cheatsheets, tools and more.
|
||||
|
||||
* Starred [You Don't Need JavaScript](https://fmhy.net/devtools#css) in CSS Tools. Curated list of CSS demos.
|
||||
|
||||
---
|
||||
|
||||
### Things Removed
|
||||
|
||||
* Removed Filehaus as they've [shut down](https://i.imgur.com/aNPHfAN.png)
|
||||
|
||||
* Unstarred GoGoAnime as they're no longer adding new content.
|
96
website/posts/july-2023.md
Normal file
96
website/posts/july-2023.md
Normal file
|
@ -0,0 +1,96 @@
|
|||
---
|
||||
title: Monthly Updates [July]
|
||||
description: July 2023 updates.
|
||||
date: 2023-07-01
|
||||
next: false
|
||||
|
||||
prev: false
|
||||
|
||||
footer: true
|
||||
---
|
||||
|
||||
<Post authors="nbats" />
|
||||
|
||||
:::info
|
||||
These update threads only contains major updates. If you're interested
|
||||
in seeing all minor changes you can follow our
|
||||
[Commits Page](https://github.com/fmhy/FMHYedit/commits/main) on GitHub or
|
||||
[Updates Channel](https://redd.it/17f8msf) in Discord.
|
||||
:::
|
||||
|
||||
### Wiki Updates
|
||||
|
||||
- Added a [Study / Research](/edupiracyguide/#study--research) section to
|
||||
Educational.
|
||||
|
||||
- Added a [Travel](/miscguide/#travel) section to Miscellaneous.
|
||||
|
||||
- Added a [Hardware](/system-tools#hardware-tools) section to System Tools.
|
||||
|
||||
- Added qualities (720p, 1080p) to
|
||||
[Anime Streaming](/videopiracyguide/#anime-streaming) sites.
|
||||
|
||||
- [Combined](/gamingpiracyguide/#steam--epic) Steam / Epic Tools with DLC
|
||||
Unlockers.
|
||||
|
||||
- Linked the ["missing sections"](https://ibb.co/X8K2GTc) in all index pages.
|
||||
i.e. Image Tools, Dev Tools, Storage, Base64, NSFW and Unsafe.
|
||||
|
||||
---
|
||||
|
||||
### Stars Added ⭐
|
||||
|
||||
- Starred [Seez](/videopiracyguide/#multi-hosts) in Streaming Sites. Nice UI,
|
||||
fast 1080p.
|
||||
|
||||
- Starred [SockShare](/videopiracyguide/#dedicated-hosts) in Streaming Sites.
|
||||
Great for obscure TV.
|
||||
|
||||
- Starred [UHDMovies](/videopiracyguide/#download-sites) in Video Download. 4K
|
||||
Movie Host.
|
||||
|
||||
- Starred [Glitchwave](/gamingpiracyguide/#tracking--discovery) in Game
|
||||
Tracking. RYM's new game rating site.
|
||||
|
||||
- Starred [hate5six](/audiopiracyguide/#streaming-sites) in Audio Streaming.
|
||||
Huge collection of live band videos.
|
||||
|
||||
- Starred [SittingOnClouds](/audiopiracyguide/#download-sites) in Audio
|
||||
Download. Game / Anime Soundtracks.
|
||||
|
||||
- Starred [Koalageddon](/gamingpiracyguide/#steam--epic) in Steam / Epic. DLC
|
||||
Unlocker.
|
||||
|
||||
- Starred [SpotC++](/android-iosguide/#ios-audio) in iOS Audio. Spotilife +
|
||||
Sposify IPA.
|
||||
|
||||
- Starred [Favoree](/toolsguide/#youtube-tools) in YouTube Tools. Channel
|
||||
Discovery.
|
||||
|
||||
- Starred [CloakStream](/adblockvpnguide/#browser-tools) in Privacy Tools.
|
||||
Encrypt Download URLs.
|
||||
|
||||
---
|
||||
|
||||
### Things Removed
|
||||
|
||||
- Removed Soap2Day in Streaming Sites as they've shutdown.
|
||||
|
||||
- Unstarred JustChill in Streaming Sites as they've been dealing with DDoS
|
||||
attacks and now require logins.
|
||||
|
||||
- Removed Rinzry in Video Download as drive generators no longer work.
|
||||
|
||||
- Removed Mudome in Audio Streaming as it turned into a NSFW site.
|
||||
|
||||
- Removed Demonoid as they've gone private.
|
||||
|
||||
- Unstarred Imgur in Image Hosts as they've mass deleted everything not tied to
|
||||
accounts.
|
||||
|
||||
- Unstarred IVPN as they've decided to remove
|
||||
[port forwarding](https://www.ivpn.net/blog/gradual-removal-of-port-forwarding/).
|
||||
|
||||
- Removed Chromium from the Unsafe List, as some people feel strongly that
|
||||
[Manifest V3](https://www.eff.org/deeplinks/2021/12/chrome-users-beware-manifest-v3-deceitful-and-threatening)
|
||||
isn't enough justification to label it unsafe.
|
151
website/posts/july-2024.md
Normal file
151
website/posts/july-2024.md
Normal file
|
@ -0,0 +1,151 @@
|
|||
---
|
||||
title: Monthly Updates [July]
|
||||
description: July 2024 updates.
|
||||
date: 2024-07-01
|
||||
next: false
|
||||
|
||||
prev: false
|
||||
|
||||
footer: true
|
||||
---
|
||||
|
||||
<Post authors="nbats"/>
|
||||
|
||||
:::info
|
||||
These update threads only contains major updates. If you're interested
|
||||
in seeing all minor changes you can follow our
|
||||
[Commits Page](https://github.com/fmhy/FMHYedit/commits/main) on GitHub or
|
||||
[Updates Channel](https://redd.it/17f8msf) in Discord.
|
||||
:::
|
||||
|
||||
## Tournament Results
|
||||
|
||||
We did another streaming sites tournament to help us better re-order and clean
|
||||
up the section. When we did this publicly the first time there was obvious
|
||||
cheating, so we decided to make this more private, and allowed only members with
|
||||
discord roles to vote. During each round we also had discussions about the sites
|
||||
which can be viewed in our discord polls channel. These discussions were taken
|
||||
into account when reordering, but for the most part we relied on the voting
|
||||
results.
|
||||
|
||||
In the end some sites managed to keep their previous spots, a few have been
|
||||
starred, unstarred, or even removed if they were low quality / broken. If you
|
||||
see a round with no votes either way, it means one of the sites was DQ'd.
|
||||
|
||||
## [Final Results](https://challonge.com/Multi_Host_Streaming.svg) / [Before vs. After](https://i.imgur.com/MXN0mR5.png)
|
||||
|
||||
We'll be doing more tournaments in the future, so make sure to join our discord
|
||||
if you want to be a part of them, and let us know which sections you'd like to
|
||||
see most.
|
||||
|
||||
---
|
||||
|
||||
### Wiki Updates
|
||||
|
||||
- Added [Stremio Tools](https://fmhy.net/videopiracyguide#stremio-tools) section
|
||||
to Streaming.
|
||||
|
||||
- Added [Video Generation](https://fmhy.net/ai#video-generation) section to AI.
|
||||
|
||||
- Added [Audio Transcription](https://fmhy.net/text-tools#audio-transcription)
|
||||
section to Text Tools.
|
||||
|
||||
- Added [System Audio](https://fmhy.net/system-tools#system-audio) and
|
||||
[USB / Bootloaders](https://fmhy.net/system-tools#usb-bootloaders) sections to
|
||||
System Tools.
|
||||
|
||||
- Added [Network Security](https://fmhy.net/adblockvpnguide#network-security)
|
||||
section to Privacy.
|
||||
|
||||
- Added
|
||||
[Fanfiction / Stories](https://fmhy.net/readingpiracyguide#fanfiction-stories)
|
||||
section to Reading.
|
||||
|
||||
- Added [Audio Metadata](https://fmhy.net/audiopiracyguide#audio-metadata)
|
||||
section to Audio.
|
||||
|
||||
- Added [Wayland Compositors](https://fmhy.net/linuxguide#wayland-compositors)
|
||||
section to Linux.
|
||||
|
||||
- Added [Latex Tools](https://fmhy.net/storage#latex-tools) section to Math.
|
||||
|
||||
- Turned [Email Tools](https://fmhy.net/internet-tools#email-tools) into a main
|
||||
section with subsections.
|
||||
|
||||
- Split Subtitle section into
|
||||
[Tools](https://fmhy.net/videopiracyguide#subtitles) and
|
||||
[Downloads](https://fmhy.net/videopiracyguide#download-subtitles).
|
||||
|
||||
- Added multiple (15) new sections to
|
||||
[Dev Tools](https://fmhy.pages.dev/devtools), and cleaned up a lot of old
|
||||
sections.
|
||||
|
||||
- Cleaned up [Video Hosts](https://fmhy.pages.dev/video-tools#video-file-hosts),
|
||||
[Image Optimization](https://fmhy.net/img-tools#image-optimization) and
|
||||
[Icons / Avatars](https://fmhy.net/img-tools#icons-avatars) sections.
|
||||
|
||||
- Started adding Non-English spellings (i.e. Chinese / 汉语方言) to titles in
|
||||
the [Non-Eng section](https://fmhy.pages.dev/non-english). We haven't been
|
||||
able to translate all the sections yet, so if you can help fill in the blanks
|
||||
please send your translations in the comments.
|
||||
|
||||
---
|
||||
|
||||
### Stars Added ⭐
|
||||
|
||||
- Starred [Hidan](https://fmhy.net/file-tools#file-hosts) in File Hosts. Fast,
|
||||
unlimited size, no account required, publishes when they remove files.
|
||||
|
||||
- Starred [Catppuccin](https://fmhy.net/system-tools#custom-themes) in Custom
|
||||
Themes. High quality pastel system app themes.
|
||||
|
||||
- Starred [Bio Link](https://fmhy.net/internet-tools#link-in-bio-sites) in Link
|
||||
in Bio Sites. Feature-rich, nice UI, stood out to us when going through the
|
||||
section.
|
||||
|
||||
- Starred [RetroAchievements](https://fmhy.net/gamingpiracyguide#emulators) in
|
||||
Emulators. Add achievements to retro games / ROMs.
|
||||
|
||||
- Starred [/r/Translator](https://www.reddit.com/r/translator/) in Translators.
|
||||
Allows you to request translations of almost anything.
|
||||
|
||||
- Starred [sdk.vercel](https://fmhy.net/ai#online-chatbots) in Online Chatbots.
|
||||
Chatbot playground with unlimited GPT-4o.
|
||||
|
||||
- Starred [FossifyOrg](https://fmhy.net/android-iosguide#foss-apks) in FOSS
|
||||
APKs. Covers most basic apps, minimal UI.
|
||||
|
||||
- Starred
|
||||
[Universal Android Debloater](https://fmhy.net/android-iosguide#optimization)
|
||||
in Android Optimization. Updated fork of original UAD.
|
||||
|
||||
- Starred [Amarok](https://fmhy.net/android-iosguide#android-privacy) in Android
|
||||
Privacy. Easily hide private files / apps on android.
|
||||
|
||||
- Starred [Sideloadly](https://fmhy.net/android-iosguide#ios-apps) in iOS Apps.
|
||||
Lightweight, simple setup, auto-updates apps.
|
||||
|
||||
- Starred [EeveeSpotify](https://fmhy.net/android-iosguide#ios-audio) in iOS
|
||||
Audio. Updated Spotify premium app now that spotilife has stopped working.
|
||||
|
||||
- Starred [S0undTV](https://fmhy.net/android-iosguide#smart-tv-firestick) in
|
||||
Firestick. Ad-free Twitch for Firestick.
|
||||
|
||||
- Starred [Uncyclopedia](https://fmhy.net/miscguide#random) in Fun Sites.
|
||||
|
||||
- Added star back to [Bloxstrap](https://fmhy.net/gaming-tools#roblox-tools).
|
||||
Most issues are being fixed and repo seems to be active again.
|
||||
|
||||
---
|
||||
|
||||
### Things Removed
|
||||
|
||||
- Unstarred Vimms, they thought it was trolls at first, but now
|
||||
[Lego and Sega](https://i.ibb.co/Dp9Kwk4/image.png) have both joined to take
|
||||
down games.
|
||||
|
||||
- Unstarred XDM + Motrix, neither is updated as often as other big DL managers
|
||||
and XDM gives people issues on mobile.
|
||||
|
||||
- Unstarred SKLauncher, its closed-source, cant download with adblock enabled,
|
||||
and we have better MC launchers listed anyways.
|
104
website/posts/jun-2023.md
Normal file
104
website/posts/jun-2023.md
Normal file
|
@ -0,0 +1,104 @@
|
|||
---
|
||||
title: Monthly Updates [June]
|
||||
description: June 2023 updates.
|
||||
date: 2023-06-01
|
||||
next: false
|
||||
|
||||
prev: false
|
||||
footer: true
|
||||
---
|
||||
|
||||
<Post authors="nbats" />
|
||||
|
||||
:::info
|
||||
These update threads only contains major updates. If you're interested
|
||||
in seeing all minor changes you can follow our
|
||||
[Commits Page](https://github.com/fmhy/FMHYedit/commits/main) on GitHub or
|
||||
[Updates Channel](https://redd.it/17f8msf) in Discord.
|
||||
:::
|
||||
|
||||
### Wiki Updates
|
||||
|
||||
- Added a [Chess / Checkers](/gamingpiracyguide/#chess--checkers) section to
|
||||
Browser Games.
|
||||
|
||||
- Added a [Stable Diffusion](/ai/#stable-diffusion) section to Artificial
|
||||
Intelligence.
|
||||
|
||||
- Added qualities (720p, 1080p, 4k) to
|
||||
[Video Download](/videopiracyguide/#download-sites) sites.
|
||||
|
||||
- Created a [Git Organization](https://github.com/fmhy) and combined all FMHY
|
||||
related projects into it.
|
||||
|
||||
- Updated the [Beginners Guide](https://rentry.org/Piracy-BG) with new links, a
|
||||
FAQ section and more.
|
||||
|
||||
- Imgur is removing everything not tied to an account, so we've gone through and
|
||||
replaced all our images with ImgBB.
|
||||
|
||||
- Added [Friend Wiki's](https://ibb.co/HCB7BS9) to our sidebar.
|
||||
|
||||
---
|
||||
|
||||
### Stars Added ⭐
|
||||
|
||||
- Starred [Rezi](/storage/#game-download-cse) in Gaming Sites. Multi-site game
|
||||
download search.
|
||||
|
||||
- Starred [Guanaco](https://huggingface.co/spaces/uwnlp/guanaco-playground-tgi),
|
||||
[Call Annie](https://callannie.ai/), [BAI](https://chatbot.theb.ai) and
|
||||
[LMSYS](https://chat.lmsys.org/) in AI Chatbots.
|
||||
|
||||
- Starred [Zoo](https://zoo.replicate.dev/) and
|
||||
[DeepFloyd IF](https://huggingface.co/spaces/DeepFloyd/IF) in Image
|
||||
Generators.
|
||||
|
||||
- Starred [Prompt Engineering Guide](/ai/#chatgpt-prompts) in ChatGPT prompts.
|
||||
|
||||
- Starred [Bark](/ai/#text-to-speech) in Text to Speech.
|
||||
|
||||
- Starred [Firehawk52 Guide](/audiopiracyguide/#download-apps) in Audio
|
||||
Downloading.
|
||||
|
||||
- Starred [store.rg](/downloadpiracyguide/#freeware-sites) in Freeware Sites.
|
||||
|
||||
- Starred [f.lux](/toolsguide/#tweaking) in System Tweaking.
|
||||
|
||||
- Starred [MacroDroid](/android-iosguide/#android-tools) in Android Tools.
|
||||
|
||||
- Starred [Rating Graph](https://www.ratingraph.com/) and
|
||||
[DeepSearch](https://deepsearch.mycelebs.com/movie) in Tracking / Discovery.
|
||||
|
||||
- Starred [Programming Learning Resources](/devtools/#learning--cheat-sheets) in
|
||||
Dev Tools.
|
||||
|
||||
- Starred [CityHop](/audiopiracyguide/#ambient--relaxation) in Ambient /
|
||||
Relaxation.
|
||||
|
||||
- Starred [Knockout](/miscguide/#chat--forums) in Chat / Forums. Made by members
|
||||
of facepunch forums after it shut down.
|
||||
|
||||
---
|
||||
|
||||
### Things Removed
|
||||
|
||||
- Removed and unstarred RARBG as they have decided to
|
||||
[call it quits](https://ibb.co/zxcLTpq).
|
||||
|
||||
- Unstarred Mullvad in VPNs as they are
|
||||
[removing support for port forwarding](https://mullvad.net/en/blog/2023/5/29/removing-the-support-for-forwarded-ports/).
|
||||
|
||||
- Unstarred Patoghu in Download Sites. They've added
|
||||
[persian captchas](https://ibb.co/2SjzZb1) to their downloads, making the site
|
||||
useless to english users.
|
||||
|
||||
- Unstarred MagicBrush in AI Image Generators. Not quite as good as other free
|
||||
options now.
|
||||
|
||||
- Unstarred Authy in Privacy Tools as its not open-source.
|
||||
|
||||
- Unstarred Awesome ChatGPT as its no longer updated.
|
||||
|
||||
- Bromite doesn't seem to be maintained anymore, so we've replaced the main repo
|
||||
with an [autobuild](/android-iosguide/) for now.
|
124
website/posts/june-2024.md
Normal file
124
website/posts/june-2024.md
Normal file
|
@ -0,0 +1,124 @@
|
|||
---
|
||||
title: Monthly Updates [June]
|
||||
description: June 2024 updates
|
||||
date: 2024-06-01
|
||||
next: false
|
||||
|
||||
prev: false
|
||||
|
||||
footer: true
|
||||
---
|
||||
|
||||
<Post authors="nbats"/>
|
||||
|
||||
:::info
|
||||
These update threads only contains major updates. If you're interested
|
||||
in seeing all minor changes you can follow our
|
||||
[Commits Page](https://github.com/fmhy/FMHYedit/commits/main) on GitHub or
|
||||
[Updates Channel](https://redd.it/17f8msf) in Discord.
|
||||
:::
|
||||
|
||||
### Wiki Updates
|
||||
|
||||
- Added [Switch](https://fmhy.net/gaming-tools#switch-homebrew),
|
||||
[WiiU / Wii](https://fmhy.net/gaming-tools#wii-u-wii-homebrew),
|
||||
[3DS / DS](https://fmhy.net/gaming-tools#_3ds-ds-homebrew) and
|
||||
[Playstation](https://fmhy.net/gaming-tools#playstation-homebrew) sections to
|
||||
Homebrew.
|
||||
- Added [Virtual Reality](https://fmhy.net/gamingpiracyguide#virtual-reality)
|
||||
and [Game Save](https://fmhy.net/gaming-tools#game-saves) sections to Gaming.
|
||||
|
||||
- Added [Dev Communities](https://fmhy.net/devtools#dev-communities) and
|
||||
[Reverse Engineering](https://fmhy.net/devtools#reverse-engineering) sections
|
||||
to Dev Tools.
|
||||
|
||||
- Added [Linux Communities](https://fmhy.net/linuxguide#linux-communities)
|
||||
section to Linux.
|
||||
|
||||
- Added [Flights](https://fmhy.net/miscguide#flights) section to Travel.
|
||||
|
||||
- Organized the Maps section, and added multiple
|
||||
[new subsections](https://fmhy.net/miscguide#maps) to it.
|
||||
|
||||
- Debloated [Indexes](https://fmhy.net/miscguide#indexes),
|
||||
[Multi-Tool](https://fmhy.net/miscguide#multi-tool-sites),
|
||||
[File Scanners](https://fmhy.net/adblockvpnguide#file-scanners),
|
||||
[Archiving](https://fmhy.net/internet-tools#archiving) and
|
||||
[Sheet Music](https://fmhy.net/storage#music-sheet-collections) sections.
|
||||
|
||||
- Re-added our
|
||||
[Unsafe Sites Filter](https://github.com/WindowsAurora/FMHYFilterlist/). This
|
||||
can be added to uBlock to stop anything in
|
||||
[unsafe sites](https://fmhy.net/unsafesites) from loading in your browser.
|
||||
|
||||
- We compared FMHY to the badware filter list to make sure we didn't have
|
||||
anything on it, [and we didn't](https://ibb.co/9TQ6Nnv).
|
||||
|
||||
- Added optional [alternative logo](https://pastebin.com/MDnQPKP3) to our
|
||||
website.
|
||||
|
||||
---
|
||||
|
||||
### Stars Added ⭐
|
||||
|
||||
- Starred both squid.wtf and MP3 Daddy in
|
||||
[Audio Ripping](https://fmhy.net/audiopiracyguide#audio-ripping-sites). Deezer
|
||||
ripping sites both capable of getting FLAC files.
|
||||
|
||||
- Starred [Morphic](https://fmhy.net/ai#online-chatbots) in Online Chatbots.
|
||||
GPT4o powered search w/ no limits.
|
||||
|
||||
- Starred [ROM Heaven](https://fmhy.net/gamingpiracyguide#rom-sites) in ROM
|
||||
sites. Badass new ROM site with single click DDL and a high quality UI.
|
||||
|
||||
- Starred [All Things Linux](https://fmhy.net/linuxguide#linux-communities) in
|
||||
Linux Communities. Linux Discord server focused on helping others and
|
||||
learning.
|
||||
|
||||
- Starred [Eaglercraft](https://fmhy.net/gaming-tools#minecraft-tools) in
|
||||
Minecraft as it's started getting updates again.
|
||||
|
||||
- Starred [CompactGUI](https://fmhy.net/file-tools#file-archivers) in File
|
||||
Archivers. Very [useful](https://ibb.co/xm23Xbh) archiver with nice UI.
|
||||
|
||||
- Starred [Spicetify](https://fmhy.net/audiopiracyguide#spotify-adblockers) in
|
||||
Spotify Adblockers. This has adblock plugins that work just as well as SpotX.
|
||||
|
||||
- Starred [UI Revert Script](https://fmhy.net/social-media-tools#reddit-tools)
|
||||
in Reddit Tools. Restores Reddits 2023 UI.
|
||||
|
||||
- Starred [Snaptick](https://fmhy.net/storage#to-do-apps) in Android To-Do Apps.
|
||||
Very feature-rich to-do app.
|
||||
|
||||
- Starred [PurpleAdblock](https://fmhy.net/social-media-tools#twitch-adblockers)
|
||||
in Twitch Adblockers. Got a update recently and seems to be working again.
|
||||
|
||||
- Starred [ImageGlass](https://fmhy.net/img-tools#image-viewers) in Image
|
||||
Viewers. Popular lightweight image viewer with a nice UI.
|
||||
|
||||
- Starred [Neal.fun](https://fmhy.net/storage#fun-indexes) in Fun Indexes. OG
|
||||
site with lots of fun games / experiments.
|
||||
|
||||
- Starred [Pi-hole](https://fmhy.net/adblockvpnguide#dns-adblocking) in DNS
|
||||
Adblockers as their lists are more updated than NextDNS.
|
||||
|
||||
- Starred [ChatGPT](https://fmhy.net/ai#online-chatbots) in Online Chatbots as
|
||||
they're adding GPT4o to
|
||||
[free tier](https://help.openai.com/en/articles/7102672-how-can-i-access-gpt-4-gpt-4-turbo-and-gpt-4o).
|
||||
|
||||
---
|
||||
|
||||
### Things Removed
|
||||
|
||||
- Removed both moo and media drives as neither work anymore.
|
||||
|
||||
- Removed The Movie Archive as its shutdown.
|
||||
|
||||
- Removed Subscene as they've [closed](https://ibb.co/SVX41NW).
|
||||
|
||||
- Removed neofetch as its been archived.
|
||||
|
||||
- Unstarred Bloxstrap as
|
||||
[dev doesn't have time](https://github.com/pizzaboxer/bloxstrap/wiki/Addressing-usability-problems-with-Bloxstrap-v2.5.4) currently to keep it updated.
|
||||
|
||||
- Unstarred NextDNS as their filter lists include negligent ones (like energized) which cause a bunch of issues, including fmhy.net getting blocked.
|
91
website/posts/june-2025.md
Normal file
91
website/posts/june-2025.md
Normal file
|
@ -0,0 +1,91 @@
|
|||
---
|
||||
title: Monthly Updates [June]
|
||||
description: June 2025 updates
|
||||
date: 2025-06-01
|
||||
next: false
|
||||
|
||||
prev: false
|
||||
|
||||
footer: true
|
||||
---
|
||||
|
||||
<Post authors="nbats"/>
|
||||
|
||||
:::info
|
||||
These update threads only contains major updates. If you're interested
|
||||
in seeing all minor changes you can follow our
|
||||
[Commits Page](https://github.com/fmhy/FMHYedit/commits/main) on GitHub or
|
||||
[Updates Channel](https://redd.it/17f8msf) in Discord.
|
||||
:::
|
||||
|
||||
# Wiki Updates
|
||||
|
||||
- All guides written by Dan like **[/coffee/](https://rentry.co/coffeeguide)** & **[/pool/](https://rentry.co/poolguide)** have been compiled in **[/danfmhy/](https://rentry.co/danfmhy/)**.
|
||||
|
||||
- You can now search FMHY using [Brave Goggles](https://github.com/fmhy/bookmarks?tab=readme-ov-file#goggle).
|
||||
|
||||
- Added [Nintendo](https://fmhy.net/gamingpiracyguide#nintendo-roms), [Sony](https://fmhy.net/gamingpiracyguide#sony-roms), and [Resource](https://fmhy.net/gamingpiracyguide#rom-resources) sections to ROMs.
|
||||
|
||||
- Added [Rubik's Cube](https://fmhy.net/gamingpiracyguide#rubiks-cube), [Minesweeper](https://fmhy.net/gamingpiracyguide#minesweeper), and [Crossword](https://fmhy.net/gamingpiracyguide#crossword-puzzles) sections to Puzzles.
|
||||
|
||||
- Added [Game Learning](https://fmhy.net/edupiracyguide#game-learning) section to Educational, with [Rubik's Cube](https://fmhy.net/edupiracyguide#rubiks-cube) + [Chess](https://fmhy.net/edupiracyguide#chess) subsections.
|
||||
|
||||
- Added [Firefox Tools](https://fmhy.net/internet-tools#firefox-tools) section to Internet.
|
||||
|
||||
- Added [Data Breach Monitoring](https://fmhy.net/adblockvpnguide#data-breach-monitoring) section to Privacy.
|
||||
|
||||
- Added [Task Automation](https://fmhy.net/system-tools#task-automation) section to System Tools.
|
||||
|
||||
- Added [Unix-Like](https://fmhy.net/linuxguide#unix-like) section to the bottom of Linux.
|
||||
|
||||
- Added Size Limits + Signup Requirements to [Remote Torrenting](https://fmhy.net/torrentpiracyguide#remote-torrenting) descriptions.
|
||||
|
||||
- Re-organized [Android Audio Players](https://fmhy.net/android-iosguide#android-audio-players) based on [Poll Results](https://i.imgur.com/2FOFOth.png). The four stars are now: Poweramp, Musicolet, VLC, and Foobar.
|
||||
|
||||
- Re-organized [Android Keyboards](https://fmhy.net/android-iosguide#keyboard-tools) based on [Poll Results](https://i.imgur.com/OE8zsC0.png). FUTO managed to keep its top spot, and Heli was bumped up much higher.
|
||||
|
||||
- Re-organized [Live Sports](https://fmhy.net/videopiracyguide#live-sports), removed sites w/ broken or dupe players, and starred a few that seemed to stand out. [Before vs. After](https://i.imgur.com/eDioF9L.png).
|
||||
|
||||
- Re-organized [Radio Streaming](https://fmhy.net/audiopiracyguide#radio-streaming) + [Internet Radio](https://fmhy.net/audiopiracyguide#internet-radio), added new stars, new labels, and moved both sections out of storage.
|
||||
|
||||
- Re-organized [RSS Readers](https://fmhy.net/internet-tools#rss-readers), improved labels, removed bad ones. [Before vs. After](https://i.imgur.com/oAVEC6H.png).
|
||||
|
||||
- Re-organized [Text Adventures](https://fmhy.net/gamingpiracyguide#text-adventures), added labels, and moved out of storage. [Before vs. After](https://i.imgur.com/JrdEDC3.png).
|
||||
|
||||
- Re-organized Dev Tool Sites, moved out of storage, and separated into [Indexes](https://fmhy.net/devtools#dev-tool-indexes) + [Online Toolkits](https://fmhy.net/devtools#online-toolkits). [Before vs. After](https://i.imgur.com/JyJOW9v.png).
|
||||
|
||||
- Updated [grading criteria #4 and #5](https://github.com/fmhy/FMHY/wiki/Stream-Site-Grading) to reward sites that have source auto-switch + episode auto-next working across all their servers. Also merged quality, subtitle, and media type criteria into #1, to simplify scoring, and started giving points for watch party support. This has reduced the total amount of stars, and helped the best sites stand out more. [Before vs. After]( https://i.imgur.com/omYr1pQ.png).
|
||||
|
||||
***
|
||||
|
||||
# Stars Added ⭐
|
||||
|
||||
- Starred [LMArena](https://fmhy.net/ai#image-generation) in Image Gen. Good models, unlimited, no signup required, clear cookies if you're getting errors.
|
||||
|
||||
- Starred [HuggingChat](https://fmhy.net/ai#online-chatbots) in Online Chatbots. Privacy-friendly, lots of models, sign-up required, but temp mail works.
|
||||
|
||||
- Starred [Blip](https://fmhy.net/file-tools#file-transfer) in File Transfer. Easily transfer large files over the internet, or your own devices. Well-liked by everyone in our discord who has tried it.
|
||||
|
||||
- Starred [ImageToolbox](https://fmhy.net/android-iosguide#camera-tools) in Android Image Editors. Open-source, feature-rich, and well maintained.
|
||||
|
||||
- Starred [Parabolic](https://fmhy.net/social-media-tools#youtube-downloaders) in YouTube Downloaders. Open-source, multi-platform, one of the easier to use YT-DLP frontends.
|
||||
|
||||
- Starred [Infinite Backlog](https://fmhy.net/gaming-tools#tracking-databases) in Game Tracking / Databases. Backlogged/Glitchwave competitor with nice UI, achievement integration, and challenges.
|
||||
|
||||
- Starred [GameBanana](https://fmhy.net/gaming-tools#game-mods) in Game Mods. High quality, well-organized, the go-to for certain franchises like Sonic, Celeste, etc.
|
||||
|
||||
- Starred [TETR.IO](https://fmhy.net/gamingpiracyguide#party-multiplayer) in Multiplayer Browser Games. F2P multiplayer Tetris thats popular, feature-rich, and [well-maintained](https://tetr.io/about/patchnotes/) by its devs.
|
||||
|
||||
- Starred [Mario Kart PC](https://fmhy.net/gamingpiracyguide#browser-games) in Browser Games. SNES Style Mario Kart w/ [Custom Maps](https://mkpc.malahieude.net/creations.php) & Multiplayer.
|
||||
|
||||
- Starred [RootlessJamesDSP](https://fmhy.net/android-iosguide#android-audio) in Android Audio Equalizers. Open-source, supports many apps, AutoEQ support, good Poweramp alt.
|
||||
|
||||
- Starred [Plonk It](https://fmhy.net/gamingpiracyguide#geoguessr-games) in GeoGuessr Games. Active community for learning GeoGuessr.
|
||||
|
||||
- Starred [Zed](https://fmhy.net/ai#coding-ais) in Coding AIs. Collaborative coding AI, getting positive attention from [HackerNews](https://news.ycombinator.com/item?id=43959710) + our members.
|
||||
|
||||
***
|
||||
|
||||
# Things Removed
|
||||
|
||||
- Unstarred OOMoye as their library seems a lot smaller now, and their search is still broken.
|
65
website/posts/mar-2025.md
Normal file
65
website/posts/mar-2025.md
Normal file
|
@ -0,0 +1,65 @@
|
|||
---
|
||||
title: Monthly Updates [March]
|
||||
description: March 2025 updates
|
||||
date: 2025-03-01
|
||||
next: false
|
||||
|
||||
prev: false
|
||||
|
||||
footer: true
|
||||
---
|
||||
|
||||
<Post authors="nbats"/>
|
||||
|
||||
:::info
|
||||
These update threads only contains major updates. If you're interested
|
||||
in seeing all minor changes you can follow our
|
||||
[Commits Page](https://github.com/fmhy/FMHYedit/commits/main) on GitHub or
|
||||
[Updates Channel](https://redd.it/17f8msf) in Discord.
|
||||
:::
|
||||
|
||||
### Wiki Updates
|
||||
|
||||
- Re-ordered [AI image generators](https://fmhy.net/ai#image-generation) based on [poll results](https://challonge.com/xfu596g9). Thanks to everyone who voted, and congrats to NexusAI Image for coming out on top.
|
||||
|
||||
- Separated [Image Hosts](https://fmhy.net/img-tools#image-hosts) & [Online Galleries](https://fmhy.net/img-tools#online-galleries) into their own subsections + added size, file retention, and signup requirement tags.
|
||||
|
||||
- Split Web Hosting Sites into [Dynamic](https://fmhy.net/storage#dynamic-page-hosting), [Static](https://fmhy.net/storage#static-page-hosting) & [Builders](https://fmhy.net/storage#website-builders) + added space, monthly transfer and traffic tags to each.
|
||||
|
||||
- Separated [RSS Tools](https://fmhy.net/internet-tools#rss-tools) & [Bookmark Tools](https://fmhy.net/internet-tools#bookmark-tools) into their own subsections.
|
||||
|
||||
- Moved [Voice Removal / Separation](https://fmhy.net/ai#voice-removal-separation) from storage to its own section in AI. [Before vs. After](https://i.imgur.com/sPqq1v3.png).
|
||||
|
||||
- Added mobile optimization scores for all the [streaming sites](<https://github.com/fmhy/FMHY/wiki/Stream-Site-Grading>).
|
||||
|
||||
- Added tags / labels to [Image Upscalers](https://fmhy.net/img-tools#upscale-restore) section.
|
||||
|
||||
---
|
||||
|
||||
### Stars Added ⭐
|
||||
|
||||
- Starred [files.vc](https://fmhy.net/file-tools#file-hosts) in File Hosts. 10GB per file, no expiration, unlimited files.
|
||||
|
||||
- Starred [AB Download Manager](https://fmhy.net/file-tools#download-managers) in Download Managers. Manager that is open-source, well maintained, feature-rich, and nice to look at.
|
||||
|
||||
- Starred [lossless-cut](https://fmhy.net/video-tools#video-editors) in Video Editors. Feature-rich editor that that preserves quality / metadata for FFMPEG.
|
||||
|
||||
- Starred [wide.video](https://fmhy.net/video-tools#online-editors) in Online Video Editors. Feature-rich and stands out a lot compared to similar options.
|
||||
|
||||
- Starred [Footballia](https://fmhy.net/videopiracyguide#sports-replays) in Sports Replays. Full classic football matches.
|
||||
|
||||
- Starred [Geotastic](https://fmhy.net/gamingpiracyguide#geoguessr-games) in GeoGuessr Games. Seems to stand out compared to similar options.
|
||||
|
||||
- Starred [DAREBEE + r/BodyweightFitness Wiki](https://fmhy.net/miscguide#workout-exercise) in Workout. Multiple fitness routines, both seem to be well liked by the community.
|
||||
|
||||
- Re-starred [Stacher](https://fmhy.net/social-media-tools#youtube-downloaders) in YouTube Downloaders. People felt as though a good YT-DLP GUI was worth having starred again.
|
||||
|
||||
- Starred [UVR5_UI](https://fmhy.net/ai#voice-removal-separation) in Voice Removal. Online voice removal tool that seems to work well.
|
||||
|
||||
---
|
||||
|
||||
### Things Removed
|
||||
|
||||
- Removed Malwarebytes crack as it no longer works.
|
||||
|
||||
- Unstarred Go Speed as people don't feel its as good as other options anymore.
|
109
website/posts/march-2024.md
Normal file
109
website/posts/march-2024.md
Normal file
|
@ -0,0 +1,109 @@
|
|||
---
|
||||
title: Monthly Updates [March]
|
||||
description: March 2024 Updates
|
||||
date: 2024-03-01
|
||||
next: false
|
||||
|
||||
prev: false
|
||||
|
||||
footer: true
|
||||
---
|
||||
|
||||
<Post authors="nbats"/>
|
||||
|
||||
:::info These update threads only contains major updates. If you're interested
|
||||
in seeing all minor changes you can follow our
|
||||
[Commits Page](https://github.com/fmhy/FMHYedit/commits/main) on GitHub or
|
||||
[Updates Channel](https://redd.it/17f8msf) in Discord. :::
|
||||
|
||||
### Wiki Updates
|
||||
|
||||
- Added custom search engines (CSE) for
|
||||
[Courses](https://cse.google.com/cse?cx=f7a118c70d0804fc4) and
|
||||
[Fonts](https://cse.google.com/cse?cx=82154ebab193e493d).
|
||||
|
||||
- Added section for
|
||||
[Productivity Tools](https://fmhy.net/miscguide#productivity-tools) in Useful
|
||||
Sites.
|
||||
|
||||
- Added section for [File Recovery](https://fmhy.net/file-tools#file-recovery)
|
||||
in File Tools.
|
||||
|
||||
- Added section for
|
||||
[Fingerprinting / Tracking](https://fmhy.net/adblockvpnguide#fingerprinting-tracking)
|
||||
in Privacy.
|
||||
|
||||
- Added sections for
|
||||
[Mario Kart](https://fmhy.net/gamingpiracyguide#mario-kart-tools) +
|
||||
[Geometry Dash](https://fmhy.net/gamingpiracyguide#geometry-dash-tools) in
|
||||
Gaming.
|
||||
|
||||
- Added section for
|
||||
[Crypto / Bitcoin](https://fmhy.net/miscguide#crypto-bitcoin) in Career.
|
||||
|
||||
- Added section for [Raspberry Pi](https://fmhy.net/linuxguide#raspberry-pi) in
|
||||
Linux.
|
||||
|
||||
- Added sections for [Design Apps](https://fmhy.net/img-tools#design-apps) +
|
||||
[Design Assets](https://fmhy.net/img-tools#free-assets) in Image Tools.
|
||||
|
||||
- Our Minecraft Server is now live. Click
|
||||
**[here](https://fmhy.net/posts/minecraft-server)** to join.
|
||||
|
||||
---
|
||||
|
||||
### Stars Added ⭐
|
||||
|
||||
- Starred
|
||||
[yet another music server](https://fmhy.net/audiopiracyguide#audio-downloading)
|
||||
in Audio Downloading. Multi-site DDL (deezer, qobuz, tidal, spotify, youtube,
|
||||
FLAC.)
|
||||
|
||||
- Starred [wrtn](https://fmhy.net/ai#online-chatbots) in Online Chatbots. No
|
||||
limit GPT-4, tell it to always talk in english.
|
||||
|
||||
- Starred
|
||||
[M4UFree + YesMovies](https://fmhy.net/videopiracyguide#streaming-sites) in
|
||||
Streaming. Both have huge libraries, fast 1080p, and have been around for over
|
||||
a decade.
|
||||
|
||||
- Starred [Poe](https://fmhy.net/ai#online-generators) in Image Generators. 100
|
||||
SDXL and 100 Playground Gens.
|
||||
|
||||
- Starred
|
||||
[Simply Optimized](https://fmhy.net/storage#minecraft-optimization-mods) in
|
||||
Minecraft Optimization. Some prefer this to Fabulously Optimized.
|
||||
|
||||
- Starred [SolidTorrents](https://fmhy.net/torrentpiracyguide#aggregators) in
|
||||
Torrent Aggregators.
|
||||
|
||||
- Starred [MrGamingStreams](https://fmhy.net/videopiracyguide#live-tv-sports) in
|
||||
Live TV. Fast streams, nice UI, no ads.
|
||||
|
||||
- Starred [720pier](https://fmhy.net/videopiracyguide#sports-streaming) in
|
||||
Sports Streaming. Sport replay torrents.
|
||||
|
||||
- Starred
|
||||
[Enhancer for YT](https://fmhy.net/social-media-tools#youtube-customization)
|
||||
in YouTube Customization. YouTube enhancement extension.
|
||||
|
||||
- Starred [RatS](https://fmhy.net/videopiracyguide#tracking-discovery) in
|
||||
Tracking / Discovery. Sync media ratings between sites.
|
||||
|
||||
---
|
||||
|
||||
### Things Removed
|
||||
|
||||
- Removed Vendetta from Android as the devs have
|
||||
[shut it down](https://i.imgur.com/F4o2ela.png).
|
||||
|
||||
- Removed TTV LOL as it stopped working.
|
||||
|
||||
- Unstarred bypass.vip and FastForward as they
|
||||
[don't work as well](https://i.imgur.com/EMRcqX6.png) as they used to.
|
||||
|
||||
- Unstarred claude in chatbots as it requires email + phone number and doesn't
|
||||
give as good results as it used to.
|
||||
|
||||
- Unstarred Harmonoid as its not longer being updated and has 100+ issues on
|
||||
github.
|
87
website/posts/may-2023.md
Normal file
87
website/posts/may-2023.md
Normal file
|
@ -0,0 +1,87 @@
|
|||
---
|
||||
title: Monthly Updates [May]
|
||||
description: May 2023 updates.
|
||||
date: 2023-05-01
|
||||
next: false
|
||||
|
||||
prev: false
|
||||
|
||||
footer: true
|
||||
---
|
||||
|
||||
<Post authors="nbats"/>
|
||||
|
||||
:::info
|
||||
These update threads only contains major updates. If you're interested
|
||||
in seeing all minor changes you can follow our
|
||||
[Commits Page](https://github.com/fmhy/FMHYedit/commits/main) on GitHub or
|
||||
[Updates Channel](https://redd.it/17f8msf) in Discord.
|
||||
:::
|
||||
|
||||
### Wiki Updates
|
||||
|
||||
- Added **[The Piracy Glossary ☠️](https://rentry.org/The-Piracy-Glossary)**,
|
||||
where we've organized and given explanations to every piracy related term we
|
||||
could think of.
|
||||
|
||||
- Added Optimization, Tweaking, Virtual Machines and Terminal / CLI subsections
|
||||
to [System Tools](/system-tools).
|
||||
|
||||
- Added Chat / Forums, Image / Video, Interactive, Interesting and Random
|
||||
subsections to [Fun Sites](/miscguide/#fun-sites).
|
||||
|
||||
- Added [Gardening](/miscguide/#gardening) section to Miscellaneous.
|
||||
|
||||
- Made a [Software CSE](/downloadpiracyguide/#software-sites) out of the
|
||||
software sites.
|
||||
|
||||
---
|
||||
|
||||
### Stars Added ⭐
|
||||
|
||||
- Starred [Torrminatorr](/gamingpiracyguide/#download-games) in Gaming Sites.
|
||||
Tormminatorr is back!
|
||||
|
||||
- Starred [GOG Games](/gamingpiracyguide/#download-games) in Gaming Sites. Gog
|
||||
is back on clearnet!
|
||||
|
||||
- Starred [FileCR](/downloadpiracyguide/#software-sites) in Software Sites.
|
||||
FileCR has removed their anti-adblock.
|
||||
|
||||
- Starred [Streaminal-TV](/videopiracyguide/#dedicated-hosts) in Streaming
|
||||
Sites. Nice UI, fast 1080p.
|
||||
|
||||
- Starred [TokyoInsider](/videopiracyguide/#anime-downloading) in Anime
|
||||
Downloading. Anime site with single click DDLs.
|
||||
|
||||
- Starred [Cubari](/readingpiracyguide/#manga-sites) in Manga Sites. Multi-site
|
||||
manga scraper.
|
||||
|
||||
- Starred [FoxyTab](https://addons.mozilla.org/en-US/firefox/addon/foxytab/),
|
||||
[Zoom Page WE](https://addons.mozilla.org/en-US/firefox/addon/zoom-page-we/)
|
||||
and
|
||||
[Scroll Anywhere](https://addons.mozilla.org/en-US/firefox/addon/scroll_anywhere/)
|
||||
in Browser Extensions.
|
||||
|
||||
- Starred [PokeSmash](/miscguide/#random) in Fun Sites.
|
||||
|
||||
- Re-added + starred [WCO](/videopiracyguide/#cartoon-streaming) in Cartoon
|
||||
Streaming. This went paid for a bit, but seems to be free again.
|
||||
|
||||
- Re-added + starred [CloudStream](/android-iosguide/#android-streaming) in
|
||||
Android Streaming. Some extensions are still getting updates.
|
||||
|
||||
---
|
||||
|
||||
### Things Removed
|
||||
|
||||
- Unstarred WebOasis in Indexes. Doesn't seem to be getting updated anymore. RIP
|
||||
Webby.
|
||||
|
||||
- Unstarred UniqueStream, HDMovieBox and Pirate-Media in streaming for being
|
||||
slow / dead.
|
||||
|
||||
- Unstarred Soft98 in software as most downloads are dead.
|
||||
|
||||
- Removed Midjourney in Image Gen as its
|
||||
[no longer free](https://youtu.be/EHnUydrurmk).
|
120
website/posts/may-2024.md
Normal file
120
website/posts/may-2024.md
Normal file
|
@ -0,0 +1,120 @@
|
|||
---
|
||||
title: Monthly Updates [May]
|
||||
description: May 2024 updates
|
||||
date: 2024-05-01
|
||||
next: false
|
||||
|
||||
prev: false
|
||||
|
||||
footer: true
|
||||
---
|
||||
|
||||
<Post authors="nbats"/>
|
||||
|
||||
:::info
|
||||
These update threads only contains major updates. If you're interested
|
||||
in seeing all minor changes you can follow our
|
||||
[Commits Page](https://github.com/fmhy/FMHYedit/commits/main) on GitHub or
|
||||
[Updates Channel](https://redd.it/17f8msf) in Discord.
|
||||
:::
|
||||
|
||||
### Wiki Updates
|
||||
|
||||
- Added [Multi-Game](https://fmhy.net/gamingpiracyguide#multi-game-sites),
|
||||
[Party](https://fmhy.net/gamingpiracyguide#party-games),
|
||||
[Shooter](https://fmhy.net/gamingpiracyguide#shooter),
|
||||
[Platforming](https://fmhy.net/gamingpiracyguide#platformer),
|
||||
[Simulation](https://fmhy.net/gamingpiracyguide#simulation),
|
||||
[Arcade](https://fmhy.net/gamingpiracyguide#arcade) and
|
||||
[RPG](https://fmhy.net/gamingpiracyguide#rpg) sections to Browser Games.
|
||||
|
||||
- Added [Med School](https://fmhy.net/edupiracyguide#med-school),
|
||||
[Philosophy](https://fmhy.net/edupiracyguide#philosophy) and
|
||||
[Geography](https://fmhy.net/edupiracyguide#geography-datasets) sections to
|
||||
Education.
|
||||
|
||||
- Added [Linux Guides](https://fmhy.net/linuxguide#linux-guides) and
|
||||
[Window Managers](https://fmhy.net/linuxguide#window-managers) sections to
|
||||
Linux.
|
||||
|
||||
- Added [Public Domain](https://fmhy.net/readingpiracyguide#public-domain)
|
||||
section to Reading.
|
||||
|
||||
- Added [German](https://fmhy.net/edupiracyguide#german) section to Language
|
||||
Learning.
|
||||
|
||||
- Renamed Audio Download to
|
||||
[Audio Ripping](https://fmhy.net/audiopiracyguide#audio-ripping), cleaned up
|
||||
the section, and separated sites and tools into their own subsections.
|
||||
|
||||
- Cleaned up
|
||||
[qBittorrent Tools](https://fmhy.net/torrentpiracyguide#qbittorrent-tools),
|
||||
[Paywall Bypass](https://fmhy.net/internet-tools#paywall-bypass),
|
||||
[Pastebins](https://fmhy.pages.dev/text-tools#pastebins) and
|
||||
[OSINT](https://fmhy.net/internet-tools#open-source-intelligence) sections.
|
||||
|
||||
- Moved [Periodic Tables](https://fmhy.net/edupiracyguide#periodic-tables),
|
||||
[Quotes](https://fmhy.net/edupiracyguide#quote-indexes),
|
||||
[File Scanners](https://fmhy.net/adblockvpnguide#file-scanners) and
|
||||
[Sheet Music](https://fmhy.net/audiopiracyguide#sheet-music) out of storage
|
||||
into main sections.
|
||||
|
||||
- Moved [Gaming Tools](https://fmhy.net/gaming-tools) out of gaming onto its own
|
||||
page.
|
||||
|
||||
- Separated [Painting](https://fmhy.net/img-tools#painting) and
|
||||
[Drawing](https://fmhy.net/img-tools#drawing) into their own sections.
|
||||
|
||||
---
|
||||
|
||||
### Stars Added ⭐
|
||||
|
||||
- Starred [Debloat Guide](https://fmhy.net/system-tools#system-debloating) in
|
||||
System Debloating. Collaborative project by our discord members, let us know
|
||||
what you think or if you have any suggestions for it.
|
||||
|
||||
- Starred [Nunflix](https://fmhy.net/videopiracyguide#multi-server) in
|
||||
Streaming. Multi-server streaming with fast hosts and nice UI.
|
||||
|
||||
- Starred [Game Bounty](https://fmhy.net/downloadpiracyguide#software-sites) in
|
||||
Software as they've started uploading software recently.
|
||||
|
||||
- Starred [FastStream](https://fmhy.net/videopiracyguide#helpful-sites-tools) in
|
||||
Streaming Tools. Fragmentation streaming which speeds up browser video
|
||||
buffering.
|
||||
|
||||
- Starred [Mumble](https://fmhy.net/internet-tools#chat-tools) in Chat Tools.
|
||||
Oldschool voice chat client used and loved by many.
|
||||
|
||||
- Starred [Tixati](https://fmhy.net/torrentpiracyguide#torrent-clients) in
|
||||
Torrent Clients. Simple client still popular in some circles.
|
||||
|
||||
- Starred [SpecialK](https://fmhy.net/gaming-tools#optimization-tools) in Gaming
|
||||
Optimization. Feature-rich game optimization tool.
|
||||
|
||||
- Starred [qView](https://fmhy.net/img-tools#image-viewers) in Image Viewers.
|
||||
Minimal and efficient open-source image viewer.
|
||||
|
||||
- Starred [SauceNAO](https://fmhy.net/img-tools#reverse-image-search) in Reverse
|
||||
Image Search. Multi-site search engine.
|
||||
|
||||
- Starred [Puter](https://fmhy.net/system-tools#os-emulators) in OS Emulators.
|
||||
Session saving browser operating system.
|
||||
|
||||
- Starred [playit.gg](https://fmhy.net/storage#minecraft-servers) in Minecraft
|
||||
Servers. Easy to setup minecraft servers.
|
||||
|
||||
- Starred
|
||||
[MCPropertyEncyclopedia](https://fmhy.net/gaming-tools#minecraft-tools) in
|
||||
Minecraft Tools. Comprehensive block info database.
|
||||
|
||||
- Starred
|
||||
[Shazam + WatZatSong](https://fmhy.net/audiopiracyguide#song-identification)
|
||||
in Song Identification. Popular song identification tools.
|
||||
|
||||
---
|
||||
|
||||
### Things Removed
|
||||
|
||||
- Removed MrGamingStreams as they've shutdown.
|
||||
- Removed IDM Activation Script as its been archived.
|
87
website/posts/may-2025.md
Normal file
87
website/posts/may-2025.md
Normal file
|
@ -0,0 +1,87 @@
|
|||
---
|
||||
title: Monthly Updates [May]
|
||||
description: May 2025 updates.
|
||||
date: 2025-05-01
|
||||
next: false
|
||||
|
||||
prev: false
|
||||
|
||||
footer: true
|
||||
---
|
||||
|
||||
<Post authors="nbats"/>
|
||||
|
||||
:::info
|
||||
These update threads only contains major updates. If you're interested
|
||||
in seeing all minor changes you can follow our
|
||||
[Commits Page](https://github.com/fmhy/FMHYedit/commits/main) on GitHub or
|
||||
[Updates Channel](https://redd.it/17f8msf) in Discord.
|
||||
:::
|
||||
|
||||
# Wiki Updates
|
||||
|
||||
- Made a FMHY [Redlib Instance](https://redlib.fmhy.net/r/FREEMEDIAHECKYEAH/wiki/index) + our [SearXNG](https://searx.fmhy.net/) is working again too.
|
||||
|
||||
- Added [ARPG / MMORPG](https://fmhy.net/gaming-tools#arpg-mmorpg-tools) section in Gaming Tools.
|
||||
|
||||
- Added [STEM](https://fmhy.net/readingpiracyguide#stem-resources) + [Kindle Tools](https://fmhy.net/readingpiracyguide#kindle-tools) sections in Reading.
|
||||
|
||||
- Added [Disc Utilities](https://fmhy.net/video-tools#disc-utilities) + [Video Enhancement / Effects](https://fmhy.net/video-tools#video-enhancement-effects) sections in Video Tools.
|
||||
|
||||
- Split Steam / Epic section into subsections: [Client Tools](https://fmhy.net/gaming-tools#client-tools), [DLC Unlock / DRM Bypass](https://fmhy.net/gaming-tools#dlc-unlock-drm-bypass), [Steam Store](https://fmhy.net/gaming-tools#steam-store).
|
||||
|
||||
- Split macOS section into subsections: [Video](https://fmhy.net/linuxguide#mac-video), [Audio](https://fmhy.net/linuxguide#mac-audio), [Image](https://fmhy.net/linuxguide#mac-images), [Internet](https://fmhy.net/linuxguide#mac-internet), [System](https://fmhy.net/linuxguide#system-tools), [File](https://fmhy.net/linuxguide#file-tools-1).
|
||||
|
||||
- Split PDF Tools into subsections: [Online Toolkits](https://fmhy.net/file-tools#online-pdf-toolkits), [Offline Toolkits](https://fmhy.net/file-tools#offline-pdf-toolkits), [Conversion](https://fmhy.net/file-tools#pdf-conversion-tools), [Utilities](https://fmhy.net/file-tools#pdf-utilities).
|
||||
|
||||
- Split Video Processing into [Programs](https://fmhy.net/video-tools#processing-encoding) and [Online](https://fmhy.net/video-tools#online-processing) sections.
|
||||
|
||||
- Re-organized & added labels to [Android Text Editors](https://fmhy.net/storage#android-text-editors), [Note-Taking](https://fmhy.net/storage#note-taking) and [To-Do](https://fmhy.net/storage#to-do-apps). [Before vs. After](https://i.imgur.com/JyGeAsi.jpeg)
|
||||
|
||||
- Re-organized & added labels to [Ambient Sound Mixers](https://fmhy.net/storage#ambient-sound-mixers) and [Android Browsers](https://fmhy.net/storage#android-browsers). [Before vs. After](https://i.imgur.com/F48u9pk.png)
|
||||
|
||||
- Re-organized & added labels to [Website Templates](https://fmhy.net/storage#website-templates), [Wordpress Themes](https://fmhy.net/storage#wordpress-themes) and [YouTube Movies](https://fmhy.net/videopiracyguide#free-w-ads). [Before vs. After](https://i.imgur.com/Q84jTaz.png)
|
||||
|
||||
- Re-organized [Manga Section](https://fmhy.net/readingpiracyguide#manga) based on [Poll Results](https://challonge.com/lzbv9baj/). Congrats to ComicK for coming out on top.
|
||||
|
||||
- Moved [Website Generators](https://fmhy.net/devtools#website-generators) out of storage, re-organized, and added labels. [Before vs. After](https://i.imgur.com/V1DWN9D.jpeg)
|
||||
|
||||
- Moved [3D Modeling + CAD Sections](https://fmhy.net/img-tools#_3d-models) out of storage, re-organized, and added labels. [Before vs. After](https://i.imgur.com/4V41Zdx.png)
|
||||
|
||||
- All media tracking sections have now been split into Tracking / Databases and Recommendations. This applies to Streaming, Gaming, Reading, and Audio sections.
|
||||
|
||||
***
|
||||
|
||||
# Stars Added ⭐
|
||||
|
||||
- Starred [AnimeKai](https://fmhy.net/videopiracyguide) in Anime Streaming. Feature-rich, huge library, fast servers. People seem to really like it, so we've moved it to the #1 spot.
|
||||
|
||||
- Starred both [111477 + DramaSuki](https://fmhy.net/videopiracyguide#drives-directories) in Drives / Directories. Both have fast speeds and lots of content.
|
||||
|
||||
- Starred [BatCave](https://fmhy.net/readingpiracyguide#comics) in Comic Sites. New comic site with tracking, ratings, and a nice UI.
|
||||
|
||||
- Starred [PairDrop](https://fmhy.net/file-tools#p2p-transfer) in P2P File Transfer. Open-source, easy to use, allows creating rooms.
|
||||
|
||||
- Starred [Five Books](https://fmhy.net/readingpiracyguide#curated-recommendations) in Book Recommendations. Expert recommended top 5 lists with lots of categories.
|
||||
|
||||
- Starred [VideoGameCanon](https://fmhy.net/gaming-tools#curated-recommendations) in Game Recommendations. Game top 1000 list that people in our server find useful.
|
||||
|
||||
- Starred [Mini QR](https://fmhy.net/internet-tools#url-tools) in URL Tools. Lets you create custom QR code art.
|
||||
|
||||
- Starred [Table Habit](https://fmhy.net/android-iosguide#productivity-trackers) in Android Productivity Trackers. Open-source, updated regularly, and has a nice UI.
|
||||
|
||||
- Starred both [BGBye + pixelcut](https://fmhy.net/storage#background-removers) in Background Removers as they seemed to work the best.
|
||||
|
||||
- Starred [EncycloSearch](https://encyclosearch.org/) in Encyclopedias. Combines two dozen encyclopedias into one search engine.
|
||||
|
||||
- Starred [Exact Audio Copy](https://fmhy.net/audiopiracyguide#audio-ripping-tools) in Audio Ripping. Popular CD ripping tool, recommended in Redacted's interview guide.
|
||||
|
||||
- Switched to [AI Studio](https://fmhy.net/ai#online-chatbots) as Google's main chatbot as it works well on mobile, is less laggy, has chat history, and less censorship than Gemini.
|
||||
|
||||
- Added [Free-Official-Youtube-Content](https://fmhy.net/videopiracyguide#free-w-ads) as a index emoji in Free w/ Ads. Not a star, but I feel its good enough to mention.
|
||||
|
||||
***
|
||||
|
||||
# Things Removed
|
||||
|
||||
- Removed Revanced MMT as its no longer maintained.
|
37
website/posts/new-site.md
Normal file
37
website/posts/new-site.md
Normal file
|
@ -0,0 +1,37 @@
|
|||
---
|
||||
title: New Website
|
||||
description: Our brand new site (which you're on currently)
|
||||
date: 2023-11-12
|
||||
next: false
|
||||
|
||||
prev: false
|
||||
|
||||
footer: true
|
||||
---
|
||||
|
||||
<Post authors="taskylizard" />
|
||||
|
||||
### New URL: https://fmhy.net/
|
||||
|
||||
Hey everyone, just wanted to let you all know that we're finally done with the
|
||||
new website, and are officially launching it today! I know a lot of different
|
||||
versions of FMHY have been made over the years, but we've put a ton of effort
|
||||
into this one, and honestly feel like its the best version to date.
|
||||
|
||||
We really hope you enjoy it, and if you have any issues or suggestions feel free
|
||||
to leave them in the comments here, or by using the new feedback system built
|
||||
into the site.
|
||||
|
||||
---
|
||||
|
||||
### Site Features
|
||||
|
||||
- Star Only Toggle
|
||||
- Dark / Light Modes
|
||||
- Feedback System
|
||||
- Improved UI + Site Speed
|
||||
- Improved Search Functionality
|
||||
- Automatic Updates
|
||||
- Table of Content Sidebars
|
||||
- Storage URLs Direct to Site Rather than Reddit
|
||||
- NSFW Section
|
134
website/posts/nov-2023.md
Normal file
134
website/posts/nov-2023.md
Normal file
|
@ -0,0 +1,134 @@
|
|||
---
|
||||
title: Monthly Updates [November]
|
||||
description: October 2023 updates.
|
||||
date: 2023-11-01
|
||||
next: false
|
||||
|
||||
prev: false
|
||||
|
||||
footer: true
|
||||
---
|
||||
|
||||
<Post authors="nbats"/>
|
||||
|
||||
:::info
|
||||
These update threads only contains major updates. If you're interested
|
||||
in seeing all minor changes you can follow our
|
||||
[Commits Page](https://github.com/fmhy/FMHYedit/commits/main) on GitHub or
|
||||
[Updates Channel](https://redd.it/17f8msf) in Discord.
|
||||
:::
|
||||
|
||||
### Wiki Updates
|
||||
|
||||
- We've started work on a **[New Website](https://fmhy.net)**. Keep in mind this
|
||||
is still in beta, and will eventually be moved to our main domains once we
|
||||
feel its ready.
|
||||
|
||||
- Added
|
||||
[Hosting](https://www.reddit.com/r/FREEMEDIAHECKYEAH/wiki/dev-tools#wiki_.25B7_hosting_tools),
|
||||
[Cybersecurity](https://www.reddit.com/r/FREEMEDIAHECKYEAH/wiki/dev-tools#wiki_.25BA_cybersecurity_tools)
|
||||
and
|
||||
[Database](https://www.reddit.com/r/FREEMEDIAHECKYEAH/wiki/dev-tools#wiki_.25BA_database_tools)
|
||||
sections to Dev Tools.
|
||||
|
||||
- Added
|
||||
[Privacy Frontends](https://www.reddit.com/r/FREEMEDIAHECKYEAH/wiki/adblock-vpn-privacy#wiki_.25B7_frontends)
|
||||
section to Privacy Tools.
|
||||
|
||||
- Added
|
||||
[Fediverse Tools](https://www.reddit.com/r/FREEMEDIAHECKYEAH/wiki/tools-misc#wiki_.25B7_fediverse_tools)
|
||||
section to Tools.
|
||||
|
||||
- Split Git Tools into two sections:
|
||||
[Git](https://www.reddit.com/r/FREEMEDIAHECKYEAH/wiki/dev-tools#wiki_.25B7_git_tools)
|
||||
/
|
||||
[GitHub](https://www.reddit.com/r/FREEMEDIAHECKYEAH/wiki/dev-tools#wiki_.25B7_github_tools).
|
||||
|
||||
- Added subsections to all the main
|
||||
[storage sections](https://www.reddit.com/r/FREEMEDIAHECKYEAH/wiki/storage)
|
||||
that needed them.
|
||||
|
||||
- Made our Discord [public again](https://redd.it/17f8msf).
|
||||
|
||||
### Stars Added ⭐
|
||||
|
||||
- Starred
|
||||
[cinehub.wtf](https://www.reddit.com/r/FREEMEDIAHECKYEAH/wiki/video#wiki_.25BA_streaming_sites)
|
||||
in Streaming Sites. Solid UI, fast 1080p.
|
||||
|
||||
- Starred
|
||||
[UpMovies](https://www.reddit.com/r/FREEMEDIAHECKYEAH/wiki/video#wiki_.25B7_single_server)
|
||||
in Streaming Sites. This used to be known as sockshare, but they've updated
|
||||
their site and rebranded. Not always the best quality, but it really is one of
|
||||
the best sites to find obscure stuff, especially shows.
|
||||
|
||||
- Starred
|
||||
[FSL](https://www.reddit.com/r/FREEMEDIAHECKYEAH/wiki/video#wiki_.25B7_live_tv_.2F_sports)
|
||||
in Live TV sites.
|
||||
|
||||
- Starred
|
||||
[Squidify](https://www.reddit.com/r/FREEMEDIAHECKYEAH/wiki/audio#wiki_.25B7_streaming_sites)
|
||||
in Audio Streaming. Popular anime / gaming audio streaming site.
|
||||
|
||||
- Starred
|
||||
[Backloggd](https://www.reddit.com/r/FREEMEDIAHECKYEAH/wiki/games#wiki_.25BA_tracking_.2F_discovery)
|
||||
in Game Tracking / Discovery. Game collection tracker with a really nice UI.
|
||||
|
||||
- Starred
|
||||
[Fooocus](https://www.reddit.com/r/FREEMEDIAHECKYEAH/wiki/ai#wiki_.25B7_local_frontends)
|
||||
in AI Image Gen. Free, high quality image generator.
|
||||
|
||||
- Starred
|
||||
[GrapheneOS](https://www.reddit.com/r/FREEMEDIAHECKYEAH/wiki/android#wiki_.25B7_android_privacy)
|
||||
in Android Privacy. Privacy based operating system popular within privacy
|
||||
circles.
|
||||
|
||||
- Starred
|
||||
[Briar](https://www.reddit.com/r/FREEMEDIAHECKYEAH/wiki/storage#wiki_encrypted_android_messengers)
|
||||
in Encrypted Android Messengers. Privacy based android messenger popular
|
||||
within privacy circles.
|
||||
|
||||
- Starred
|
||||
[XDA](https://www.reddit.com/r/FREEMEDIAHECKYEAH/wiki/android#wiki_.25BA_android_tools)
|
||||
in Android Tools. Active android discussion forum.
|
||||
|
||||
- Starred
|
||||
[hektCaptcha](https://www.reddit.com/r/FREEMEDIAHECKYEAH/wiki/misc#wiki_.25B7_multi_browser)
|
||||
in Extensions. Seems to work better than others like Buster now.
|
||||
|
||||
- Starred
|
||||
[SDelete](https://www.reddit.com/r/FREEMEDIAHECKYEAH/wiki/storage#wiki_drive_formatting_.2F_file_deletion)
|
||||
in Drive Formatting / File Deletion. Microsofts official file deletion tool.
|
||||
|
||||
- Starred
|
||||
[Cloudflare Speed Test](https://www.reddit.com/r/FREEMEDIAHECKYEAH/wiki/storage#wiki_internet_speed_test)
|
||||
in Speed Tests. Gives more info than a lot of the other sites do.
|
||||
|
||||
- Starred SSD and The Hitchhiker’s Guide in
|
||||
[Privacy Guides](https://www.reddit.com/r/FREEMEDIAHECKYEAH/wiki/storage#wiki_privacy_guides).
|
||||
Some of the most in depth privacy guide sites out there.
|
||||
|
||||
- Starred Unreal Engine and Godot in
|
||||
[Game Engines](https://www.reddit.com/r/FREEMEDIAHECKYEAH/wiki/storage#wiki_game_engines).
|
||||
Popular free engines used to create games.
|
||||
|
||||
### Things Removed
|
||||
|
||||
- Removed CrackHub as they've sadly decided to
|
||||
[call it quits](https://i.imgur.com/jaY0grY.png). Huge thank you to them for
|
||||
providing such a solid site, and so many games to people for as long as they
|
||||
did. They will be missed.
|
||||
|
||||
- Unstarred PromptJungle in Online Image Generators as their bot is broken and
|
||||
Discord channels have been locked. Apparently they're going to make a
|
||||
comeback, but its been over a month now.
|
||||
|
||||
- Unstarred C1NE in Streaming Sites. It used to be good, but for whatever reason
|
||||
its extremely slow now.
|
||||
|
||||
- Unstarred Photopea as they caused a bunch of drama in the privacy community by
|
||||
[suddenly changing their ad policy](https://yev.varyel.com/post/732023637981446144/psa-photopea-just-became-a-very-shady-option-for),
|
||||
and adding an anti-adblock detector to their site. I believe they've removed
|
||||
it, but a lot of people have lost trust in them now.
|
||||
|
||||
- Removed Privacy Pass from extensions as it no longer works.
|
87
website/posts/nov-2024.md
Normal file
87
website/posts/nov-2024.md
Normal file
|
@ -0,0 +1,87 @@
|
|||
---
|
||||
title: Monthly Updates [November]
|
||||
description: Nov 2024 updates
|
||||
date: 2024-11-01
|
||||
next: false
|
||||
|
||||
prev: false
|
||||
|
||||
footer: true
|
||||
---
|
||||
|
||||
<Post authors="nbats"/>
|
||||
|
||||
:::info
|
||||
These update threads only contains major updates. If you're interested
|
||||
in seeing all minor changes you can follow our
|
||||
[Commits Page](https://github.com/fmhy/FMHYedit/commits/main) on GitHub or
|
||||
[Updates Channel](https://redd.it/17f8msf) in Discord.
|
||||
:::
|
||||
|
||||
### Wiki Updates
|
||||
|
||||
- Added new FMHY backup domain: `FMHY.lol`
|
||||
|
||||
- The [FMHY SafeGuard](https://github.com/kenhendricks00/FMHY-SafeGuard) extension is ready to be tested. Let us know how it works for you guys, and ty to everyone who made it happen.
|
||||
|
||||
- Split [FOSS](https://fmhy.net/downloadpiracyguide#foss-sites) and [Freeware](https://fmhy.net/downloadpiracyguide#freeware-sites) into separate sections, and cleaned up formatting: [before vs after](https://i.ibb.co/M5F1Dk7/image.png).
|
||||
|
||||
- Split [Text Editors](https://fmhy.net/text-tools#text-editors) and [Note-Taking](https://fmhy.net/text-tools#note-taking) into separate sections, added labels, and removed any that were low quality or abandoned.
|
||||
|
||||
- Split [Radio Stations](https://fmhy.net/audiopiracyguide#radio-streaming) and [Podcasts](https://fmhy.net/audiopiracyguide#podcast-streaming) into separate sections.
|
||||
|
||||
- Added tags to bookmark managers, and removed ones that looked low quality: [before vs after](https://i.ibb.co/nczmmrv/3453453453.jpg).
|
||||
|
||||
- Added tags to Remote Desktop, and removed any that looked low quality: [before vs after](https://i.ibb.co/jw87F2W/image.png ).
|
||||
|
||||
- Added tags to Online Image Editors, and removed any that didn't stand out: [before vs after](https://i.ibb.co/hFwBD6n/34534534.jpg).
|
||||
|
||||
- Added tags to Link in Bio, and removed any that seemed low quality: [before vs after](https://i.ibb.co/BjZ3SpR/image.png).
|
||||
|
||||
- Added a [Special Interests](https://fmhy.net/gamingpiracyguide#special-interest) section to gaming, to help debloat the main DDL section a bit.
|
||||
|
||||
***
|
||||
|
||||
### Stars Added ⭐
|
||||
|
||||
- Starred [Bluesky](https://fmhy.net/social-media-tools#fediverse-tools) in Fediverse Tools as everyone is leaving Twitter for it now.
|
||||
|
||||
- Starred [Kdenlive](https://fmhy.net/video-tools#video-editors) in Video Editors. Open-source, feature-rich, multi-platform editor.
|
||||
|
||||
- Starred [Khinsider](https://fmhy.net/audiopiracyguide#game-soundtracks) in Game Soundtracks. Popular soundtrack site with big library.
|
||||
|
||||
- Starred [Camo](https://fmhy.net/video-tools) in Video Tools. Allows you to use any device as a webcam.
|
||||
|
||||
- Starred [FMSTREAM](https://fmhy.net/storage#live-radio) in Radio Streaming. The biggest online radio directory on the internet.
|
||||
|
||||
- Starred [Thunderbird](https://fmhy.net/android-iosguide#android-internet) in Android Internet as its just a better version of K-9 Mail.
|
||||
|
||||
- Starred [Pixlr](https://fmhy.net/img-tools#online-editors) in Online Image Editors. Feature-rich editor with nice UI. Has daily limit but it can be bypassed with the script linked.
|
||||
|
||||
- Starred [x266.mov](https://fmhy.net/social-media-tools#discord-tools) in Discord Tools. Allows you to embed large videos on Discord.
|
||||
|
||||
- Starred [Playlists.cloud](https://fmhy.net/audiopiracyguide#spotify-tools) in Spotify Tools. Unlimited playlist transfer between Spotify / Apple Music.
|
||||
|
||||
- Starred [InfiCourses](https://fmhy.net/edupiracyguide#downloading) in Course DDL. Big library with courses tough to find elsewhere.
|
||||
|
||||
- Starred [Excalidraw](https://fmhy.net/img-tools#drawing) in Drawing Tools. Feature-rich compared to similar web apps.
|
||||
|
||||
- Went through [SMS verification](https://fmhy.net/storage#sms-verification-sites) and starred ones that stood out the most.
|
||||
|
||||
***
|
||||
|
||||
### Things Removed
|
||||
|
||||
- Removed Mutaz as they no longer host cracked software.
|
||||
|
||||
- Removed Feynas free tier is too limited now.
|
||||
|
||||
- Unstarred BetterDiscord as it runs poorly for many people due to bad optimization, and there are better options like Vencord.
|
||||
|
||||
- Unstarred OlaMovies as they now require google logins.
|
||||
|
||||
- Unstarred PDALife as many apps are outdated, their official app isn't maintained, and there are better sites.
|
||||
|
||||
- Unstarred Not Diamond as it isn't unlimited anymore.
|
||||
|
||||
- Unstarred ElevenLabs as its capped at 10 mins limiting its usefulness.
|
102
website/posts/oct-2023.md
Normal file
102
website/posts/oct-2023.md
Normal file
|
@ -0,0 +1,102 @@
|
|||
---
|
||||
title: Monthly Updates [October]
|
||||
description: October 2023 updates.
|
||||
date: 2023-10-01
|
||||
next: false
|
||||
|
||||
prev: false
|
||||
|
||||
footer: true
|
||||
---
|
||||
|
||||
<Post authors="nbats"/>
|
||||
|
||||
:::info
|
||||
These update threads only contains major updates. If you're interested
|
||||
in seeing all minor changes you can follow our
|
||||
[Commits Page](https://github.com/fmhy/FMHYedit/commits/main) on GitHub or
|
||||
[Updates Channel](https://redd.it/17f8msf) in Discord.
|
||||
:::
|
||||
|
||||
### Wiki Updates
|
||||
|
||||
- Created a **[List of Guides](https://rentry.co/fmhy-guides)** on rentry. This
|
||||
page is automated and updates itself anytime a new rentry is added or removed
|
||||
from FMHY. You can also download the guides yourself by using this
|
||||
[script](https://gist.github.com/Rust1667/efc055debaf4876e4de39cc0d32f18c1).
|
||||
|
||||
- Made a [Pokémon](/gamingpiracyguide/#pok%C3%A9mon-tools) section in Gaming
|
||||
Tools and an [Email](/internet-tools#email-tools) section in Internet Tools.
|
||||
|
||||
- Added [emojis](https://i.imgur.com/mgYq8nF.png) to indicate when we're linking
|
||||
3rd party indexes, or our storage page:
|
||||
|
||||
🌐 = 3rd Party Indexes (i.e. /r/PiratedGames Mega, Awesome Lists etc.)
|
||||
|
||||
↪️ = Storage Links
|
||||
|
||||
### Stars Added ⭐
|
||||
|
||||
- Starred [Nova AI](/ai/#ai-chatbots) in AI Chatbots. Gives free GPT-4 tokens.
|
||||
|
||||
- Starred [BlueROMs](/gamingpiracyguide/#rom-sites) in ROM sites. Simple DDL
|
||||
site with lots of systems.
|
||||
|
||||
- Starred [Qiwi](/storage/#file-sharing-tools) in File Hosts. Fast host that's
|
||||
becoming popular in piracy circles.
|
||||
|
||||
- Starred Moo and Media in
|
||||
[Video Drives](/videopiracyguide/#drives--directories). Fast drives with lots
|
||||
of content.
|
||||
|
||||
- Starred [WiiUDownloader](/gamingpiracyguide/#rom-sites) in ROM sites. Updated
|
||||
more frequently than WiiUSBHelper.
|
||||
|
||||
- Starred [Time4TV](/videopiracyguide/#live-tv--sports) in Live TV. Fast
|
||||
streams, lots of channels.
|
||||
|
||||
- Starred [TamperMonkey](/storage/#userscript-managers) in Userscript Managers.
|
||||
Updated more frequently than GreaseMonkey.
|
||||
|
||||
- Starred [PeaZip](/storage/#compression-programs) in File Archivers.
|
||||
Open-source, supports many formats.
|
||||
|
||||
- Starred [Miru](/android-iosguide/#android-streaming) in Android Streaming.
|
||||
Open-source, multi-format media app.
|
||||
|
||||
- Starred [gibMacOS](/linuxguide/#mac-tools--apps) in Mac Tools. Easily download
|
||||
MacOS.
|
||||
|
||||
- Starred [AppsTorrent](/linuxguide/#mac-software) in Mac Software. Popular Mac
|
||||
Software site with many Apps.
|
||||
|
||||
- Starred [PlayPhrase](/video-tools) in Video Tools. Search entire internet for
|
||||
video clips.
|
||||
|
||||
- Starred [Magic ToDo](/storage/#note-taking--to-do-apps) in To Do Apps.
|
||||
Automatic Task Breakdown AI.
|
||||
|
||||
- Starred [SafeSubstance](/miscguide/#health) in Health. Drug Information / Side
|
||||
Effects.
|
||||
|
||||
- Starred [TinyKittens](https://tinykittens.com/) in General Tools. Kitten
|
||||
Rescue / Donation website.
|
||||
|
||||
### Things Removed
|
||||
|
||||
- Removed RSLOAD, as they’ve uploaded the exact same version of malwarebytes
|
||||
with malware that FileCR got in trouble for. We’ve emailed them, so hopefully
|
||||
they remove it soon and we can add them back.
|
||||
|
||||
- Removed marin.moe from Anime Streaming as its redirecting to something else
|
||||
now.
|
||||
|
||||
- Removed AdGuard extra and other adblock defenders as they're
|
||||
[redundant](https://ibb.co/xgrtbBZ) with ublock.
|
||||
|
||||
- Removed SteamSkins as Steam dropped support for them in the last update.
|
||||
|
||||
- Removed Saikou from Android Anime as their GitHub has been DMCA'd.
|
||||
|
||||
- Removed Uptobox from File Hosts as their datacenter was
|
||||
[raided by french police](https://torrentfreak.com/uptobox-goes-dark-following-police-raids-on-french-datacenters-230920/).
|
77
website/posts/oct-2024.md
Normal file
77
website/posts/oct-2024.md
Normal file
|
@ -0,0 +1,77 @@
|
|||
---
|
||||
title: Monthly Updates [Oct 2024]
|
||||
description: October 2024 updates
|
||||
date: 2024-10-01
|
||||
next: false
|
||||
|
||||
prev: false
|
||||
|
||||
footer: true
|
||||
---
|
||||
|
||||
<Post authors="nbats"/>
|
||||
|
||||
:::info
|
||||
These update threads only contains major updates. If you're interested
|
||||
in seeing all minor changes you can follow our
|
||||
[Commits Page](https://github.com/fmhy/FMHYedit/commits/main) on GitHub or
|
||||
[Updates Channel](https://redd.it/17f8msf) in Discord.
|
||||
:::
|
||||
|
||||
### Wiki Updates
|
||||
|
||||
- Did a complete overhaul of the **[Beginners Guide](https://fmhy.net/beginners-guide)**. Removed outdated links, added new sites, and rewrote all the tips.
|
||||
|
||||
- Reorganized the [Anime Streaming](https://fmhy.net/videopiracyguide#anime-streaming) section based on **[tournament results](https://challonge.com/Anime_Streaming.svg)**.
|
||||
|
||||
- Reorganized both [Multi / Single Hosts](https://ibb.co/X7SC3f8) in the [Streaming section](https://fmhy.net/videopiracyguide) as people felt they were somewhat outdated.
|
||||
|
||||
- Added section for [Steam Deck](https://fmhy.net/gaming-tools#steam-deck) in Gaming Tools.
|
||||
|
||||
---
|
||||
|
||||
### Stars Added ⭐
|
||||
|
||||
- Starred [datadiff](https://fmhy.net/videopiracyguide#drives-directories) in Drives / Directories. Media directory with fast download speed, similar to vadapav / moo.
|
||||
|
||||
- Starred [Proton Pass](https://fmhy.net/internet-tools#password-managers) in Password Managers. Feature-rich manager comparable with things like Bitwarden.
|
||||
|
||||
- Starred [Miruro](https://fmhy.net/videopiracyguide#anime-streaming) in Anime Streaming. This was the winner of our anime streaming polls.
|
||||
|
||||
- Starred [RockMods](https://fmhy.net/android-iosguide#modded-apks) in Modded APKs. RockMods label all their releases correctly, and are usually one of the main sources of other groups.
|
||||
|
||||
- Starred [Openstax](https://fmhy.net/readingpiracyguide#educational-books) in Educational Books. Well-organized educational textbook site.
|
||||
|
||||
- Starred [Yet Another Call Blocker](https://fmhy.net/android-iosguide#number-sms) in Number / SMS. Hasn't been updated in awhile, but it doesn't need to be as its connected to a crowdsourced number [database](https://www.shouldianswer.com/).
|
||||
|
||||
- Starred [UrlCheck](https://fmhy.net/android-iosguide#android-privacy) in Android Privacy. Customizable open-source URL cleaner for android.
|
||||
|
||||
- Starred [Rev Wallpaper](https://fmhy.net/system-tools#wallpapers) in Wallpapers. Reverse wallpaper search engine.
|
||||
|
||||
- Starred [Edge-Remover](https://fmhy.net/internet-tools#browser-tools) in Browser Tools. Easy way to uninstall microsoft edge.
|
||||
|
||||
- Starred [Akuse](https://fmhy.net/videopiracyguide#anime-streaming) in Anime Streaming. Open-source anime app with nice UI.
|
||||
|
||||
- Starred [Movies Countdown](https://fmhy.net/videopiracyguide#calendar-upcoming) in Calendar / Upcoming. Tracks upcoming movie releases, both digital and theater.
|
||||
|
||||
- Starred [Simple Tab Groups](https://fmhy.net/storage#tab-managers) in Tab Managers. Feature-rich tab manager with plugin support.
|
||||
|
||||
---
|
||||
|
||||
### Things Removed
|
||||
|
||||
- Removed Essential from minecraft mods as they have a history of malicious practices and there are better options anyways.
|
||||
|
||||
- Removed Slider as they've been [shut down](https://ibb.co/NnY4M8b).
|
||||
|
||||
- Removed AnimeOut as they've closed signups.
|
||||
|
||||
- Unstarred LookMovie as they've locked 720p [behind a paywall](https://ibb.co/9W50NTg).
|
||||
|
||||
- Unstarred Modyolo and LiteAPKs as both mislabel releases from other groups as their own, and tag apps as newer versions than actually exist in order to get more downloads.
|
||||
|
||||
- Unstarred Gemini as many people consider it less useful than other AI.
|
||||
|
||||
* Unstarred Duolingo as there are better ways to learn languages.
|
||||
|
||||
* Unstarred Tixati as its closed source and there better options like qbit, transmission, deluge.
|
58
website/posts/search.md
Normal file
58
website/posts/search.md
Normal file
|
@ -0,0 +1,58 @@
|
|||
---
|
||||
title: How-to Search FMHY
|
||||
description: Various tools to help you query FMHY.
|
||||
date: 2023-01-07
|
||||
next: false
|
||||
|
||||
prev: false
|
||||
|
||||
footer: true
|
||||
---
|
||||
|
||||
<Post authors="nbats" />
|
||||
|
||||
### [FMHY-Search](https://fmhy-search.streamlit.app/)
|
||||
|
||||
Search engine hosted on Streamlit
|
||||
|
||||
---
|
||||
|
||||
### [FMHY.net Search](https://fmhy.net/)
|
||||
|
||||
Search engine hosted on FMHY.net
|
||||
|
||||
---
|
||||
|
||||
### [GitHub Search](https://github.com/fmhy/edit/search?q=&type=wikis)
|
||||
|
||||
GitHub page search engine
|
||||
|
||||
---
|
||||
|
||||
### [Bookmark HTML](https://github.com/fmhy/bookmarks)
|
||||
|
||||
Turn FMHY into Bookmarks
|
||||
|
||||
---
|
||||
|
||||
### [Python Script](https://github.com/Rust1667/a-FMHY-search-engine)
|
||||
|
||||
Search markdown via python script
|
||||
|
||||
---
|
||||
|
||||
### [Raw Markdown](https://api.fmhy.net/single-page)
|
||||
|
||||
Search markdown manually (ctrl+f)
|
||||
|
||||
---
|
||||
|
||||
### [Google CSEs](https://www.reddit.com/r/FREEMEDIAHECKYEAH/wiki/internet-tools/#wiki_.25B7_custom_search_engines)
|
||||
|
||||
Multi-site search engines
|
||||
|
||||
---
|
||||
|
||||
### [Dupe Checker](https://github.com/fmhy/dupe-checker)
|
||||
|
||||
FMHY Dupe Check Tool
|
132
website/posts/sept-2023.md
Normal file
132
website/posts/sept-2023.md
Normal file
|
@ -0,0 +1,132 @@
|
|||
---
|
||||
title: Monthly Updates [September]
|
||||
description: September 2023 updates.
|
||||
date: 2023-09-01
|
||||
next: false
|
||||
|
||||
prev: false
|
||||
|
||||
footer: true
|
||||
---
|
||||
|
||||
<Post authors="nbats"/>
|
||||
|
||||
:::info
|
||||
These update threads only contains major updates. If you're interested
|
||||
in seeing all minor changes you can follow our
|
||||
[Commits Page](https://github.com/fmhy/FMHYedit/commits/main) on GitHub or
|
||||
[Updates Channel](https://redd.it/17f8msf) in Discord.
|
||||
:::
|
||||
|
||||
### Wiki Updates
|
||||
|
||||
- Split Linux Tools into subcategories: [System](/linuxguide/#linux-system),
|
||||
[Apps](/linuxguide/#linux-apps), [Internet](/linuxguide/#linux-internet),
|
||||
[Terminal / Shell](/linuxguide/#terminal--shell) and
|
||||
[Customization](/linuxguide/#customization).
|
||||
|
||||
- NSFW has been [overhauled](/nsfwpiracy/) with a bunch of new sites and
|
||||
sections.
|
||||
|
||||
- Added Z-Libs new [Desktop App / Extension](/readingpiracyguide/#reading-sites)
|
||||
in Reading Sites.
|
||||
|
||||
- Replaced 9anime with [AniWave](/videopiracyguide/#anime-streaming) as they've
|
||||
[rebranded](https://torrentfreak.com/9anime-rebrands-to-aniwave-citing-legal-troubles-230802/)
|
||||
to avoid blocking.
|
||||
|
||||
- Replaced link to IDM in Download Managers with
|
||||
[activation script](/storage/#file-download-managers).
|
||||
|
||||
- Replaced /r/VPN with [/r/VPNs](https://www.reddit.com/r/vpns/) in our sidebar,
|
||||
as it allows users to discuss providers.
|
||||
|
||||
### Stars Added ⭐
|
||||
|
||||
- Starred SusFlix and The Movie Archive in
|
||||
[Streaming Sites](/videopiracyguide/#multi-server). Big libraries, 4K quality.
|
||||
|
||||
- Starred [Dhokla](/videopiracyguide/#drives--directories) in video downloading.
|
||||
Big drive, fast downloads.
|
||||
|
||||
- Starred
|
||||
[Awesome Free ChatGPT](https://github.com/LiLittleCat/awesome-free-chatgpt/blob/main/README_en.md)
|
||||
in AI Chatbots. Huge list of free chatbots.
|
||||
|
||||
- Starred [NanaZip](/storage/#compression-programs) in File Archivers.
|
||||
Open-source, modern design, preferred over 7-Zip by some.
|
||||
|
||||
- Starred [Deluge](/torrentpiracyguide/#torrent-clients) in Torrent Clients.
|
||||
Open-source client with many useful
|
||||
[plugins](https://dev.deluge-torrent.org/wiki/Plugins).
|
||||
|
||||
- Starred [InnerTune](/android-iosguide/#android-audio) in Android Audio.
|
||||
Open-source YouTube Music client.
|
||||
|
||||
- Starred APKPure and UpToDown in
|
||||
[Untouched APKs](/android-iosguide/#untouched-apks).
|
||||
|
||||
- Starred EverythingMoe and Ripped in [Indexes](/miscguide/#indexes). Solid
|
||||
Piracy Indexes.
|
||||
|
||||
- Starred [ReadAllComics](/readingpiracyguide/#comic-sites) in Comics. Big
|
||||
library, no captcha.
|
||||
|
||||
- Starred [WatchWrestling24](/videopiracyguide/#sports-streaming) in Sports
|
||||
Streaming. Good video hosts, quick uploads.
|
||||
|
||||
- Starred [Sandboxie Plus](/adblockvpnguide/#antivirus) in Antivirus.
|
||||
User-friendly software sandbox / [Guide](https://rentry.co/sandboxie-guide).
|
||||
|
||||
- Starred [DarkPatternsTipline](/miscguide/#shopping) in Shopping. Deceptive
|
||||
Service Design Tipline.
|
||||
|
||||
- Starred [Scoop](/storage/#package-managers) in Package Managers. Command-line
|
||||
installer for Windows.
|
||||
|
||||
- Starred [SA Drive](/toolsguide/#file-tools) in File Tools. Google Service
|
||||
Account Drive Manager.
|
||||
|
||||
- Starred [OpenModelDB](/storage/#image-upscalers) in Image Upscaling. Upscaling
|
||||
Model Database.
|
||||
|
||||
- Starred [EyeCndy](/toolsguide/#video-tools) in Video Tools. Camera technique
|
||||
library.
|
||||
|
||||
### Things Removed
|
||||
|
||||
- We've stopped accepting and started removing all AI tools that require paid
|
||||
API keys to function.
|
||||
|
||||
- Removed FileCR as they've been
|
||||
[caught with malware](https://rentry.co/filecr_malware), and still haven't
|
||||
removed it.
|
||||
|
||||
- Removed AnonFiles as they've decided to quit due to people
|
||||
[abusing the site](https://i.imgur.com/lXoEqAV.png).
|
||||
|
||||
- Unstarred WinRar in File Archivers. People feel its not as useful anymore
|
||||
given open-source options like 7-Zip / NanaZip.
|
||||
|
||||
- Removed RVX from ReVanced section as its been
|
||||
[discontinued](https://github.com/inotia00/revanced-documentation/wiki/Announcement).
|
||||
|
||||
- Removed PDF Drive in PDF Sites as downloads no longer work.
|
||||
|
||||
- Removed TronScript in Debloaters. Some people consider it
|
||||
[overkill](https://i.imgur.com/K5hf5Bu.png).
|
||||
|
||||
- Removed Poe in AI Chatbots as its now limited to 10 daily messages (or 100 in
|
||||
some countries.)
|
||||
|
||||
- Removed the "Everything I Know" wiki from Indexes as they've gone
|
||||
[paid](https://i.imgur.com/ig8jPGL.jpg). You can get around it by blocking the
|
||||
overlay, but we're not interested in sending traffic their way anymore.
|
||||
|
||||
- Unstarred 1337x and added [warning](https://pastebin.com/Rc9MYMZ7) to avoid
|
||||
software / games, as they've had issues with malware, including a torrent that
|
||||
was up for days after being reported. They did remove it eventually, and
|
||||
[respond](https://i.imgur.com/ij4CXIm.png) to the situation, so we feel it
|
||||
would be unfair to remove their site entirely. Our hope is that 1337x acts
|
||||
quicker in the future, avoids situations like this, and begins to earn trust
|
||||
back from people over time.
|
97
website/posts/sept-2024.md
Normal file
97
website/posts/sept-2024.md
Normal file
|
@ -0,0 +1,97 @@
|
|||
---
|
||||
title: Monthly Updates [Sept]
|
||||
description: September 2024 updates
|
||||
date: 2024-09-01
|
||||
next: false
|
||||
|
||||
prev: false
|
||||
|
||||
footer: true
|
||||
---
|
||||
|
||||
<Post authors="nbats"/>
|
||||
|
||||
:::info
|
||||
These update threads only contains major updates. If you're interested
|
||||
in seeing all minor changes you can follow our
|
||||
[Commits Page](https://github.com/fmhy/FMHYedit/commits/main) on GitHub or
|
||||
[Updates Channel](https://redd.it/17f8msf) in Discord.
|
||||
:::
|
||||
|
||||
### Wiki Updates
|
||||
|
||||
- Made [multiple updates](https://i.ibb.co/4ThbdyN/image.png) to our site and feedback system. All pages are now [visible](https://fmhy.net/) on the front page, feedback can now be [sent from any section](https://i.ibb.co/k8p2rcF/image.png), and [site icons](https://i.ibb.co/tBMwXXy/image.png) have been added for discord, telegram, reddit, git etc.
|
||||
|
||||
- Created a [method](https://github.com/fmhy/bookmarks) to add all of FMHY to your bookmarks.
|
||||
|
||||
- Added subsections to Minecraft Tools: [Hosting](https://fmhy.net/gaming-tools#hosting-tools), [Launchers](https://fmhy.net/gaming-tools#launchers), [Data Packs](https://fmhy.net/gaming-tools#mods-data-packs), [Map Tools](https://fmhy.net/gaming-tools#maps-world-tools), [Technical Tools](https://fmhy.net/gaming-tools#technical-tools), [Customization](https://fmhy.net/gaming-tools#customization) and [3D Tools](https://fmhy.net/gaming-tools#_3d-tools).
|
||||
|
||||
- Added [ChatGPT Tools](https://fmhy.net/ai#chatgpt-tools), [AI Benchmarks](https://fmhy.net/ai#ai-benchmarks) and [AI Search Engine](https://fmhy.net/ai#ai-search-engines) sections to AI.
|
||||
|
||||
- Added [YouTube Music](https://fmhy.net/android-iosguide#youtube-music-clients) and [YouTube App](https://fmhy.net/android-iosguide#ios-youtube-apps) (ios) sections to Mobile.
|
||||
|
||||
- Added [Coding Tools](https://fmhy.net/devtools#coding-tools) and [Android Code Editor](https://fmhy.net/devtools#android-code-editors) sections to Code Editors.
|
||||
|
||||
- Added [Geoguessr](https://fmhy.net/gamingpiracyguide#geoguessr-games) section to Browser Games.
|
||||
|
||||
- Added [Cloud Managers](https://fmhy.net/file-tools#cloud-managers) section to File Tools.
|
||||
|
||||
- Added [JEE / NEET](https://fmhy.net/edupiracyguide#jee-neet) section in Edu Tools.
|
||||
|
||||
- Added [Streaming APIs](https://fmhy.net/videopiracyguide#streaming-apis) section to Streaming.
|
||||
|
||||
- Split Audiobooks into [Downloading](https://fmhy.net/readingpiracyguide#downloading) and [Streaming](https://fmhy.net/readingpiracyguide#streaming).
|
||||
|
||||
- Made FMHY site logo easier to switch (click it 5 times).
|
||||
|
||||
- Our filterlist has been moved to [here](https://fmhy.github.io/FMHYFilterlist/site/index.html), and our markdown page to [here](https://api.fmhy.net/single-page).
|
||||
|
||||
---
|
||||
|
||||
### Stars Added ⭐
|
||||
|
||||
- Starred [Bookracy](https://fmhy.net/readingpiracyguide#ebooks) in Ebook Sites. Promising book site with solid UI and community.
|
||||
|
||||
- Starred [Droid-ify](https://fmhy.net/android-iosguide#foss-apks) in FOSS APKs. Open source F-Droid client some like more than the official.
|
||||
|
||||
- Starred [Disblock Origin](https://fmhy.net/adblockvpnguide#adblocking) in Adblocking. Removes nitro / boost ads from Discord.
|
||||
|
||||
- Starred [Sidebery](https://fmhy.net/storage#tab-managers) in Tab Managers. Useful open source tab manager / bookmark manager.
|
||||
|
||||
- Starred [FastFLUX](https://fmhy.net/ai#image-generation) in AI Image Gen. Good quality and currently unlimited.
|
||||
|
||||
- Starred [You](https://fmhy.net/ai#ai-search-engines) in AI Search Engines. Fast, free, unlimited AI search.
|
||||
|
||||
- Starred [Archive of Our Own](https://fmhy.net/readingpiracyguide#fanfiction-stories) in Fanfiction Sites. Popular and extensive archive of fanfiction.
|
||||
|
||||
- Starred [Materialgram](https://fmhy.net/social-media-tools#telegram-clients) and [AyuGram](https://fmhy.net/android-iosguide#social-media-apps) (android) in Telegram Clients. Simple, ad-free, feature-rich clients.
|
||||
|
||||
- Starred [NCS](https://fmhy.net/storage#royalty-free-music) in Royalty Free Music. Popular library for free music.
|
||||
|
||||
- Starred [K-9 Mail](https://fmhy.net/android-iosguide#android-internet) in Android Internet. Open source mobile mail client.
|
||||
|
||||
- Starred [Lossless Scaling](https://fmhy.net/gaming-tools#optimization-tools) in Game Optimization. Powerful upscaling with frame generation for all GPUs.
|
||||
|
||||
- Starred [Hotkey Cheatsheet](https://fmhy.net/system-tools#mouse-keyboard) in Keyboard Tools. Keyboard hotkeys for lots of different apps.
|
||||
|
||||
- Starred [Viren070's Guides](https://fmhy.net/videopiracyguide#stremio-tools) in Stremio Tools. Helpful guides to use Stremio.
|
||||
|
||||
---
|
||||
|
||||
### Things Removed
|
||||
|
||||
- Said Goodbye to both Fmovies and Aniwave.
|
||||
|
||||
- Removed SusFlix as its been down for over a week.
|
||||
|
||||
- Removed Lantern as its limit is low (250mb daily) and its closed source.
|
||||
|
||||
- Removed Lexica as they're removing the free tier.
|
||||
|
||||
- Unstarred APKPure due to their poor privacy policy + low quality apps.
|
||||
|
||||
- Unstarred ROMhacking as they're going [archive only](https://www.romhacking.net/forum/index.php?topic=39405).
|
||||
|
||||
- Unstarred Morphic as they will [no longer](https://i.ibb.co/sRVyVKk/image.png) be using paid models for searching.
|
||||
|
||||
- Unstarred sdk.vercel as it requires an account for the better models.
|
28
website/posts/support-ia.md
Normal file
28
website/posts/support-ia.md
Normal file
|
@ -0,0 +1,28 @@
|
|||
---
|
||||
title: The Internet Archive needs your help.
|
||||
description: Support IA
|
||||
date: 2025-04-21
|
||||
next: false
|
||||
|
||||
prev: false
|
||||
|
||||
footer: true
|
||||
---
|
||||
|
||||
<Post authors="" />
|
||||
|
||||
A coalition of major record labels has filed a lawsuit against the Internet Archive—demanding **$700 million** for our work preserving and providing access to historical 78rpm records. These fragile, obsolete discs hold some of the earliest recordings of a vanishing American culture. But this lawsuit goes far beyond old records. It’s an attack on the Internet Archive itself.
|
||||
|
||||
This lawsuit is an **existential threat** to the Internet Archive and everything we preserve—including the **Wayback Machine**, a cornerstone of memory and preservation on the internet.
|
||||
|
||||
**At a time when digital information is disappearing, being rewritten, or erased entirely, the tools to preserve history must be defended—not dismantled.**
|
||||
|
||||
This isn’t just about music. It’s about whether future generations will have access to knowledge, history, and culture.
|
||||
***
|
||||
## [Sign our open letter](https://www.change.org/p/defend-the-internet-archive) and tell the record labels to drop their lawsuit.
|
||||
***
|
||||
**Posted by Chris Freeland, Director of Library Services at Internet Archive**
|
||||
|
||||
###### Source: https://blog.archive.org/2025/04/17/take-action-defend-the-internet-archive/
|
||||
|
||||
###### Reddit Discussion: https://redd.it/1k4qqid
|
72
website/theme/Appearance.vue
Normal file
72
website/theme/Appearance.vue
Normal file
|
@ -0,0 +1,72 @@
|
|||
<script setup lang="ts">
|
||||
import VPIconMoon from 'vitepress/dist/client/theme-default/components/icons/VPIconMoon.vue'
|
||||
import VPIconSun from 'vitepress/dist/client/theme-default/components/icons/VPIconSun.vue'
|
||||
|
||||
const { isDark } = useData()
|
||||
|
||||
const toggleAppearance = inject('toggle-appearance', () => {
|
||||
isDark.value = !isDark.value
|
||||
})
|
||||
|
||||
const supportsViewTransition = ref(false)
|
||||
|
||||
onMounted(() => {
|
||||
supportsViewTransition.value =
|
||||
'startViewTransition' in document &&
|
||||
window.matchMedia('(prefers-reduced-motion: no-preference)').matches
|
||||
})
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<button
|
||||
type="button"
|
||||
role="switch"
|
||||
title="VPSwitchAppearance"
|
||||
class="VPSwitchAppearance"
|
||||
:aria-checked="isDark"
|
||||
:data-view-transition="supportsViewTransition"
|
||||
@click="toggleAppearance"
|
||||
>
|
||||
<ClientOnly>
|
||||
<Transition name="fade" mode="out-in">
|
||||
<div v-if="!isDark" class="sun text-xl i-ph-sun-duotone" />
|
||||
<div v-else class="moon text-xl i-ph-moon-duotone" />
|
||||
</Transition>
|
||||
</ClientOnly>
|
||||
</button>
|
||||
</template>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.VPSwitchAppearance {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
width: 36px;
|
||||
height: 36px;
|
||||
color: var(--vp-c-text-2);
|
||||
transition: color 0.5s;
|
||||
|
||||
&:hover {
|
||||
color: var(--vp-c-text-1);
|
||||
transition: color 0.25s;
|
||||
}
|
||||
|
||||
& > :deep(svg) {
|
||||
width: 20px;
|
||||
height: 20px;
|
||||
fill: currentColor;
|
||||
}
|
||||
|
||||
&[data-view-transition='false'] {
|
||||
.fade-enter-active,
|
||||
.fade-leave-active {
|
||||
transition: opacity 0.1s ease;
|
||||
}
|
||||
|
||||
.fade-enter-from,
|
||||
.fade-leave-to {
|
||||
opacity: 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
108
website/theme/Layout.vue
Normal file
108
website/theme/Layout.vue
Normal file
|
@ -0,0 +1,108 @@
|
|||
<script setup lang="ts">
|
||||
import { BProgress } from '@bprogress/core'
|
||||
import DefaultTheme from 'vitepress/theme'
|
||||
import Announcement from './components/Announcement.vue'
|
||||
import Sidebar from './components/SidebarCard.vue'
|
||||
|
||||
import '@bprogress/core/css'
|
||||
|
||||
const { isDark } = useData()
|
||||
|
||||
const router = useRouter()
|
||||
|
||||
BProgress.configure({
|
||||
showSpinner: false,
|
||||
easing: 'ease'
|
||||
})
|
||||
|
||||
router.onBeforeRouteChange = () => {
|
||||
BProgress.start()
|
||||
}
|
||||
|
||||
router.onAfterRouteChange = () => {
|
||||
BProgress.done()
|
||||
}
|
||||
|
||||
const enableTransitions = () =>
|
||||
'startViewTransition' in document &&
|
||||
window.matchMedia('(prefers-reduced-motion: no-preference)').matches
|
||||
|
||||
provide('toggle-appearance', async ({ clientX: x, clientY: y }: MouseEvent) => {
|
||||
if (!enableTransitions()) {
|
||||
isDark.value = !isDark.value
|
||||
return
|
||||
}
|
||||
|
||||
const clipPath = [
|
||||
`circle(0px at ${x}px ${y}px)`,
|
||||
`circle(${Math.hypot(
|
||||
Math.max(x, innerWidth - x),
|
||||
Math.max(y, innerHeight - y)
|
||||
)}px at ${x}px ${y}px)`
|
||||
]
|
||||
|
||||
await document.startViewTransition(async () => {
|
||||
isDark.value = !isDark.value
|
||||
await nextTick()
|
||||
}).ready
|
||||
|
||||
document.documentElement.animate(
|
||||
{ clipPath: isDark.value ? clipPath.reverse() : clipPath },
|
||||
{
|
||||
duration: 300,
|
||||
easing: 'ease-in',
|
||||
pseudoElement: `::view-transition-${isDark.value ? 'old' : 'new'}(root)`
|
||||
}
|
||||
)
|
||||
})
|
||||
|
||||
const { Layout } = DefaultTheme
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<Layout>
|
||||
<template #sidebar-nav-after>
|
||||
<Sidebar />
|
||||
</template>
|
||||
<template #home-hero-info-before>
|
||||
<Announcement />
|
||||
</template>
|
||||
<template #home-features-before>
|
||||
<p class="text-center text-lg text-text-2 mb-2">
|
||||
Or browse these pages
|
||||
<span class="inline-block i-twemoji:sparkles" />
|
||||
</p>
|
||||
</template>
|
||||
<Content />
|
||||
</Layout>
|
||||
</template>
|
||||
|
||||
<style>
|
||||
:root {
|
||||
--bprogress-color: var(--vp-c-brand);
|
||||
}
|
||||
|
||||
::view-transition-old(root),
|
||||
::view-transition-new(root) {
|
||||
animation: none;
|
||||
mix-blend-mode: normal;
|
||||
}
|
||||
|
||||
::view-transition-old(root),
|
||||
.dark::view-transition-new(root) {
|
||||
z-index: 1;
|
||||
}
|
||||
|
||||
::view-transition-new(root),
|
||||
.dark::view-transition-old(root) {
|
||||
z-index: 9999;
|
||||
}
|
||||
|
||||
.VPSwitchAppearance {
|
||||
width: 22px !important;
|
||||
}
|
||||
|
||||
.VPSwitchAppearance .check {
|
||||
transform: none !important;
|
||||
}
|
||||
</style>
|
24
website/theme/PostLayout.vue
Normal file
24
website/theme/PostLayout.vue
Normal file
|
@ -0,0 +1,24 @@
|
|||
<script setup lang="ts">
|
||||
import Authors from './components/Authors.vue'
|
||||
|
||||
const props = defineProps<{
|
||||
authors: string
|
||||
}>()
|
||||
|
||||
const formatDate = (raw: string): string => {
|
||||
const date = new Date(raw)
|
||||
return date.toLocaleDateString('en-US', {
|
||||
month: 'short',
|
||||
day: 'numeric'
|
||||
})
|
||||
}
|
||||
|
||||
const { frontmatter } = useData()
|
||||
const authors = computed(() => props.authors.split(','))
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<h1>{{ frontmatter.title }}</h1>
|
||||
<div>{{ frontmatter.description }} • {{ formatDate(frontmatter.date) }}</div>
|
||||
<Authors :authors="authors" />
|
||||
</template>
|
67
website/theme/Posts.vue
Normal file
67
website/theme/Posts.vue
Normal file
|
@ -0,0 +1,67 @@
|
|||
<!-- eslint-disable vue/require-v-for-key -->
|
||||
<script setup lang="ts">
|
||||
import { data as posts } from './posts.data'
|
||||
|
||||
const formatDate = (raw: string): string => {
|
||||
const date = new Date(raw)
|
||||
return date.toLocaleDateString('en-US', {
|
||||
month: 'short',
|
||||
day: 'numeric'
|
||||
})
|
||||
}
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div>
|
||||
<section>
|
||||
<h1 class="flex items-center gap-2">Posts</h1>
|
||||
<p>Everything from Monthly Updates to fmhy updates.</p>
|
||||
|
||||
We also have a
|
||||
<a href="/feed.rss" target="_blank" title="RSS feed">
|
||||
<div class="i-carbon-rss vertical-top" />
|
||||
RSS feed.
|
||||
</a>
|
||||
</section>
|
||||
<template v-for="year in Object.keys(posts).reverse()" :key="year">
|
||||
<h2>{{ year }}</h2>
|
||||
<ul>
|
||||
<li v-for="post of posts[year]" :key="post.url">
|
||||
<article>
|
||||
<a :href="post.url" class="border-none">{{ post.title }}</a>
|
||||
-
|
||||
<dl class="m-0 inline">
|
||||
<dt class="sr-only">Published on</dt>
|
||||
<dd class="m-0 inline">
|
||||
<time :datetime="post.date" class="font-bold">
|
||||
{{ formatDate(post.date) }}
|
||||
</time>
|
||||
</dd>
|
||||
</dl>
|
||||
</article>
|
||||
</li>
|
||||
</ul>
|
||||
</template>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<style scoped>
|
||||
.VPBadge {
|
||||
border: 1px solid transparent;
|
||||
border-radius: 8px;
|
||||
display: inline-flex;
|
||||
margin-left: 2px;
|
||||
padding: 0 10px;
|
||||
line-height: 22px;
|
||||
font-size: 12px;
|
||||
font-weight: 500;
|
||||
transform: translateY(-2px);
|
||||
align-items: center;
|
||||
gap: 0.2rem;
|
||||
padding-right: 10px;
|
||||
vertical-align: middle;
|
||||
color: var(--vp-badge-tip-text);
|
||||
background-color: transparent;
|
||||
border-color: var(--vp-custom-block-tip-outline);
|
||||
}
|
||||
</style>
|
13
website/theme/components/Announcement.vue
Normal file
13
website/theme/components/Announcement.vue
Normal file
|
@ -0,0 +1,13 @@
|
|||
<script setup lang="ts">
|
||||
const { frontmatter } = useData()
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<a
|
||||
v-if="frontmatter.hero.announcement"
|
||||
:href="frontmatter.hero.announcement.link"
|
||||
class="mb-3 inline-flex items-center rounded-lg bg-[var(--vp-c-default-soft)] px-4 py-1 text-sm font-semibold"
|
||||
>
|
||||
{{ frontmatter.hero.announcement.title }}
|
||||
</a>
|
||||
</template>
|
49
website/theme/components/Authors.vue
Normal file
49
website/theme/components/Authors.vue
Normal file
|
@ -0,0 +1,49 @@
|
|||
<script setup lang="ts">
|
||||
import { computed } from 'vue'
|
||||
|
||||
const props = defineProps<{
|
||||
authors: string[]
|
||||
}>()
|
||||
|
||||
interface Author {
|
||||
name: string
|
||||
github: string
|
||||
}
|
||||
|
||||
const data = [
|
||||
{
|
||||
name: 'nbats',
|
||||
github: 'https://github.com/nbats'
|
||||
},
|
||||
{
|
||||
name: 'Kai',
|
||||
github: 'https://github.com/Kai-FMHY'
|
||||
},
|
||||
{
|
||||
name: 'taskylizard',
|
||||
github: 'https://github.com/taskylizard'
|
||||
},
|
||||
{
|
||||
name: 'zinklog',
|
||||
github: 'https://github.com/zinklog2'
|
||||
},
|
||||
{
|
||||
name: 'Q',
|
||||
github: 'https://github.com/qiracy'
|
||||
}
|
||||
] satisfies Author[]
|
||||
|
||||
const authors = computed(() =>
|
||||
data.filter((author) => props.authors.includes(author.name))
|
||||
)
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div class="flex flex-wrap gap-4 pt-2">
|
||||
<div v-for="(c, index) of authors" class="flex items-center gap-2">
|
||||
<img :src="`${c.github}.png`" class="h-8 w-8 rounded-full" />
|
||||
<a :href="c.github">{{ c.name }}</a>
|
||||
<span v-if="index < authors.length - 1">•</span>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
16
website/theme/components/CardField.vue
Normal file
16
website/theme/components/CardField.vue
Normal file
|
@ -0,0 +1,16 @@
|
|||
<script setup lang="ts">
|
||||
defineProps<{
|
||||
icon: string
|
||||
}>()
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div class="g-[12px] mb-[8px] flex items-center">
|
||||
<span class="flex items-center">
|
||||
<div class="text-2xl" :class="icon" />
|
||||
<div class="ml-2 text-sm text-[var(--vp-c-text-2)]">
|
||||
<slot />
|
||||
</div>
|
||||
</span>
|
||||
</div>
|
||||
</template>
|
114
website/theme/components/ColorPicker.vue
Normal file
114
website/theme/components/ColorPicker.vue
Normal file
|
@ -0,0 +1,114 @@
|
|||
<script setup lang="ts">
|
||||
import { colors } from '@fmhy/colors'
|
||||
import { useStorage, useStyleTag } from '@vueuse/core'
|
||||
import {
|
||||
SelectContent,
|
||||
SelectItem,
|
||||
SelectItemIndicator,
|
||||
SelectItemText,
|
||||
SelectPortal,
|
||||
SelectRoot,
|
||||
SelectTrigger,
|
||||
SelectValue,
|
||||
SelectViewport
|
||||
} from 'reka-ui'
|
||||
import { watch } from 'vue'
|
||||
|
||||
const colorScales = [
|
||||
'50',
|
||||
'100',
|
||||
'200',
|
||||
'300',
|
||||
'400',
|
||||
'500',
|
||||
'600',
|
||||
'700',
|
||||
'800',
|
||||
'900',
|
||||
'950'
|
||||
] as const
|
||||
|
||||
type ColorNames = keyof typeof colors
|
||||
const selectedColor = useStorage<ColorNames>('preferred-color', 'swarm')
|
||||
|
||||
const colorOptions = Object.keys(colors).filter(
|
||||
(key) => typeof colors[key as keyof typeof colors] === 'object'
|
||||
)
|
||||
|
||||
const { css } = useStyleTag('', { id: 'brand-color' })
|
||||
|
||||
const updateThemeColor = (colorName: ColorNames) => {
|
||||
const colorSet = colors[colorName]
|
||||
|
||||
const cssVars = colorScales
|
||||
.map((scale) => `--vp-c-brand-${scale}: ${colorSet[scale]};`)
|
||||
.join('\n ')
|
||||
|
||||
css.value = `
|
||||
:root {
|
||||
${cssVars}
|
||||
--vp-c-brand-1: ${colorSet[500]};
|
||||
--vp-c-brand-2: ${colorSet[600]};
|
||||
--vp-c-brand-3: ${colorSet[800]};
|
||||
--vp-c-brand-soft: ${colorSet[400]};
|
||||
}
|
||||
|
||||
.dark {
|
||||
${cssVars}
|
||||
--vp-c-brand-1: ${colorSet[400]};
|
||||
--vp-c-brand-2: ${colorSet[500]};
|
||||
--vp-c-brand-3: ${colorSet[700]};
|
||||
--vp-c-brand-soft: ${colorSet[300]};
|
||||
}
|
||||
`
|
||||
}
|
||||
|
||||
// Initialize theme color
|
||||
updateThemeColor(selectedColor.value)
|
||||
|
||||
watch(selectedColor, updateThemeColor)
|
||||
|
||||
const normalizeColorName = (colorName: string) =>
|
||||
colorName.replaceAll(/-/g, ' ').charAt(0).toUpperCase() +
|
||||
colorName.slice(1).replaceAll(/-/g, ' ')
|
||||
|
||||
const handleColorChange = (value: string) => {
|
||||
selectedColor.value = value as ColorNames
|
||||
}
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div class="color-picker">
|
||||
<SelectRoot :model-value="selectedColor" @update:model-value="handleColorChange">
|
||||
<SelectTrigger
|
||||
class="inline-flex items-center justify-between px-3 py-2 text-sm bg-bg-alt border border-div rounded-md hover:bg-bg-elv transition-colors min-w-[180px] mx-auto align-left"
|
||||
aria-label="Select theme color">
|
||||
<div class="flex items-center gap-2">
|
||||
<span class="inline-block w-4 h-4 rounded-full border border-div"
|
||||
:style="{ backgroundColor: colors[selectedColor][500] }" />
|
||||
<SelectValue :placeholder="normalizeColorName(selectedColor)" />
|
||||
</div>
|
||||
<span class="i-lucide:chevron-down w-4 h-4 text-text-2" />
|
||||
</SelectTrigger>
|
||||
|
||||
<SelectPortal>
|
||||
<SelectContent class="bg-bg-elv border border-div rounded-md shadow-lg z-50 max-h-60 overflow-hidden z-9999"
|
||||
:side-offset="4">
|
||||
<SelectViewport class="p-1">
|
||||
<SelectItem v-for="color in colorOptions" :key="color" :value="color"
|
||||
class="relative flex items-center gap-2 px-3 py-2 text-sm cursor-pointer hover:bg-bg-alt rounded-sm outline-none data-[highlighted]:bg-bg-alt data-[state=checked]:bg-bg-alt data-[state=checked]:text-text">
|
||||
<span class="inline-block w-4 h-4 rounded-full border border-div"
|
||||
:style="{ backgroundColor: colors[color][500] }" />
|
||||
<SelectItemText>
|
||||
{{ normalizeColorName(color) }}
|
||||
</SelectItemText>
|
||||
<SelectItemIndicator class="absolute right-2">
|
||||
<span class="i-lucide:check w-4 h-4 text-text-2" />
|
||||
</SelectItemIndicator>
|
||||
</SelectItem>
|
||||
</SelectViewport>
|
||||
</SelectContent>
|
||||
</SelectPortal>
|
||||
</SelectRoot>
|
||||
</div>
|
||||
</template>
|
363
website/theme/components/Feedback.vue
Normal file
363
website/theme/components/Feedback.vue
Normal file
|
@ -0,0 +1,363 @@
|
|||
<script setup lang="ts">
|
||||
import type { FeedbackType } from '../../types/Feedback'
|
||||
import { useRouter } from 'vitepress'
|
||||
import { computed, reactive, ref } from 'vue'
|
||||
import { feedbackOptions, getFeedbackOption } from '../../types/Feedback'
|
||||
|
||||
const props = defineProps<{
|
||||
heading?: string
|
||||
}>()
|
||||
|
||||
const prompts = [
|
||||
'Make it count!',
|
||||
'Leave some feedback for us!',
|
||||
`We're all ears 🐰`,
|
||||
'Tell us what is missing in FMHY',
|
||||
'Your thoughts matter to us 💡',
|
||||
'Feedback is a gift 🎁',
|
||||
'What do you think?',
|
||||
'We appreciate your support 🙏',
|
||||
'Help us make FMHY better 🤝',
|
||||
'We need your help 👋',
|
||||
'Your feedback is valuable 💯',
|
||||
'So... what do you think?',
|
||||
"I guess you don't need to say anything 😉",
|
||||
'Spill the beans 💣',
|
||||
"We're always looking for ways to improve!",
|
||||
'Your feedback is valuable and helps us make FMHY better.',
|
||||
'aliens are watching you 👽',
|
||||
'tasky was here 👀',
|
||||
'The internet is full of crap 😱'
|
||||
]
|
||||
|
||||
function getPrompt() {
|
||||
return prompts[Math.floor(Math.random() * prompts.length)]
|
||||
}
|
||||
|
||||
const messages = {
|
||||
suggestion: [
|
||||
"We're glad you want to share your ideas!",
|
||||
'Nix the fluff and just tell us what you think!',
|
||||
"We'll be happy to read your thoughts and incorporate them into our wiki.",
|
||||
"Hello! We're glad you want to share your ideas!"
|
||||
],
|
||||
appreciation: [
|
||||
'We appreciate your support!',
|
||||
"We're always looking for ways to improve!.",
|
||||
'Your feedback is valuable and helps us make FMHY better.'
|
||||
],
|
||||
other: [
|
||||
"We're always looking for ways to improve!",
|
||||
'Your feedback is valuable and helps us make FMHY better.'
|
||||
]
|
||||
}
|
||||
|
||||
function getMessage(type: FeedbackType['type']) {
|
||||
return messages[type][Math.floor(Math.random() * messages[type].length)]
|
||||
}
|
||||
|
||||
const loading = ref<boolean>(false)
|
||||
const error = ref<unknown>(null)
|
||||
const success = ref<boolean>(false)
|
||||
|
||||
const isDisabled = computed(() => {
|
||||
return (
|
||||
!feedback.message.length ||
|
||||
feedback.message.length < 5 ||
|
||||
feedback.message.length > 1000
|
||||
)
|
||||
})
|
||||
|
||||
const router = useRouter()
|
||||
|
||||
const feedback = reactive<{
|
||||
message: string
|
||||
page: string
|
||||
type?: FeedbackType['type']
|
||||
}>({
|
||||
page: router.route.path,
|
||||
message: ''
|
||||
})
|
||||
|
||||
const selectedOption = ref(feedbackOptions[0])
|
||||
|
||||
async function handleSubmit(type?: FeedbackType['type']) {
|
||||
if (type) {
|
||||
feedback.type = type
|
||||
selectedOption.value = getFeedbackOption(type)!
|
||||
}
|
||||
loading.value = true
|
||||
|
||||
const body: FeedbackType = {
|
||||
message: feedback.message,
|
||||
type: feedback.type!,
|
||||
page: feedback.page,
|
||||
...(props.heading && { heading: props.heading })
|
||||
}
|
||||
|
||||
try {
|
||||
const response = await fetch('https://api.fmhy.net/feedback', {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Content-Type': 'application/json'
|
||||
},
|
||||
body: JSON.stringify(body)
|
||||
})
|
||||
|
||||
const data = await response.json()
|
||||
if (data.error) {
|
||||
error.value = data.error
|
||||
return
|
||||
}
|
||||
if (data.status === 'ok') {
|
||||
success.value = true
|
||||
}
|
||||
} catch (err) {
|
||||
error.value = err
|
||||
} finally {
|
||||
loading.value = false
|
||||
}
|
||||
}
|
||||
|
||||
const isCardShown = ref<boolean>(false)
|
||||
const helpfulText = props.heading
|
||||
? 'What do you think about this section?'
|
||||
: 'What do you think about this page?'
|
||||
const helpfulDescription = props.heading
|
||||
? 'Let us know how helpful this section is.'
|
||||
: 'Let us know how helpful this page is.'
|
||||
|
||||
const prompt = computed(() => getPrompt())
|
||||
const message = computed(() => getMessage(feedback.type!))
|
||||
const toggleCard = () => (isCardShown.value = !isCardShown.value)
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<template v-if="props.heading">
|
||||
<button
|
||||
@click="toggleCard()"
|
||||
class="bg-$vp-c-default-soft text-primary border-$vp-c-default-soft hover:border-primary ml-3 inline-flex h-7 items-center justify-center whitespace-nowrap rounded-md border-2 border-solid px-1.5 py-3.5 text-sm font-medium transition-all duration-300 sm:h-6"
|
||||
>
|
||||
<span
|
||||
:class="isCardShown === false ? `i-lucide:mail` : `i-lucide:mail-x`"
|
||||
/>
|
||||
</button>
|
||||
</template>
|
||||
<template v-else>
|
||||
<div
|
||||
class="mt-2 p-4 border-2 border-solid bg-brand-50 border-brand-300 dark:bg-brand-950 dark:border-brand-800 rounded-xl col-span-3 transition-colors duration-250"
|
||||
>
|
||||
<div class="flex items-start md:items-center gap-3">
|
||||
<div class="pt-1 md:pt-0">
|
||||
<div
|
||||
class="w-10 h-10 rounded-full flex items-center justify-center bg-brand-500 dark:bg-brand-400"
|
||||
>
|
||||
<span
|
||||
:class="
|
||||
isCardShown === false
|
||||
? `i-lucide:mail w-6 h-6 text-white dark:text-brand-950`
|
||||
: `i-lucide:mail-x w-6 h-6 text-white dark:text-brand-950`
|
||||
"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
<div
|
||||
class="flex-grow flex items-start md:items-center gap-3 flex-col md:flex-row"
|
||||
>
|
||||
<div class="flex-grow">
|
||||
<div class="font-semibold text-brand-950 dark:text-brand-50">
|
||||
Got feedback?
|
||||
</div>
|
||||
<div class="text-sm text-brand-800 dark:text-brand-100">
|
||||
We'd love to know what you think about this page.
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<button
|
||||
class="inline-block text-center rounded-full px-4 py-2.5 text-sm font-medium border-2 border-solid text-brand-700 border-brand-300 dark:text-brand-100 dark:border-brand-800"
|
||||
@click="toggleCard()"
|
||||
>
|
||||
Share Feedback
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<Transition name="fade" mode="out-in">
|
||||
<div
|
||||
v-if="isCardShown"
|
||||
class="border-$vp-c-divider bg-$vp-c-bg-alt b-rd-4 m-[2rem 0] mt-4 border-2 border-solid p-6"
|
||||
>
|
||||
<Transition name="fade" mode="out-in">
|
||||
<div v-if="!feedback.type">
|
||||
<p class="heading">
|
||||
{{ helpfulText }}
|
||||
</p>
|
||||
<div class="flex flex-wrap gap-2">
|
||||
<button
|
||||
v-for="item in feedbackOptions"
|
||||
:key="item.value"
|
||||
class="bg-bg border-$vp-c-default-soft hover:border-primary mt-2 select-none rounded border-2 border-solid font-bold transition-all duration-250 rounded-lg text-[14px] font-500 leading-normal m-0 px-3 py-1.5 text-center align-middle whitespace-nowrap"
|
||||
@click="handleSubmit(item.value)"
|
||||
>
|
||||
<span>{{ item.label }}</span>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
<div v-else-if="feedback.type && !success">
|
||||
<div>
|
||||
<p class="desc">{{ helpfulDescription }} - {{ prompt }}</p>
|
||||
<span>{{ getFeedbackOption(feedback.type)?.label }}</span>
|
||||
</div>
|
||||
<p class="heading" v-text="message"></p>
|
||||
<div v-if="feedback.type === 'suggestion'" class="mb-2 text-sm">
|
||||
<details>
|
||||
<summary>
|
||||
<span class="ii-lucide-shield-x bg-cerise-400 mb-1 ml-1" />
|
||||
Do not submit any of the following:
|
||||
</summary>
|
||||
<strong>🕹️ Emulators</strong>
|
||||
<p class="desc">
|
||||
They're already on the
|
||||
<a
|
||||
class="text-primary text-underline font-bold"
|
||||
href="https://emulation.gametechwiki.com/index.php/Main_Page"
|
||||
>
|
||||
Game Tech Wiki.
|
||||
</a>
|
||||
</p>
|
||||
<strong>🔻 Leeches</strong>
|
||||
<p class="desc">
|
||||
They're already on the
|
||||
<a
|
||||
class="text-primary text-underline font-bold"
|
||||
href="https://filehostlist.miraheze.org/wiki/Free_Premium_Leeches"
|
||||
>
|
||||
File Hosting Wiki.
|
||||
</a>
|
||||
</p>
|
||||
<strong>🐧 Distros</strong>
|
||||
<p class="desc">
|
||||
They're already on
|
||||
<a
|
||||
class="text-primary text-underline font-bold"
|
||||
href="https://distrowatch.com/"
|
||||
>
|
||||
DistroWatch.
|
||||
</a>
|
||||
</p>
|
||||
<strong>🎲 Mining / Betting Sites</strong>
|
||||
<p class="desc">
|
||||
Don't post anything related to betting, mining, BINs, CCs, etc.
|
||||
</p>
|
||||
<strong>🎮 Multiplayer Game Hacks</strong>
|
||||
<p class="desc">
|
||||
Don't post any hacks/exploits that give unfair advantages in
|
||||
multiplayer games.
|
||||
</p>
|
||||
</details>
|
||||
</div>
|
||||
<textarea
|
||||
v-model="feedback.message"
|
||||
autofocus
|
||||
class="bg-$vp-c-bg-alt text-$vp-c-text-2 w-full h-[100px] border border-$vp-c-divider rounded px-3 py-1.5 border-$vp-c-divider bg-$vp-c-bg-alt b-rd-4 border-2 border-solid"
|
||||
placeholder="What a lovely wiki!"
|
||||
/>
|
||||
<p class="desc mb-2">
|
||||
Add your Discord handle if you would like a response, or if we need
|
||||
more information from you, otherwise join our
|
||||
<a
|
||||
class="text-primary text-underline font-semibold"
|
||||
href="https://rentry.co/FMHY-Invite/"
|
||||
>
|
||||
Discord.
|
||||
</a>
|
||||
</p>
|
||||
<div class="flex flex-row gap-2">
|
||||
<button
|
||||
class="bg-$vp-c-default-soft text-primary border-$vp-c-default-soft inline-flex h-7 items-center justify-center whitespace-nowrap rounded-md border-2 border-solid px-1.5 py-3.5 text-sm font-medium transition-all duration-300 sm:h-6"
|
||||
@click="feedback.type = undefined"
|
||||
>
|
||||
<span class="i-lucide:panel-left-close">close</span>
|
||||
</button>
|
||||
<button
|
||||
type="submit"
|
||||
class="border border-div rounded-lg transition-colors duration-250 inline-block text-14px font-500 leading-1.5 px-3 py-3 text-center align-middle whitespace-nowrap disabled:opacity-50 text-text-2 bg-brand-100 dark:bg-brand-700 border-brand-800 dark:border-brand-700 disabled:bg-brand-100 dark:disabled:bg-brand-900 hover:border-brand-900 dark:hover:border-brand-800 hover:bg-brand-200 dark:hover:bg-brand-800"
|
||||
:disabled="isDisabled"
|
||||
@click="handleSubmit()"
|
||||
>
|
||||
Send Feedback 📩
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
<div v-else>
|
||||
<p class="heading">Thanks for your feedback!</p>
|
||||
</div>
|
||||
</Transition>
|
||||
</div>
|
||||
</Transition>
|
||||
</template>
|
||||
|
||||
<style scoped lang="css">
|
||||
.btn {
|
||||
border: 1px solid var(--vp-c-divider);
|
||||
background-color: var(--vp-c-bg);
|
||||
border-radius: 8px;
|
||||
transition:
|
||||
border-color 0.25s,
|
||||
background-color 0.25s;
|
||||
display: inline-block;
|
||||
font-size: 14px;
|
||||
font-weight: 500;
|
||||
line-height: 1.5;
|
||||
margin: 0;
|
||||
padding: 0.375rem 0.75rem;
|
||||
text-align: center;
|
||||
vertical-align: middle;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.btn:disabled {
|
||||
opacity: 0.5;
|
||||
}
|
||||
|
||||
.btn:hover {
|
||||
border-color: var(--vp-c-brand);
|
||||
}
|
||||
|
||||
.btn-primary {
|
||||
color: #fff;
|
||||
background-color: var(--vp-c-brand);
|
||||
border-color: var(--vp-c-brand);
|
||||
}
|
||||
|
||||
.btn-primary:hover {
|
||||
background-color: var(--vp-c-brand-darker);
|
||||
border-color: var(--vp-c-brand-darker);
|
||||
}
|
||||
|
||||
.heading {
|
||||
font-size: 1.2rem;
|
||||
font-weight: 700;
|
||||
}
|
||||
|
||||
.desc {
|
||||
display: block;
|
||||
line-height: 20px;
|
||||
font-size: 12px;
|
||||
font-weight: 500;
|
||||
color: var(--vp-c-text-2);
|
||||
}
|
||||
|
||||
.fade-enter-active,
|
||||
.fade-leave-active {
|
||||
transition: opacity 0.25s ease;
|
||||
}
|
||||
|
||||
.fade-enter-from,
|
||||
.fade-leave-to {
|
||||
opacity: 0;
|
||||
}
|
||||
</style>
|
47
website/theme/components/InputField.vue
Normal file
47
website/theme/components/InputField.vue
Normal file
|
@ -0,0 +1,47 @@
|
|||
<script setup lang="ts">
|
||||
defineProps<{
|
||||
label: string
|
||||
id: string
|
||||
}>()
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div class="input-field">
|
||||
<div v-if="label" class="input-label">
|
||||
<label :for="id" class="pane-label">
|
||||
{{ label }}
|
||||
</label>
|
||||
<div class="display-value">
|
||||
<slot name="display" />
|
||||
</div>
|
||||
</div>
|
||||
<slot />
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<style scoped>
|
||||
.pane-label {
|
||||
line-height: 20px;
|
||||
font-size: 13px;
|
||||
font-weight: 600;
|
||||
color: var(--vt-c-text-1);
|
||||
display: block;
|
||||
}
|
||||
|
||||
.input-field:not(:last-child) {
|
||||
margin-bottom: 16px;
|
||||
}
|
||||
|
||||
.display-value {
|
||||
font-size: 13px;
|
||||
color: var(--vp-c-text-2);
|
||||
}
|
||||
|
||||
.input-label {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
margin-bottom: 8px;
|
||||
gap: 12px;
|
||||
}
|
||||
</style>
|
30
website/theme/components/SidebarCard.vue
Normal file
30
website/theme/components/SidebarCard.vue
Normal file
|
@ -0,0 +1,30 @@
|
|||
<script setup lang="ts">
|
||||
import Field from './CardField.vue'
|
||||
import ColorPicker from './ColorPicker.vue'
|
||||
import InputField from './InputField.vue'
|
||||
import ToggleStarred from './ToggleStarred.vue'
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div
|
||||
class="bg-$vp-c-bg border-$vp-c-default-soft hover:border-primary transition-border relative z-0 rounded-lg border-2 border-solid p-5 duration-500">
|
||||
<div class="align-center mb-4 flex justify-between">
|
||||
<div class="text-$vp-c-text-1 lh-relaxed text-sm font-bold">
|
||||
Emoji Legend
|
||||
</div>
|
||||
</div>
|
||||
<Field icon="i-twemoji-globe-with-meridians">Indexes</Field>
|
||||
<Field icon="i-twemoji-repeat-button">Storage Links</Field>
|
||||
<Field icon="i-twemoji-star">Recommendations</Field>
|
||||
<div class="align-center mb-4 mt-4 flex justify-between">
|
||||
<div class="text-$vp-c-text-1 lh-relaxed text-sm font-bold">Options</div>
|
||||
</div>
|
||||
<InputField id="toggle-starred" label="Toggle Starred">
|
||||
<template #display>
|
||||
<ToggleStarred />
|
||||
</template>
|
||||
</InputField>
|
||||
|
||||
<ColorPicker />
|
||||
</div>
|
||||
</template>
|
52
website/theme/components/Switch.vue
Normal file
52
website/theme/components/Switch.vue
Normal file
|
@ -0,0 +1,52 @@
|
|||
<script setup>
|
||||
import { Switch } from '@headlessui/vue'
|
||||
import { ref } from 'vue'
|
||||
|
||||
const enabled = ref(false)
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<Switch v-model="enabled" class="switch" :class="{ enabled }">
|
||||
<span class="thumb" />
|
||||
</Switch>
|
||||
</template>
|
||||
|
||||
<style>
|
||||
.switch {
|
||||
display: inline-flex;
|
||||
position: relative;
|
||||
width: 40px;
|
||||
height: 22px;
|
||||
flex-shrink: 0;
|
||||
border: 1px solid var(--vp-input-border-color);
|
||||
background-color: var(--vp-input-switch-bg-color);
|
||||
transition:
|
||||
border-color 0.25s,
|
||||
background-color 0.4s ease;
|
||||
border-radius: 11px;
|
||||
}
|
||||
|
||||
.switch.enabled {
|
||||
background-color: var(--vp-c-brand);
|
||||
}
|
||||
</style>
|
||||
|
||||
<style scoped>
|
||||
.switch:hover {
|
||||
border-color: var(--vp-input-hover-border-color);
|
||||
}
|
||||
|
||||
.thumb {
|
||||
display: inline-block;
|
||||
background-color: #fff;
|
||||
transition: transform 0.25s;
|
||||
width: 20px;
|
||||
height: 20px;
|
||||
border-radius: 50%;
|
||||
box-shadow: var(--vp-shadow-1);
|
||||
}
|
||||
|
||||
.switch.enabled .thumb {
|
||||
transform: translateX(18px);
|
||||
}
|
||||
</style>
|
16
website/theme/components/ToggleStarred.vue
Normal file
16
website/theme/components/ToggleStarred.vue
Normal file
|
@ -0,0 +1,16 @@
|
|||
<script setup lang="ts">
|
||||
import Switch from './Switch.vue'
|
||||
|
||||
const toggleStarred = () =>
|
||||
document.documentElement.classList.toggle('starred-only')
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<Switch @click="toggleStarred()" />
|
||||
</template>
|
||||
|
||||
<style>
|
||||
.starred-only li:not(.starred) {
|
||||
display: none;
|
||||
}
|
||||
</style>
|
346
website/theme/components/VPButton.vue
Normal file
346
website/theme/components/VPButton.vue
Normal file
|
@ -0,0 +1,346 @@
|
|||
<script setup lang="ts">
|
||||
import { computed, onMounted, onUnmounted, ref } from 'vue'
|
||||
|
||||
const KNOWN_EXTENSIONS = new Set()
|
||||
|
||||
function treatAsHtml(filename: string): boolean {
|
||||
if (KNOWN_EXTENSIONS.size === 0) {
|
||||
const extraExts =
|
||||
(typeof process === 'object' && process.env?.VITE_EXTRA_EXTENSIONS) ||
|
||||
(import.meta as any).env?.VITE_EXTRA_EXTENSIONS ||
|
||||
''
|
||||
|
||||
// md, html? are intentionally omitted
|
||||
; (
|
||||
'3g2,3gp,aac,ai,apng,au,avif,bin,bmp,cer,class,conf,crl,css,csv,dll,' +
|
||||
'doc,eps,epub,exe,gif,gz,ics,ief,jar,jpe,jpeg,jpg,js,json,jsonld,m4a,' +
|
||||
'man,mid,midi,mjs,mov,mp2,mp3,mp4,mpe,mpeg,mpg,mpp,oga,ogg,ogv,ogx,' +
|
||||
'opus,otf,p10,p7c,p7m,p7s,pdf,png,ps,qt,roff,rtf,rtx,ser,svg,t,tif,' +
|
||||
'tiff,tr,ts,tsv,ttf,txt,vtt,wav,weba,webm,webp,woff,woff2,xhtml,xml,' +
|
||||
'yaml,yml,zip' +
|
||||
(extraExts && typeof extraExts === 'string' ? ',' + extraExts : '')
|
||||
)
|
||||
.split(',')
|
||||
.forEach((ext) => KNOWN_EXTENSIONS.add(ext))
|
||||
}
|
||||
|
||||
const ext = filename.split('.').pop()
|
||||
|
||||
return ext == null || !KNOWN_EXTENSIONS.has(ext.toLowerCase())
|
||||
}
|
||||
|
||||
const EXTERNAL_URL_RE = /^(?:[a-z]+:|\/\/)/i
|
||||
|
||||
function normalizeLink(url: string): string {
|
||||
const { pathname, search, hash, protocol } = new URL(url, 'http://a.com')
|
||||
function isExternal(path: string): boolean {
|
||||
return EXTERNAL_URL_RE.test(path)
|
||||
}
|
||||
|
||||
if (
|
||||
isExternal(url) ||
|
||||
url.startsWith('#') ||
|
||||
!protocol.startsWith('http') ||
|
||||
!treatAsHtml(pathname)
|
||||
)
|
||||
return url
|
||||
|
||||
const { site } = useData()
|
||||
|
||||
const normalizedPath =
|
||||
pathname.endsWith('/') || pathname.endsWith('.html')
|
||||
? url
|
||||
: url.replace(
|
||||
/(?:(^\.+)\/)?.*$/,
|
||||
`$1${pathname.replace(
|
||||
/(\.md)?$/,
|
||||
site.value.cleanUrls ? '' : '.html'
|
||||
)}${search}${hash}`
|
||||
)
|
||||
|
||||
return withBase(normalizedPath)
|
||||
}
|
||||
|
||||
interface Props {
|
||||
tag?: string
|
||||
size?: 'medium' | 'big'
|
||||
theme?: 'brand' | 'alt' | 'sponsor'
|
||||
text?: string
|
||||
href?: string
|
||||
target?: string
|
||||
rel?: string
|
||||
}
|
||||
|
||||
const props = withDefaults(defineProps<Props>(), {
|
||||
size: 'medium',
|
||||
theme: 'brand'
|
||||
})
|
||||
|
||||
const isExternal = computed(
|
||||
() => props.href && EXTERNAL_URL_RE.test(props.href)
|
||||
)
|
||||
|
||||
const component = computed(() => {
|
||||
return props.tag || (props.href ? 'a' : 'button')
|
||||
})
|
||||
|
||||
// Dropdown functionality
|
||||
const isDropdownOpen = ref(false)
|
||||
const dropdownRef = ref<HTMLElement>()
|
||||
|
||||
const toggleDropdown = (e: Event) => {
|
||||
e.preventDefault()
|
||||
e.stopPropagation()
|
||||
isDropdownOpen.value = !isDropdownOpen.value
|
||||
}
|
||||
|
||||
const closeDropdown = () => {
|
||||
isDropdownOpen.value = false
|
||||
}
|
||||
|
||||
const handleClickOutside = (event: Event) => {
|
||||
if (dropdownRef.value && !dropdownRef.value.contains(event.target as Node)) {
|
||||
closeDropdown()
|
||||
}
|
||||
}
|
||||
|
||||
onMounted(() => {
|
||||
document.addEventListener('click', handleClickOutside)
|
||||
})
|
||||
|
||||
onUnmounted(() => {
|
||||
document.removeEventListener('click', handleClickOutside)
|
||||
})
|
||||
|
||||
const processedItems = computed(() => {
|
||||
return FMHY_HOMEPAGE_ITEMS.map((item: any) => {
|
||||
if ('items' in item && item.items) {
|
||||
return {
|
||||
...item,
|
||||
items: item.items.map((subItem: any) => ({
|
||||
...subItem,
|
||||
displayText: subItem.text || ''
|
||||
}))
|
||||
}
|
||||
}
|
||||
return {
|
||||
...item,
|
||||
displayText: item.text || ''
|
||||
}
|
||||
})
|
||||
})
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div v-if="theme === 'brand'" class="VPButtonDropdown" ref="dropdownRef">
|
||||
<div class="VPButtonWrapper">
|
||||
<component :is="component" class="VPButton VPButtonMain" :class="[size, theme]"
|
||||
:href="href ? normalizeLink(href) : undefined" :target="props.target ?? (isExternal ? '_blank' : undefined)"
|
||||
:rel="props.rel ?? (isExternal ? 'noreferrer' : undefined)">
|
||||
<slot>{{ text }}</slot>
|
||||
</component>
|
||||
<button
|
||||
class="bg-$vp-c-default-soft text-text border-$vp-c-default-soft hover:border-primary ml-3 inline-flex h-8 items-center justify-center whitespace-nowrap rounded-md border-2 border-solid px-2.5 py-4.5 text-md font-medium transition-all duration-300 sm:h-7 VPButtonTrigger"
|
||||
@click="toggleDropdown" :aria-expanded="isDropdownOpen" aria-label="Toggle dropdown menu">
|
||||
<span class="i-lucide:menu"></span>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<div v-if="isDropdownOpen" class="VPButtonDropdownMenu">
|
||||
<div class="VPButtonDropdownContent">
|
||||
<template v-for="item in processedItems" :key="item.text">
|
||||
<div v-if="'items' in item" class="VPButtonDropdownSection">
|
||||
<div class="VPButtonDropdownSectionTitle" v-html="item.text"></div>
|
||||
<a v-for="subItem in item.items" :key="subItem.text" :href="subItem.link" class="VPButtonDropdownItem"
|
||||
@click="closeDropdown">
|
||||
<span v-html="subItem.displayText"></span>
|
||||
</a>
|
||||
</div>
|
||||
<a v-else :href="item.link" class="VPButtonDropdownItem" @click="closeDropdown">
|
||||
<span v-html="item.displayText"></span>
|
||||
</a>
|
||||
</template>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<component v-else :is="component" class="VPButton" :class="[size, theme]"
|
||||
:href="href ? normalizeLink(href) : undefined" :target="props.target ?? (isExternal ? '_blank' : undefined)"
|
||||
:rel="props.rel ?? (isExternal ? 'noreferrer' : undefined)">
|
||||
<slot>{{ text }}</slot>
|
||||
</component>
|
||||
</template>
|
||||
|
||||
<style scoped>
|
||||
.VPButton {
|
||||
display: inline-block;
|
||||
border: 1px solid transparent;
|
||||
text-align: center;
|
||||
font-weight: 600;
|
||||
white-space: nowrap;
|
||||
transition: color 0.25s, border-color 0.25s, background-color 0.25s;
|
||||
}
|
||||
|
||||
.VPButton:active {
|
||||
transition: color 0.1s, border-color 0.1s, background-color 0.1s;
|
||||
}
|
||||
|
||||
.VPButton.medium {
|
||||
border-radius: 20px;
|
||||
padding: 0 20px;
|
||||
line-height: 38px;
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
.VPButton.big {
|
||||
border-radius: 24px;
|
||||
padding: 0 24px;
|
||||
line-height: 46px;
|
||||
font-size: 16px;
|
||||
}
|
||||
|
||||
.VPButton.brand {
|
||||
border-color: var(--vp-button-brand-border);
|
||||
color: var(--vp-button-brand-text);
|
||||
background-color: var(--vp-button-brand-bg);
|
||||
}
|
||||
|
||||
.VPButton.brand:hover {
|
||||
border-color: var(--vp-button-brand-hover-border);
|
||||
color: var(--vp-button-brand-hover-text);
|
||||
background-color: var(--vp-button-brand-hover-bg);
|
||||
}
|
||||
|
||||
.VPButton.brand:active {
|
||||
border-color: var(--vp-button-brand-active-border);
|
||||
color: var(--vp-button-brand-active-text);
|
||||
background-color: var(--vp-button-brand-active-bg);
|
||||
}
|
||||
|
||||
.VPButton.alt {
|
||||
border-color: var(--vp-button-alt-border);
|
||||
color: var(--vp-button-alt-text);
|
||||
background-color: var(--vp-button-alt-bg);
|
||||
}
|
||||
|
||||
.VPButton.alt:hover {
|
||||
border-color: var(--vp-button-alt-hover-border);
|
||||
color: var(--vp-button-alt-hover-text);
|
||||
background-color: var(--vp-button-alt-hover-bg);
|
||||
}
|
||||
|
||||
.VPButton.alt:active {
|
||||
border-color: var(--vp-button-alt-active-border);
|
||||
color: var(--vp-button-alt-active-text);
|
||||
background-color: var(--vp-button-alt-active-bg);
|
||||
}
|
||||
|
||||
.VPButton.sponsor {
|
||||
border-color: var(--vp-button-sponsor-border);
|
||||
color: var(--vp-button-sponsor-text);
|
||||
background-color: var(--vp-button-sponsor-bg);
|
||||
}
|
||||
|
||||
.VPButton.sponsor:hover {
|
||||
border-color: var(--vp-button-sponsor-hover-border);
|
||||
color: var(--vp-button-sponsor-hover-text);
|
||||
background-color: var(--vp-button-sponsor-hover-bg);
|
||||
}
|
||||
|
||||
.VPButton.sponsor:active {
|
||||
border-color: var(--vp-button-sponsor-active-border);
|
||||
color: var(--vp-button-sponsor-active-text);
|
||||
background-color: var(--vp-button-sponsor-active-bg);
|
||||
}
|
||||
|
||||
/* Dropdown styles */
|
||||
.VPButtonDropdown {
|
||||
position: relative;
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
.VPButtonWrapper {
|
||||
display: flex;
|
||||
align-items: stretch;
|
||||
}
|
||||
|
||||
.VPButtonMain {
|
||||
border-top-right-radius: 0;
|
||||
border-bottom-right-radius: 0;
|
||||
border-right: none;
|
||||
}
|
||||
|
||||
.VPButtonDropdownMenu {
|
||||
position: absolute;
|
||||
top: 100%;
|
||||
left: 0;
|
||||
right: 0;
|
||||
z-index: 50;
|
||||
margin-top: 4px;
|
||||
background-color: var(--vp-c-bg-elv);
|
||||
border: 1px solid var(--vp-c-divider);
|
||||
border-radius: 12px;
|
||||
box-shadow: 0 12px 32px rgba(0, 0, 0, 0.1), 0 2px 6px rgba(0, 0, 0, 0.08);
|
||||
min-width: 280px;
|
||||
max-height: 400px;
|
||||
overflow-y: auto;
|
||||
}
|
||||
|
||||
.VPButtonDropdownContent {
|
||||
padding: 8px;
|
||||
}
|
||||
|
||||
.VPButtonDropdownSection {
|
||||
margin-bottom: 8px;
|
||||
}
|
||||
|
||||
.VPButtonDropdownSection:last-child {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
.VPButtonDropdownSectionTitle {
|
||||
font-size: 12px;
|
||||
font-weight: 600;
|
||||
color: var(--vp-c-text-2);
|
||||
padding: 8px 12px 4px;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 0.5px;
|
||||
}
|
||||
|
||||
.VPButtonDropdownItem {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 8px;
|
||||
padding: 8px 12px;
|
||||
border-radius: 6px;
|
||||
color: var(--vp-c-text-1);
|
||||
text-decoration: none;
|
||||
font-size: 14px;
|
||||
transition: background-color 0.2s ease;
|
||||
}
|
||||
|
||||
.VPButtonDropdownItem:hover {
|
||||
background-color: var(--vp-c-bg-alt);
|
||||
color: var(--vp-c-brand-1);
|
||||
}
|
||||
|
||||
.VPButtonDropdownIcon {
|
||||
width: 16px;
|
||||
height: 16px;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
|
||||
.VPButtonDropdownItem span :deep([class*="i-"]) {
|
||||
width: 16px;
|
||||
height: 16px;
|
||||
flex-shrink: 0;
|
||||
margin-right: 8px;
|
||||
}
|
||||
|
||||
.VPButtonDropdownSectionTitle :deep([class*="i-"]) {
|
||||
width: 14px;
|
||||
height: 14px;
|
||||
flex-shrink: 0;
|
||||
margin-right: 6px;
|
||||
}
|
||||
</style>
|
37
website/theme/components/WallpaperCard.vue
Normal file
37
website/theme/components/WallpaperCard.vue
Normal file
|
@ -0,0 +1,37 @@
|
|||
<script setup lang="ts">
|
||||
defineProps<{
|
||||
title: string
|
||||
description: string
|
||||
mobile: string
|
||||
desktop: string
|
||||
}>()
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div class="bg-bg-elv text-text w-full max-w-md rounded-lg border shadow-sm">
|
||||
<div class="flex flex-col space-y-1.5 p-6 pb-4">
|
||||
<h4
|
||||
class="whitespace-nowrap text-2xl font-semibold leading-none tracking-tight"
|
||||
>
|
||||
{{ title }}
|
||||
</h4>
|
||||
<p class="text-text-2 text-sm font-medium leading-none tracking-tight">
|
||||
{{ description }}
|
||||
</p>
|
||||
</div>
|
||||
<div class="p-6">
|
||||
<img
|
||||
:src="desktop"
|
||||
:alt="title"
|
||||
class="aspect-[3/2] rounded-md object-cover"
|
||||
width="1080"
|
||||
height="1920"
|
||||
/>
|
||||
</div>
|
||||
<div class="flex items-center gap-2 p-6">
|
||||
<a :href="mobile" target="_blank">Mobile</a>
|
||||
<span class="text-text-2">•</span>
|
||||
<a :href="desktop" target="_blank">Desktop</a>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
733
website/theme/components/startpage/Bookmarks.vue
Normal file
733
website/theme/components/startpage/Bookmarks.vue
Normal file
|
@ -0,0 +1,733 @@
|
|||
<script setup lang="ts">
|
||||
import {
|
||||
DialogClose,
|
||||
DialogContent,
|
||||
DialogDescription,
|
||||
DialogOverlay,
|
||||
DialogPortal,
|
||||
DialogRoot,
|
||||
DialogTitle,
|
||||
DialogTrigger
|
||||
} from 'reka-ui'
|
||||
import { useRouter } from 'vitepress'
|
||||
import { onMounted, onUnmounted, ref, watch } from 'vue'
|
||||
|
||||
const router = useRouter()
|
||||
|
||||
export type BookmarkType = {
|
||||
name: string
|
||||
chord: string
|
||||
url: string
|
||||
icon?: string // e.g. 'i-logos:github'
|
||||
color?: string
|
||||
isCustom?: boolean // Track if it's a custom bookmark
|
||||
customSvg?: string // Store custom SVG icon
|
||||
}
|
||||
|
||||
const props = defineProps<{ isInputGloballyFocused: boolean }>()
|
||||
|
||||
const currentChordInput = ref('')
|
||||
const activePossibleChords = ref<BookmarkType[]>([])
|
||||
const customBookmarks = ref<BookmarkType[]>([])
|
||||
const allBookmarks = ref<BookmarkType[]>([])
|
||||
|
||||
// Dialog states
|
||||
const isAddDialogOpen = ref(false)
|
||||
const isEditDialogOpen = ref(false)
|
||||
const isDeleteDialogOpen = ref(false)
|
||||
|
||||
// Form states
|
||||
const formData = ref<BookmarkType>({
|
||||
name: '',
|
||||
chord: '',
|
||||
url: '',
|
||||
icon: '',
|
||||
color: '',
|
||||
isCustom: true,
|
||||
customSvg: ''
|
||||
})
|
||||
|
||||
const editingBookmark = ref<BookmarkType | null>(null)
|
||||
const deletingBookmark = ref<BookmarkType | null>(null)
|
||||
|
||||
let chordTimeout: NodeJS.Timeout | null = null
|
||||
|
||||
const initialBookmarksData: BookmarkType[] = [
|
||||
{
|
||||
name: 'Hacker News',
|
||||
chord: 'HN',
|
||||
url: 'https://news.ycombinator.com/',
|
||||
icon: 'i-logos:ycombinator'
|
||||
},
|
||||
{
|
||||
name: 'GitHub',
|
||||
chord: 'GH',
|
||||
url: 'https://github.com/',
|
||||
icon: 'i-simple-icons:github'
|
||||
},
|
||||
{
|
||||
name: 'Reddit',
|
||||
chord: 'RD',
|
||||
url: 'https://reddit.com/',
|
||||
icon: 'i-logos:reddit-icon'
|
||||
},
|
||||
{
|
||||
name: 'Twitter',
|
||||
chord: 'TW',
|
||||
url: 'https://twitter.com/',
|
||||
icon: 'i-logos:twitter'
|
||||
},
|
||||
{
|
||||
name: 'YouTube',
|
||||
chord: 'YT',
|
||||
url: 'https://youtube.com/',
|
||||
icon: 'i-logos:youtube-icon'
|
||||
},
|
||||
{
|
||||
name: 'Wikipedia',
|
||||
chord: 'WK',
|
||||
url: 'https://wikipedia.org/',
|
||||
icon: 'i-simple-icons:wikipedia'
|
||||
},
|
||||
{
|
||||
name: "Beginner's Guide",
|
||||
chord: 'BG',
|
||||
url: '/beginners-guide',
|
||||
icon: 'i-lucide:book-open-text'
|
||||
},
|
||||
{
|
||||
name: 'Wotaku',
|
||||
chord: 'WT',
|
||||
url: 'https://wotaku.wiki/',
|
||||
icon: 'i-twemoji:flag-japan'
|
||||
},
|
||||
{
|
||||
name: 'privateersclub',
|
||||
chord: 'PC',
|
||||
url: 'https://megathread.pages.dev/',
|
||||
icon: 'i-custom:privateersclub'
|
||||
}
|
||||
]
|
||||
|
||||
// Load custom bookmarks from localStorage
|
||||
const loadCustomBookmarks = () => {
|
||||
try {
|
||||
const stored = localStorage.getItem('customBookmarks')
|
||||
if (stored) {
|
||||
customBookmarks.value = JSON.parse(stored)
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('Error loading custom bookmarks:', error)
|
||||
}
|
||||
}
|
||||
|
||||
// Save custom bookmarks to localStorage
|
||||
const saveCustomBookmarks = () => {
|
||||
try {
|
||||
localStorage.setItem(
|
||||
'customBookmarks',
|
||||
JSON.stringify(customBookmarks.value)
|
||||
)
|
||||
} catch (error) {
|
||||
console.error('Error saving custom bookmarks:', error)
|
||||
}
|
||||
}
|
||||
|
||||
// Update all bookmarks when custom bookmarks change
|
||||
const updateAllBookmarks = () => {
|
||||
allBookmarks.value = [...initialBookmarksData, ...customBookmarks.value]
|
||||
}
|
||||
|
||||
// Watch for changes in custom bookmarks
|
||||
watch(
|
||||
customBookmarks,
|
||||
() => {
|
||||
updateAllBookmarks()
|
||||
saveCustomBookmarks()
|
||||
},
|
||||
{ deep: true }
|
||||
)
|
||||
|
||||
const resetChord = () => {
|
||||
currentChordInput.value = ''
|
||||
activePossibleChords.value = []
|
||||
if (chordTimeout) clearTimeout(chordTimeout)
|
||||
chordTimeout = null
|
||||
}
|
||||
|
||||
const handleBookmarkClick = (bookmark: BookmarkType) => {
|
||||
if (bookmark.url.startsWith('/')) {
|
||||
router.go(bookmark.url)
|
||||
} else {
|
||||
window.open(bookmark.url, '_self')
|
||||
}
|
||||
}
|
||||
|
||||
// Form validation
|
||||
const isFormValid = () => {
|
||||
return (
|
||||
formData.value.name.trim() &&
|
||||
formData.value.chord.trim() &&
|
||||
formData.value.url.trim() &&
|
||||
!isChordTaken(formData.value.chord, editingBookmark.value?.chord)
|
||||
)
|
||||
}
|
||||
|
||||
const isChordTaken = (chord: string, excludeChord?: string) => {
|
||||
return allBookmarks.value.some(
|
||||
(b) =>
|
||||
b.chord.toUpperCase() === chord.toUpperCase() && b.chord !== excludeChord
|
||||
)
|
||||
}
|
||||
|
||||
// Reset form
|
||||
const resetForm = () => {
|
||||
formData.value = {
|
||||
name: '',
|
||||
chord: '',
|
||||
url: '',
|
||||
icon: '',
|
||||
color: '',
|
||||
isCustom: true,
|
||||
customSvg: ''
|
||||
}
|
||||
}
|
||||
|
||||
// Add bookmark
|
||||
const handleAddBookmark = () => {
|
||||
if (!isFormValid()) return
|
||||
|
||||
const newBookmark: BookmarkType = {
|
||||
...formData.value,
|
||||
chord: formData.value.chord.toUpperCase(),
|
||||
isCustom: true
|
||||
}
|
||||
|
||||
// If no icon and no custom SVG, use default website icon
|
||||
if (!newBookmark.icon && !newBookmark.customSvg) {
|
||||
newBookmark.icon = 'i-lucide:globe'
|
||||
}
|
||||
|
||||
customBookmarks.value.push(newBookmark)
|
||||
isAddDialogOpen.value = false
|
||||
resetForm()
|
||||
}
|
||||
|
||||
// Edit bookmark
|
||||
const openEditDialog = (bookmark: BookmarkType) => {
|
||||
editingBookmark.value = bookmark
|
||||
formData.value = { ...bookmark }
|
||||
isEditDialogOpen.value = true
|
||||
}
|
||||
|
||||
const handleEditBookmark = () => {
|
||||
if (!isFormValid() || !editingBookmark.value) return
|
||||
|
||||
const index = customBookmarks.value.findIndex(
|
||||
(b) => b === editingBookmark.value
|
||||
)
|
||||
if (index !== -1) {
|
||||
customBookmarks.value[index] = {
|
||||
...formData.value,
|
||||
chord: formData.value.chord.toUpperCase(),
|
||||
isCustom: true
|
||||
}
|
||||
|
||||
// If no icon and no custom SVG, use default website icon
|
||||
if (
|
||||
!customBookmarks.value[index].icon &&
|
||||
!customBookmarks.value[index].customSvg
|
||||
) {
|
||||
customBookmarks.value[index].icon = 'i-lucide:globe'
|
||||
}
|
||||
}
|
||||
|
||||
isEditDialogOpen.value = false
|
||||
editingBookmark.value = null
|
||||
resetForm()
|
||||
}
|
||||
|
||||
// Delete bookmark
|
||||
const openDeleteDialog = (bookmark: BookmarkType) => {
|
||||
deletingBookmark.value = bookmark
|
||||
isDeleteDialogOpen.value = true
|
||||
}
|
||||
|
||||
const handleDeleteBookmark = () => {
|
||||
if (!deletingBookmark.value) return
|
||||
|
||||
const index = customBookmarks.value.findIndex(
|
||||
(b) => b === deletingBookmark.value
|
||||
)
|
||||
if (index !== -1) {
|
||||
customBookmarks.value.splice(index, 1)
|
||||
}
|
||||
|
||||
isDeleteDialogOpen.value = false
|
||||
deletingBookmark.value = null
|
||||
}
|
||||
|
||||
// Handle SVG input
|
||||
const handleSvgInput = (event: Event) => {
|
||||
const target = event.target as HTMLTextAreaElement
|
||||
formData.value.customSvg = target.value
|
||||
}
|
||||
|
||||
const handleKeyDown = (e: KeyboardEvent) => {
|
||||
if (
|
||||
props.isInputGloballyFocused ||
|
||||
e.altKey ||
|
||||
e.metaKey ||
|
||||
e.ctrlKey ||
|
||||
e.shiftKey
|
||||
)
|
||||
return
|
||||
|
||||
const active = document.activeElement as HTMLElement | null
|
||||
if (
|
||||
active?.tagName === 'INPUT' ||
|
||||
active?.tagName === 'TEXTAREA' ||
|
||||
active?.isContentEditable
|
||||
)
|
||||
return
|
||||
|
||||
const key = e.key.toUpperCase()
|
||||
if (chordTimeout) clearTimeout(chordTimeout)
|
||||
|
||||
if (!currentChordInput.value) {
|
||||
const matches = allBookmarks.value.filter((b) => b.chord.startsWith(key))
|
||||
if (matches.length) {
|
||||
e.preventDefault()
|
||||
currentChordInput.value = key
|
||||
activePossibleChords.value = matches
|
||||
chordTimeout = setTimeout(resetChord, 2000)
|
||||
}
|
||||
} else {
|
||||
const next = currentChordInput.value + key
|
||||
const match = activePossibleChords.value.find((b) => b.chord === next)
|
||||
if (match) {
|
||||
if (match.url.startsWith('/')) {
|
||||
router.go(match.url)
|
||||
} else {
|
||||
window.open(match.url, '_self')
|
||||
}
|
||||
resetChord()
|
||||
} else {
|
||||
const filtered = allBookmarks.value.filter((b) =>
|
||||
b.chord.startsWith(next)
|
||||
)
|
||||
if (filtered.length) {
|
||||
currentChordInput.value = next
|
||||
activePossibleChords.value = filtered
|
||||
chordTimeout = setTimeout(resetChord, 2000)
|
||||
} else {
|
||||
resetChord()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
onMounted(() => {
|
||||
loadCustomBookmarks()
|
||||
updateAllBookmarks()
|
||||
document.addEventListener('keydown', handleKeyDown)
|
||||
})
|
||||
|
||||
onUnmounted(() => {
|
||||
document.removeEventListener('keydown', handleKeyDown)
|
||||
if (chordTimeout) clearTimeout(chordTimeout)
|
||||
})
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div class="space-y-4">
|
||||
<div class="flex items-center justify-between">
|
||||
<div class="flex items-center gap-2 text-text-2">
|
||||
<i class="i-lucide:bookmark w-5 h-5" />
|
||||
<h2 class="text-xl">Bookmarks</h2>
|
||||
</div>
|
||||
<div class="flex items-center gap-2">
|
||||
<div
|
||||
v-if="currentChordInput"
|
||||
class="px-3 py-1 rounded-md text-sm font-medium bg-yellow-200/20 text-yellow-600"
|
||||
>
|
||||
Chord: {{ currentChordInput }}...
|
||||
</div>
|
||||
|
||||
<!-- Add Bookmark Button -->
|
||||
<DialogRoot v-model:open="isAddDialogOpen">
|
||||
<DialogTrigger as-child>
|
||||
<button
|
||||
class="flex items-center gap-2 px-3 py-1.5 rounded-md text-sm font-medium bg-bg-alt text-white hover:opacity-80 transition-opacity"
|
||||
>
|
||||
<i class="i-lucide:plus w-4 h-4" />
|
||||
Add Bookmark
|
||||
</button>
|
||||
</DialogTrigger>
|
||||
|
||||
<DialogPortal>
|
||||
<DialogOverlay class="fixed inset-0 bg-black/50 z-50" />
|
||||
<DialogContent
|
||||
description="Add New Bookmark"
|
||||
class="fixed top-1/2 left-1/2 transform -translate-x-1/2 -translate-y-1/2 bg-bg border border-div rounded-lg p-6 w-full max-w-md z-50 max-h-[90vh] overflow-y-auto"
|
||||
>
|
||||
<DialogTitle class="text-lg font-semibold text-text mb-4">
|
||||
Add New Bookmark
|
||||
</DialogTitle>
|
||||
<DialogDescription class="text-text-2 mb-6">
|
||||
Add a new bookmark
|
||||
</DialogDescription>
|
||||
<form @submit.prevent="handleAddBookmark" class="space-y-4">
|
||||
<div>
|
||||
<label class="block text-sm font-medium text-text-2 mb-1">
|
||||
Name
|
||||
</label>
|
||||
<input
|
||||
v-model="formData.name"
|
||||
type="text"
|
||||
required
|
||||
class="w-full px-3 py-2 border border-div rounded-md bg-bg-alt text-text focus:border-primary outline-none"
|
||||
placeholder="Bookmark name"
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<label class="block text-sm font-medium text-text-2 mb-1">
|
||||
Chord (2 letters)
|
||||
</label>
|
||||
<input
|
||||
v-model="formData.chord"
|
||||
type="text"
|
||||
required
|
||||
maxlength="2"
|
||||
class="w-full px-3 py-2 border border-div rounded-md bg-bg-alt text-text focus:border-primary outline-none uppercase"
|
||||
placeholder="AB"
|
||||
@input="
|
||||
(e) =>
|
||||
(formData.chord = (
|
||||
e.target as HTMLInputElement
|
||||
).value.toUpperCase())
|
||||
"
|
||||
/>
|
||||
<p
|
||||
v-if="isChordTaken(formData.chord)"
|
||||
class="text-red-500 text-xs mt-1"
|
||||
>
|
||||
This chord is already taken
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<label class="block text-sm font-medium text-text-2 mb-1">
|
||||
URL
|
||||
</label>
|
||||
<input
|
||||
v-model="formData.url"
|
||||
type="url"
|
||||
required
|
||||
class="w-full px-3 py-2 border border-div rounded-md bg-bg-alt text-text focus:border-primary outline-none"
|
||||
placeholder="https://example.com"
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<label class="block text-sm font-medium text-text-2 mb-1">
|
||||
Icon (UnoCSS class)
|
||||
</label>
|
||||
<input
|
||||
v-model="formData.icon"
|
||||
type="text"
|
||||
class="w-full px-3 py-2 border border-div rounded-md bg-bg-alt text-text focus:border-primary outline-none"
|
||||
placeholder="i-lucide:globe (optional)"
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<label class="block text-sm font-medium text-text-2 mb-1">
|
||||
Custom SVG Icon
|
||||
</label>
|
||||
<textarea
|
||||
v-model="formData.customSvg"
|
||||
class="w-full px-3 py-2 border border-div rounded-md bg-bg-alt text-text focus:border-primary outline-none h-20 resize-none"
|
||||
placeholder="Paste SVG code here (optional)"
|
||||
/>
|
||||
<p class="text-xs text-text-2 mt-1">
|
||||
If provided, this will override the icon class
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<label class="block text-sm font-medium text-text-2 mb-1">
|
||||
Color
|
||||
</label>
|
||||
<input
|
||||
v-model="formData.color"
|
||||
type="text"
|
||||
class="w-full px-3 py-2 border border-div rounded-md bg-bg-alt text-text focus:border-primary outline-none"
|
||||
placeholder="#3B82F6 (optional)"
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div class="flex gap-3 pt-4">
|
||||
<button
|
||||
type="submit"
|
||||
:disabled="!isFormValid()"
|
||||
class="flex-1 bg-primary text-white py-2 px-4 rounded-md font-medium hover:opacity-80 disabled:opacity-50 disabled:cursor-not-allowed transition-opacity"
|
||||
>
|
||||
Add Bookmark
|
||||
</button>
|
||||
<DialogClose as-child>
|
||||
<button
|
||||
type="button"
|
||||
class="flex-1 bg-bg-alt text-text py-2 px-4 rounded-md font-medium border border-div hover:bg-bg-elv transition-colors"
|
||||
>
|
||||
Cancel
|
||||
</button>
|
||||
</DialogClose>
|
||||
</div>
|
||||
</form>
|
||||
</DialogContent>
|
||||
</DialogPortal>
|
||||
</DialogRoot>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div
|
||||
class="grid grid-cols-2 sm:grid-cols-3 lg:grid-cols-5 xl:grid-cols-6 gap-2"
|
||||
>
|
||||
<div
|
||||
v-for="bookmark in allBookmarks"
|
||||
:key="bookmark.name"
|
||||
class="relative group"
|
||||
>
|
||||
<button
|
||||
:class="[
|
||||
'w-full rounded-md border border-div bg-bg-alt px-3 py-2 text-left transition-opacity duration-150',
|
||||
activePossibleChords.some((ab) => ab.chord === bookmark.chord)
|
||||
? bookmark.chord === currentChordInput
|
||||
? 'opacity-100 ring-2 ring-primary ring-offset-2 ring-offset-bg'
|
||||
: 'opacity-75'
|
||||
: currentChordInput
|
||||
? 'opacity-30'
|
||||
: 'opacity-100'
|
||||
]"
|
||||
@click="handleBookmarkClick(bookmark)"
|
||||
>
|
||||
<div
|
||||
class="flex flex-col sm:flex-row sm:items-center sm:justify-between gap-1 sm:gap-3 w-full"
|
||||
>
|
||||
<div class="flex items-center gap-2 truncate">
|
||||
<!-- Custom SVG Icon -->
|
||||
<div
|
||||
v-if="bookmark.customSvg"
|
||||
class="shrink-0 w-4 h-4"
|
||||
v-html="bookmark.customSvg"
|
||||
/>
|
||||
<!-- Regular Icon -->
|
||||
<i
|
||||
v-else-if="bookmark.icon"
|
||||
:class="`shrink-0 w-4 h-4 ${bookmark.icon}`"
|
||||
:style="bookmark.color ? { color: bookmark.color } : {}"
|
||||
/>
|
||||
<!-- Fallback Icon -->
|
||||
<i v-else class="shrink-0 w-4 h-4 i-lucide:globe" />
|
||||
|
||||
<span class="truncate font-medium">{{ bookmark.name }}</span>
|
||||
</div>
|
||||
<div class="hidden sm:flex text-xs items-center gap-1 text-text-2">
|
||||
<kbd
|
||||
v-for="(char, i) in bookmark.chord.split('')"
|
||||
:key="i"
|
||||
class="bg-bg border border-div px-1 py-0.5 rounded text-sm font-semibold"
|
||||
>
|
||||
{{ char }}
|
||||
</kbd>
|
||||
</div>
|
||||
</div>
|
||||
</button>
|
||||
|
||||
<!-- Edit/Delete buttons for custom bookmarks -->
|
||||
<div
|
||||
v-if="bookmark.isCustom"
|
||||
class="absolute top-1 right-1 opacity-0 group-hover:opacity-100 transition-opacity flex gap-1"
|
||||
>
|
||||
<button
|
||||
@click.stop="openEditDialog(bookmark)"
|
||||
class="p-1 bg-bg-elv border border-div rounded hover:bg-bg-alt transition-colors"
|
||||
title="Edit bookmark"
|
||||
>
|
||||
<i class="i-lucide:edit-2 w-3 h-3 text-text-2" />
|
||||
</button>
|
||||
<button
|
||||
@click.stop="openDeleteDialog(bookmark)"
|
||||
class="p-1 bg-bg-elv border border-div rounded hover:bg-red-100 hover:text-red-600 transition-colors"
|
||||
title="Delete bookmark"
|
||||
>
|
||||
<i class="i-lucide:trash-2 w-3 h-3 text-text-2" />
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Edit Dialog -->
|
||||
<DialogRoot v-model:open="isEditDialogOpen">
|
||||
<DialogPortal>
|
||||
<DialogOverlay class="fixed inset-0 bg-black/50 z-50" />
|
||||
<DialogContent
|
||||
class="fixed top-1/2 left-1/2 transform -translate-x-1/2 -translate-y-1/2 bg-bg border border-div rounded-lg p-6 w-full max-w-md z-50 max-h-[90vh] overflow-y-auto"
|
||||
>
|
||||
<DialogTitle class="text-lg font-semibold text-text mb-4">
|
||||
Edit Bookmark
|
||||
</DialogTitle>
|
||||
<DialogDescription class="text-text-2 mb-6">
|
||||
Editing "{{ editingBookmark?.name }}"
|
||||
</DialogDescription>
|
||||
<form @submit.prevent="handleEditBookmark" class="space-y-4">
|
||||
<div>
|
||||
<label class="block text-sm font-medium text-text-2 mb-1">
|
||||
Name
|
||||
</label>
|
||||
<input
|
||||
v-model="formData.name"
|
||||
type="text"
|
||||
required
|
||||
class="w-full px-3 py-2 border border-div rounded-md bg-bg-alt text-text focus:border-primary outline-none"
|
||||
placeholder="Bookmark name"
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<label class="block text-sm font-medium text-text-2 mb-1">
|
||||
Chord (2 letters)
|
||||
</label>
|
||||
<input
|
||||
v-model="formData.chord"
|
||||
type="text"
|
||||
required
|
||||
maxlength="2"
|
||||
class="w-full px-3 py-2 border border-div rounded-md bg-bg-alt text-text focus:border-primary outline-none uppercase"
|
||||
placeholder="AB"
|
||||
@input="
|
||||
(e) =>
|
||||
(formData.chord = (
|
||||
e.target as HTMLInputElement
|
||||
).value.toUpperCase())
|
||||
"
|
||||
/>
|
||||
<p
|
||||
v-if="isChordTaken(formData.chord, editingBookmark?.chord)"
|
||||
class="text-red-500 text-xs mt-1"
|
||||
>
|
||||
This chord is already taken
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<label class="block text-sm font-medium text-text-2 mb-1">
|
||||
URL
|
||||
</label>
|
||||
<input
|
||||
v-model="formData.url"
|
||||
type="url"
|
||||
required
|
||||
class="w-full px-3 py-2 border border-div rounded-md bg-bg-alt text-text focus:border-primary outline-none"
|
||||
placeholder="https://example.com"
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<label class="block text-sm font-medium text-text-2 mb-1">
|
||||
Icon (UnoCSS class)
|
||||
</label>
|
||||
<input
|
||||
v-model="formData.icon"
|
||||
type="text"
|
||||
class="w-full px-3 py-2 border border-div rounded-md bg-bg-alt text-text focus:border-primary outline-none"
|
||||
placeholder="i-lucide:globe (optional)"
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<label class="block text-sm font-medium text-text-2 mb-1">
|
||||
Custom SVG Icon
|
||||
</label>
|
||||
<textarea
|
||||
v-model="formData.customSvg"
|
||||
class="w-full px-3 py-2 border border-div rounded-md bg-bg-alt text-text focus:border-primary outline-none h-20 resize-none"
|
||||
placeholder="Paste SVG code here (optional)"
|
||||
/>
|
||||
<p class="text-xs text-text-2 mt-1">
|
||||
If provided, this will override the icon class
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<label class="block text-sm font-medium text-text-2 mb-1">
|
||||
Color
|
||||
</label>
|
||||
<input
|
||||
v-model="formData.color"
|
||||
type="text"
|
||||
class="w-full px-3 py-2 border border-div rounded-md bg-bg-alt text-text focus:border-primary outline-none"
|
||||
placeholder="#3B82F6 (optional)"
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div class="flex gap-3 pt-4">
|
||||
<button
|
||||
type="submit"
|
||||
:disabled="!isFormValid()"
|
||||
class="flex-1 bg-primary text-white py-2 px-4 rounded-md font-medium hover:opacity-80 disabled:opacity-50 disabled:cursor-not-allowed transition-opacity"
|
||||
>
|
||||
Save Changes
|
||||
</button>
|
||||
<DialogClose as-child>
|
||||
<button
|
||||
type="button"
|
||||
class="flex-1 bg-bg-alt text-text py-2 px-4 rounded-md font-medium border border-div hover:bg-bg-elv transition-colors"
|
||||
>
|
||||
Cancel
|
||||
</button>
|
||||
</DialogClose>
|
||||
</div>
|
||||
</form>
|
||||
</DialogContent>
|
||||
</DialogPortal>
|
||||
</DialogRoot>
|
||||
|
||||
<!-- Delete Confirmation Dialog -->
|
||||
<DialogRoot v-model:open="isDeleteDialogOpen">
|
||||
<DialogPortal>
|
||||
<DialogOverlay class="fixed inset-0 bg-black/50 z-50" />
|
||||
<DialogContent
|
||||
class="fixed top-1/2 left-1/2 transform -translate-x-1/2 -translate-y-1/2 bg-bg border border-div rounded-lg p-6 w-full max-w-md z-50"
|
||||
>
|
||||
<DialogTitle class="text-lg font-semibold text-text mb-2">
|
||||
Delete Bookmark
|
||||
</DialogTitle>
|
||||
<DialogDescription class="text-text-2 mb-6">
|
||||
Are you sure you want to delete "{{ deletingBookmark?.name }}"? This
|
||||
action cannot be undone.
|
||||
</DialogDescription>
|
||||
|
||||
<div class="flex gap-3">
|
||||
<button
|
||||
@click="handleDeleteBookmark"
|
||||
class="flex-1 bg-red-600 text-white py-2 px-4 rounded-md font-medium hover:bg-red-700 transition-colors"
|
||||
>
|
||||
Delete
|
||||
</button>
|
||||
<DialogClose as-child>
|
||||
<button
|
||||
type="button"
|
||||
class="flex-1 bg-bg-alt text-text py-2 px-4 rounded-md font-medium border border-div hover:bg-bg-elv transition-colors"
|
||||
>
|
||||
Cancel
|
||||
</button>
|
||||
</DialogClose>
|
||||
</div>
|
||||
</DialogContent>
|
||||
</DialogPortal>
|
||||
</DialogRoot>
|
||||
</div>
|
||||
</template>
|
29
website/theme/components/startpage/Clock.vue
Normal file
29
website/theme/components/startpage/Clock.vue
Normal file
|
@ -0,0 +1,29 @@
|
|||
<template>
|
||||
<div class="text-6xl font-bold text-text">
|
||||
{{ timeString }}
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { onMounted, onUnmounted, ref } from 'vue'
|
||||
|
||||
const time = ref<Date | null>(null)
|
||||
|
||||
function updateTime() {
|
||||
time.value = new Date()
|
||||
}
|
||||
|
||||
onMounted(() => {
|
||||
updateTime()
|
||||
const interval = setInterval(updateTime, 1000)
|
||||
onUnmounted(() => clearInterval(interval))
|
||||
})
|
||||
|
||||
const timeString = computed(() => {
|
||||
if (!time.value) return '--:--:--'
|
||||
const h = String(time.value.getHours()).padStart(2, '0')
|
||||
const m = String(time.value.getMinutes()).padStart(2, '0')
|
||||
const s = String(time.value.getSeconds()).padStart(2, '0')
|
||||
return `${h}:${m}:${s}`
|
||||
})
|
||||
</script>
|
194
website/theme/components/startpage/SearchBar.vue
Normal file
194
website/theme/components/startpage/SearchBar.vue
Normal file
|
@ -0,0 +1,194 @@
|
|||
<script setup lang="ts">
|
||||
import { onMounted, onUnmounted, ref } from 'vue'
|
||||
import Clock from './Clock.vue'
|
||||
|
||||
export interface PlatformType {
|
||||
name: string
|
||||
key: string
|
||||
url: string
|
||||
icon?: string
|
||||
color?: string
|
||||
}
|
||||
|
||||
const props = defineProps<{
|
||||
onFocusChange: (focused: boolean) => void
|
||||
initialQuery?: string
|
||||
}>()
|
||||
|
||||
const platforms: PlatformType[] = [
|
||||
{
|
||||
name: 'SearXNG',
|
||||
key: 'a',
|
||||
url: 'https://searx.fmhy.net/search?q=',
|
||||
icon: 'i-simple-icons:searxng'
|
||||
},
|
||||
{
|
||||
name: 'ChatGPT',
|
||||
key: 's',
|
||||
url: 'https://chat.openai.com/?q=',
|
||||
icon: 'i-simple-icons:openai'
|
||||
},
|
||||
{
|
||||
name: 'Claude',
|
||||
key: 'd',
|
||||
url: 'https://claude.ai/chat/',
|
||||
icon: 'i-logos:claude-icon'
|
||||
},
|
||||
{
|
||||
name: 'Perplexity',
|
||||
key: 'f',
|
||||
url: 'https://www.perplexity.ai/search?q=',
|
||||
icon: 'i-logos:perplexity-icon'
|
||||
}
|
||||
]
|
||||
|
||||
const inputRef = ref<HTMLInputElement | null>(null)
|
||||
const query = ref(props.initialQuery ?? '')
|
||||
const isInputFocused = ref(false)
|
||||
const showShortcuts = ref(false)
|
||||
|
||||
function handleInputFocus() {
|
||||
isInputFocused.value = true
|
||||
props.onFocusChange(true)
|
||||
}
|
||||
|
||||
function handleInputBlur() {
|
||||
isInputFocused.value = false
|
||||
props.onFocusChange(false)
|
||||
}
|
||||
|
||||
function handleSubmit() {
|
||||
if (!query.value.trim()) return
|
||||
const google = platforms.find((p) => p.name === 'SearX') || platforms[0]
|
||||
if (google)
|
||||
window.open(google.url + encodeURIComponent(query.value.trim()), '_self')
|
||||
}
|
||||
|
||||
function handlePlatformClick(platform: PlatformType) {
|
||||
if (!query.value.trim()) return
|
||||
window.open(platform.url + encodeURIComponent(query.value.trim()), '_self')
|
||||
}
|
||||
|
||||
function platformClass() {
|
||||
const base =
|
||||
'widget-card group relative widget-button rounded-md bg-bg-elv p-2 border transition-transform'
|
||||
const disabled = !query.value.trim()
|
||||
const highlight = showShortcuts.value && isInputFocused.value
|
||||
return [
|
||||
base,
|
||||
disabled ? 'opacity-60 cursor-not-allowed' : 'cursor-pointer',
|
||||
highlight ? 'border-2 border-primary scale-105' : 'border-div'
|
||||
].join(' ')
|
||||
}
|
||||
|
||||
onMounted(() => {
|
||||
const handleKeyDown = (e: KeyboardEvent) => {
|
||||
const active = document.activeElement
|
||||
const isSearchFocused = inputRef.value === active
|
||||
|
||||
if (e.key === '/' && !isSearchFocused) {
|
||||
const typingInInput =
|
||||
active &&
|
||||
(active.tagName === 'INPUT' ||
|
||||
active.tagName === 'TEXTAREA' ||
|
||||
(active instanceof HTMLElement && active.isContentEditable))
|
||||
if (!typingInInput) {
|
||||
e.preventDefault()
|
||||
inputRef.value?.focus()
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
if (isInputFocused.value && e.altKey) {
|
||||
const key = e.key.toLowerCase()
|
||||
let platform = platforms.find((p) => p.key === key)
|
||||
|
||||
if (!platform && e.code.startsWith('Key') && e.code.length === 4) {
|
||||
const codeKey = e.code.slice(3).toLowerCase()
|
||||
platform = platforms.find((p) => p.key === codeKey)
|
||||
}
|
||||
|
||||
if (platform && query.value.trim()) {
|
||||
e.preventDefault()
|
||||
window.open(
|
||||
platform.url + encodeURIComponent(query.value.trim()),
|
||||
'_self'
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
if (e.altKey) showShortcuts.value = true
|
||||
}
|
||||
|
||||
const handleKeyUp = (e: KeyboardEvent) => {
|
||||
if (!e.altKey) showShortcuts.value = false
|
||||
}
|
||||
|
||||
window.addEventListener('keydown', handleKeyDown)
|
||||
window.addEventListener('keyup', handleKeyUp)
|
||||
|
||||
onUnmounted(() => {
|
||||
window.removeEventListener('keydown', handleKeyDown)
|
||||
window.removeEventListener('keyup', handleKeyUp)
|
||||
})
|
||||
})
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div class="flex flex-col items-start w-full space-y-4 antialiased">
|
||||
<Clock />
|
||||
|
||||
<form @submit.prevent="handleSubmit" class="relative w-full">
|
||||
<div class="relative">
|
||||
<i
|
||||
class="i-lucide-search absolute left-3 top-1/2 -translate-y-1/2 w-5 h-5 text-text-2"
|
||||
/>
|
||||
<input
|
||||
ref="inputRef"
|
||||
v-model="query"
|
||||
@focus="handleInputFocus"
|
||||
@blur="handleInputBlur"
|
||||
placeholder="What would you like to search for?"
|
||||
class="w-full pl-10 pr-3 py-3 text-lg rounded-md shadow-sm transition-colors bg-bg-elv text-text border-2 outline-none border-div hover:border-primary"
|
||||
/>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
<div class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-5 gap-4 w-full">
|
||||
<button
|
||||
v-for="platform in platforms"
|
||||
:key="platform.name"
|
||||
:disabled="!query.trim()"
|
||||
@click="handlePlatformClick(platform)"
|
||||
:class="platformClass()"
|
||||
:style="platform.color ? { borderColor: platform.color } : {}"
|
||||
>
|
||||
<div class="flex items-center gap-2">
|
||||
<i
|
||||
v-if="platform.icon"
|
||||
:class="`w-5 h-5 ${platform.icon}`"
|
||||
:style="platform.color ? { color: platform.color } : {}"
|
||||
/>
|
||||
<div class="text-left flex-grow">
|
||||
<h3 class="font-semibold truncate">{{ platform.name }}</h3>
|
||||
</div>
|
||||
<div
|
||||
class="hidden sm:flex items-center gap-1 text-xs ml-auto text-white"
|
||||
>
|
||||
<kbd
|
||||
class="bg-bg border border-div px-1 py-0.5 rounded text-sm font-semibold"
|
||||
>
|
||||
Alt
|
||||
</kbd>
|
||||
<span class="text-white font-semibold">+</span>
|
||||
<kbd
|
||||
class="bg-bg border border-div px-1 py-0.5 rounded text-sm font-semibold"
|
||||
>
|
||||
{{ platform.key.toUpperCase() }}
|
||||
</kbd>
|
||||
</div>
|
||||
</div>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
49
website/theme/components/startpage/Startpage.vue
Normal file
49
website/theme/components/startpage/Startpage.vue
Normal file
|
@ -0,0 +1,49 @@
|
|||
<script setup lang="ts">
|
||||
import Bookmarks from './Bookmarks.vue'
|
||||
import Searchbar from './SearchBar.vue'
|
||||
|
||||
const isFocused = ref(false)
|
||||
const handleFocusChange = (focused: boolean) => {
|
||||
isFocused.value = focused
|
||||
}
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div class="min-h-screen flex pt-48 justify-center p-4 transition-colors">
|
||||
<div class="w-full max-w-7xl space-y-8">
|
||||
<Searchbar @focus-change="handleFocusChange" />
|
||||
<Bookmarks :is-input-globally-focused="isFocused" />
|
||||
|
||||
<div class="hidden sm:block space-y-2 text-sm text-text-2">
|
||||
<p>
|
||||
Press
|
||||
<kbd class="kbd">/</kbd>
|
||||
anywhere to focus the search box
|
||||
</p>
|
||||
<p>
|
||||
Use
|
||||
<kbd class="kbd">Alt + a/s/d/f</kbd>
|
||||
to search different platforms
|
||||
</p>
|
||||
<p>
|
||||
Type bookmark chords (like
|
||||
<kbd class="kbd px-1.5 py-0.5">H</kbd>
|
||||
<kbd class="kbd px-1.5 py-0.5">N</kbd>
|
||||
for Hacker News) when search is not focused
|
||||
</p>
|
||||
<p>
|
||||
Press
|
||||
<kbd class="kbd">Enter</kbd>
|
||||
to search SearXNG (hosted by us) by default
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<style>
|
||||
kbd {
|
||||
--uno: px-1.5 py-0.5 rounded-sm font-sans font-semibold text-xs bg-bg-alt
|
||||
text-text-2 border-2 border-div nowrap;
|
||||
}
|
||||
</style>
|
42
website/theme/composables/nprogress.ts
Normal file
42
website/theme/composables/nprogress.ts
Normal file
|
@ -0,0 +1,42 @@
|
|||
import type { NProgress } from 'nprogress'
|
||||
import type { EnhanceAppContext } from 'vitepress'
|
||||
import nprogress from 'nprogress'
|
||||
|
||||
/**
|
||||
* Copyright (c) 2025 taskylizard. Apache License 2.0.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
export function loadProgress(
|
||||
router: EnhanceAppContext['router']
|
||||
): NProgress | undefined {
|
||||
if (typeof window === 'undefined') return
|
||||
|
||||
setTimeout(() => {
|
||||
nprogress.configure({ showSpinner: false })
|
||||
|
||||
const cacheBeforeRouteChange = router.onBeforeRouteChange
|
||||
const cacheAfterRouteChange = router.onAfterRouteChanged
|
||||
router.onBeforeRouteChange = (to) => {
|
||||
nprogress.start()
|
||||
cacheBeforeRouteChange?.(to)
|
||||
}
|
||||
router.onAfterRouteChanged = (to) => {
|
||||
nprogress.done()
|
||||
cacheAfterRouteChange?.(to)
|
||||
}
|
||||
})
|
||||
|
||||
return nprogress
|
||||
}
|
36
website/theme/index.ts
Normal file
36
website/theme/index.ts
Normal file
|
@ -0,0 +1,36 @@
|
|||
/**
|
||||
* Copyright (c) 2025 taskylizard. Apache License 2.0.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
import type { Theme } from 'vitepress'
|
||||
import Components from '@fmhy/components'
|
||||
import DefaultTheme from 'vitepress/theme'
|
||||
import Layout from './Layout.vue'
|
||||
import Post from './PostLayout.vue'
|
||||
|
||||
import './style.scss'
|
||||
import 'virtual:uno.css'
|
||||
|
||||
import Feedback from './components/Feedback.vue'
|
||||
|
||||
export default {
|
||||
extends: DefaultTheme,
|
||||
Layout,
|
||||
enhanceApp({ router, app }) {
|
||||
app.use(Components)
|
||||
app.component('Post', Post)
|
||||
app.component('Feedback', Feedback)
|
||||
}
|
||||
} satisfies Theme
|
47
website/theme/posts.data.ts
Normal file
47
website/theme/posts.data.ts
Normal file
|
@ -0,0 +1,47 @@
|
|||
/**
|
||||
* Copyright (c) 2025 taskylizard. Apache License 2.0.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
import type { ContentData } from 'vitepress'
|
||||
import { createContentLoader } from 'vitepress'
|
||||
import { groupBy } from '../utils'
|
||||
|
||||
interface Post {
|
||||
title: string
|
||||
url: string
|
||||
date: string
|
||||
}
|
||||
|
||||
type Dictionary = ReturnType<typeof createContentLoader>
|
||||
|
||||
declare const data: Dictionary
|
||||
export { data }
|
||||
|
||||
function transformRawPosts(rawPosts: ContentData[]): Record<string, Post[]> {
|
||||
const posts: Post[] = rawPosts
|
||||
.map(({ url, frontmatter }) => ({
|
||||
title: frontmatter.title,
|
||||
url,
|
||||
date: (frontmatter.date as Date).toISOString().slice(0, 10)
|
||||
}))
|
||||
.sort((a, b) => b.date.localeCompare(a.date))
|
||||
|
||||
return groupBy(posts, (post) => post.date.slice(0, 4))
|
||||
}
|
||||
|
||||
export default createContentLoader('posts/*.md', {
|
||||
includeSrc: true,
|
||||
transform: (raw) => transformRawPosts(raw)
|
||||
})
|
304
website/theme/style.scss
Normal file
304
website/theme/style.scss
Normal file
|
@ -0,0 +1,304 @@
|
|||
:root {
|
||||
--vp-c-bg: #fefbff;
|
||||
--vp-c-bg-alt: #f2f0f4;
|
||||
--vp-c-bg-elv: #f2f0f4;
|
||||
--vp-c-bg-soft: #f2f0f4;
|
||||
}
|
||||
|
||||
.dark {
|
||||
--vp-c-bg: #121316;
|
||||
--vp-c-bg-alt: #0d0e11;
|
||||
--vp-c-bg-elv: #1b1b1f;
|
||||
--vp-c-bg-soft: #1b1b1f;
|
||||
}
|
||||
|
||||
:root {
|
||||
--vp-c-border: #c2c2c4;
|
||||
--vp-c-divider: #c4c6d0;
|
||||
--vp-c-gutter: #e2e2e3;
|
||||
}
|
||||
|
||||
.dark {
|
||||
--vp-c-border: #77777a;
|
||||
--vp-c-divider: #222429;
|
||||
--vp-c-gutter: #000000;
|
||||
}
|
||||
|
||||
:root {
|
||||
--vp-c-text-1: #1b1b1f;
|
||||
--vp-c-text-2: #2f3033;
|
||||
--vp-c-text-3: #46464a;
|
||||
}
|
||||
|
||||
.dark {
|
||||
--vp-c-text-1: #e3e2e6;
|
||||
--vp-c-text-2: #ababaf;
|
||||
--vp-c-text-3: #919094;
|
||||
}
|
||||
|
||||
:root {
|
||||
/* Colors: Brand */
|
||||
--vp-c-brand-1: theme('colors.swarm.500');
|
||||
--vp-c-brand-2: theme('colors.swarm.600');
|
||||
--vp-c-brand-3: theme('colors.swarm.800');
|
||||
--vp-c-brand-soft: theme('colors.swarm.400');
|
||||
|
||||
/* Colors: Button */
|
||||
--vp-button-brand-bg: var(--vp-c-brand-1);
|
||||
--vp-button-brand-border: var(--vp-c-brand-soft);
|
||||
--vp-button-brand-text: rgba(42, 40, 47);
|
||||
--vp-button-brand-hover-border: var(--vp-c-brand-soft);
|
||||
--vp-button-brand-hover-text: rgba(42, 40, 47);
|
||||
--vp-button-brand-hover-bg: var(--vp-c-brand-soft);
|
||||
--vp-button-brand-active-border: var(--vp-c-brand-soft);
|
||||
--vp-button-brand-active-text: rgba(42, 40, 47);
|
||||
--vp-button-brand-active-bg: var(--vp-button-brand-bg);
|
||||
--vp-button-alt-bg: #484848;
|
||||
--vp-button-alt-text: #f0eeee;
|
||||
--vp-button-alt-hover-bg: #484848;
|
||||
--vp-button-alt-hover-text: #f0eeee;
|
||||
|
||||
/* Colors: Custom Block */
|
||||
/** Info */
|
||||
--vp-custom-block-info-bg: theme('colors.swarm.100');
|
||||
--vp-custom-block-info-border: theme('colors.swarm.800');
|
||||
--vp-custom-block-info-text: theme('colors.swarm.800');
|
||||
--vp-custom-block-info-text-deep: theme('colors.swarm.900');
|
||||
/** Tip */
|
||||
--vp-custom-block-tip-bg: theme('colors.meadow.100');
|
||||
--vp-custom-block-tip-border: theme('colors.meadow.800');
|
||||
--vp-custom-block-tip-text: theme('colors.meadow.800');
|
||||
--vp-custom-block-tip-text-deep: theme('colors.meadow.900');
|
||||
/** Warning */
|
||||
--vp-custom-block-warning-bg: theme('colors.merlin.100');
|
||||
--vp-custom-block-warning-border: theme('colors.merlin.800');
|
||||
--vp-custom-block-warning-text: theme('colors.merlin.800');
|
||||
--vp-custom-block-warning-text-deep: theme('colors.merlin.900');
|
||||
/** Danger */
|
||||
--vp-custom-block-danger-bg: theme('colors.carnation.100');
|
||||
--vp-custom-block-danger-border: theme('colors.carnation.800');
|
||||
--vp-custom-block-danger-text: theme('colors.carnation.800');
|
||||
--vp-custom-block-danger-text-deep: theme('colors.carnation.900');
|
||||
}
|
||||
|
||||
.dark {
|
||||
/* Colors: Brand */
|
||||
--vp-c-brand-1: theme('colors.swarm.400');
|
||||
--vp-c-brand-2: theme('colors.swarm.500');
|
||||
--vp-c-brand-3: theme('colors.swarm.700');
|
||||
--vp-c-brand-soft: theme('colors.swarm.300');
|
||||
|
||||
/* Colors: Custom Block */
|
||||
/** Info */
|
||||
--vp-custom-block-info-bg: theme('colors.swarm.950');
|
||||
--vp-custom-block-info-border: theme('colors.swarm.800');
|
||||
--vp-custom-block-info-text: theme('colors.swarm.200');
|
||||
--vp-custom-block-info-text-deep: theme('colors.swarm.200');
|
||||
/** Tip */
|
||||
--vp-custom-block-tip-bg: theme('colors.meadow.950');
|
||||
--vp-custom-block-tip-border: theme('colors.meadow.800');
|
||||
--vp-custom-block-tip-text: theme('colors.meadow.200');
|
||||
--vp-custom-block-tip-text-deep: theme('colors.meadow.200');
|
||||
/** Warning */
|
||||
--vp-custom-block-warning-bg: theme('colors.merlin.950');
|
||||
--vp-custom-block-warning-border: theme('colors.merlin.800');
|
||||
--vp-custom-block-warning-text: theme('colors.merlin.200');
|
||||
--vp-custom-block-warning-text-deep: theme('colors.merlin.200');
|
||||
/** Danger */
|
||||
--vp-custom-block-danger-bg: theme('colors.carnation.950');
|
||||
--vp-custom-block-danger-border: theme('colors.carnation.800');
|
||||
--vp-custom-block-danger-text: theme('colors.carnation.200');
|
||||
--vp-custom-block-danger-text-deep: theme('colors.carnation.200');
|
||||
}
|
||||
|
||||
.vp-doc a {
|
||||
color: var(--vp-c-brand-1);
|
||||
text-decoration: underline;
|
||||
text-underline-offset: 4px;
|
||||
text-decoration-style: solid;
|
||||
text-decoration-color: transparent;
|
||||
-webkit-text-decoration-color: transparent;
|
||||
transition: text-decoration-color 0.25s;
|
||||
|
||||
&:hover {
|
||||
color: var(--vp-c-brand-1);
|
||||
text-decoration-color: var(--vp-c-brand-1);
|
||||
-webkit-text-decoration-color: var(--vp-c-brand-1);
|
||||
}
|
||||
}
|
||||
|
||||
.vp-doc .custom-block a {
|
||||
text-decoration: underline;
|
||||
text-underline-offset: 4px;
|
||||
text-decoration-style: solid;
|
||||
}
|
||||
|
||||
|
||||
::selection {
|
||||
background-color: var(--vp-c-brand-400, #5586a6);
|
||||
|
||||
.dark & {
|
||||
background-color: var(--vp-c-brand-800, #0f2c47);
|
||||
}
|
||||
}
|
||||
|
||||
.VPFooter a {
|
||||
text-decoration-line: underline;
|
||||
text-decoration-style: dashed;
|
||||
text-underline-offset: 5px;
|
||||
transition: 0.3s;
|
||||
|
||||
&:hover {
|
||||
color: var(--vp-c-text-1);
|
||||
text-decoration-line: underline;
|
||||
text-decoration-style: dashed;
|
||||
text-underline-offset: 5px;
|
||||
}
|
||||
}
|
||||
|
||||
/* Custom scrollbar */
|
||||
.VPSidebar::-webkit-scrollbar {
|
||||
block-size: 4px;
|
||||
border-end-end-radius: 14px;
|
||||
border-start-end-radius: 14px;
|
||||
inline-size: 4px;
|
||||
}
|
||||
|
||||
/**
|
||||
* Component: Home
|
||||
*/
|
||||
:root {
|
||||
--vp-home-hero-name-color: transparent;
|
||||
--vp-home-hero-name-background: -webkit-linear-gradient(
|
||||
120deg,
|
||||
#c4b5fd 30%,
|
||||
#7bc5e4
|
||||
);
|
||||
|
||||
--vp-home-hero-image-background-image: linear-gradient(
|
||||
-45deg,
|
||||
#c4b5fd 50%,
|
||||
#47caff 50%
|
||||
);
|
||||
--vp-home-hero-image-filter: blur(44px);
|
||||
}
|
||||
|
||||
@media (min-width: 640px) {
|
||||
:root {
|
||||
--vp-home-hero-image-filter: blur(56px);
|
||||
}
|
||||
}
|
||||
|
||||
@media (min-width: 960px) {
|
||||
:root {
|
||||
--vp-home-hero-image-filter: blur(68px);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#VPContent strong > a {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.info.custom-block a {
|
||||
color: var(--vp-custom-block-info-text);
|
||||
font-weight: 500;
|
||||
text-decoration: underline;
|
||||
text-underline-offset: 2px;
|
||||
transition: opacity 0.25s;
|
||||
}
|
||||
|
||||
.info.custom-block a:hover {
|
||||
opacity: 0.7;
|
||||
color: var(--vp-custom-block-info-text-deep);
|
||||
}
|
||||
|
||||
.note.custom-block a {
|
||||
color: var(--vp-custom-block-info-text);
|
||||
font-weight: 500;
|
||||
text-decoration: underline;
|
||||
text-underline-offset: 2px;
|
||||
transition: opacity 0.25s;
|
||||
}
|
||||
|
||||
.note.custom-block a:hover {
|
||||
opacity: 0.7;
|
||||
color: var(--vp-custom-block-note-text-deep);
|
||||
}
|
||||
|
||||
.tip.custom-block a {
|
||||
color: var(--vp-custom-block-tip-text);
|
||||
font-weight: 500;
|
||||
text-decoration: underline;
|
||||
text-underline-offset: 2px;
|
||||
transition: opacity 0.25s;
|
||||
}
|
||||
|
||||
.tip.custom-block a:hover {
|
||||
opacity: 0.7;
|
||||
color: var(--vp-custom-block-tip-text-deep);
|
||||
}
|
||||
|
||||
.warning.custom-block a {
|
||||
color: var(--vp-custom-block-warning-text);
|
||||
font-weight: 500;
|
||||
text-decoration: underline;
|
||||
text-underline-offset: 2px;
|
||||
transition: opacity 0.25s;
|
||||
}
|
||||
|
||||
.warning.custom-block a:hover {
|
||||
opacity: 0.7;
|
||||
color: var(--vp-custom-block-warning-text-deep);
|
||||
}
|
||||
|
||||
.danger.custom-block a {
|
||||
color: var(--vp-custom-block-danger-text);
|
||||
font-weight: 500;
|
||||
text-decoration: underline;
|
||||
text-underline-offset: 2px;
|
||||
transition: opacity 0.25s;
|
||||
}
|
||||
|
||||
.danger.custom-block a:hover {
|
||||
opacity: 0.7;
|
||||
color: var(--vp-custom-block-danger-text-deep);
|
||||
}
|
||||
|
||||
.info.custom-block {
|
||||
--icon: url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIGNsYXNzPSJsdWNpZGUgbHVjaWRlLWluZm8iPjxjaXJjbGUgY3g9IjEyIiBjeT0iMTIiIHI9IjEwIi8+PHBhdGggZD0iTTEyIDE2di00Ii8+PHBhdGggZD0iTTEyIDhoLjAxIi8+PC9zdmc+');
|
||||
}
|
||||
|
||||
.note.custom-block {
|
||||
--icon: url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIGNsYXNzPSJsdWNpZGUgbHVjaWRlLWluZm8iPjxjaXJjbGUgY3g9IjEyIiBjeT0iMTIiIHI9IjEwIi8+PHBhdGggZD0iTTEyIDE2di00Ii8+PHBhdGggZD0iTTEyIDhoLjAxIi8+PC9zdmc+');
|
||||
}
|
||||
|
||||
.tip.custom-block {
|
||||
--icon: url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIGNsYXNzPSJsdWNpZGUgbHVjaWRlLWxpZ2h0YnVsYiI+PHBhdGggZD0iTTE1IDE0Yy4yLTEgLjctMS43IDEuNS0yLjUgMS0uOSAxLjUtMi4yIDEuNS0zLjVBNiA2IDAgMCAwIDYgOGMwIDEgLjIgMi4yIDEuNSAzLjUuNy43IDEuMyAxLjUgMS41IDIuNSIvPjxwYXRoIGQ9Ik05IDE4aDYiLz48cGF0aCBkPSJNMTAgMjJoNCIvPjwvc3ZnPg==');
|
||||
}
|
||||
|
||||
.warning.custom-block {
|
||||
--icon: url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIGNsYXNzPSJsdWNpZGUgbHVjaWRlLWFsZXJ0LXRyaWFuZ2xlIj48cGF0aCBkPSJtMjEuNzMgMTgtOC0xNGEyIDIgMCAwIDAtMy40OCAwbC04IDE0QTIgMiAwIDAgMCA0IDIxaDE2YTIgMiAwIDAgMCAxLjczLTNaIi8+PHBhdGggZD0iTTEyIDl2NCIvPjxwYXRoIGQ9Ik0xMiAxN2guMDEiLz48L3N2Zz4=');
|
||||
}
|
||||
|
||||
.danger.custom-block {
|
||||
--icon: url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIGNsYXNzPSJsdWNpZGUgbHVjaWRlLXNrdWxsIj48Y2lyY2xlIGN4PSI5IiBjeT0iMTIiIHI9IjEiLz48Y2lyY2xlIGN4PSIxNSIgY3k9IjEyIiByPSIxIi8+PHBhdGggZD0iTTggMjB2Mmg4di0yIi8+PHBhdGggZD0ibTEyLjUgMTctLjUtMS0uNSAxaDF6Ii8+PHBhdGggZD0iTTE2IDIwYTIgMiAwIDAgMCAxLjU2LTMuMjUgOCA4IDAgMSAwLTExLjEyIDBBMiAyIDAgMCAwIDggMjAiLz48L3N2Zz4=');
|
||||
}
|
||||
|
||||
.custom-block-title {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
gap: 8px;
|
||||
}
|
||||
|
||||
.custom-block-title::before {
|
||||
content: '';
|
||||
width: 16px;
|
||||
height: 16px;
|
||||
-webkit-mask: var(--icon) no-repeat;
|
||||
mask: var(--icon) no-repeat;
|
||||
-webkit-mask-size: 100% 100%;
|
||||
mask-size: 100% 100%;
|
||||
background-color: currentColor;
|
||||
color: inherit;
|
||||
}
|
349
website/transformer.ts
Normal file
349
website/transformer.ts
Normal file
|
@ -0,0 +1,349 @@
|
|||
/**
|
||||
* Copyright (c) 2025 taskylizard. Apache License 2.0.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
import type { Plugin } from 'vitepress'
|
||||
import { basename } from 'pathe'
|
||||
import { excluded, getHeader } from './transformer/constants'
|
||||
import { replaceUnderscore, transformer } from './transformer/core'
|
||||
|
||||
export function transformsPlugin(meta: { build: { api: boolean } }): Plugin {
|
||||
return {
|
||||
name: 'custom:transform-content',
|
||||
enforce: 'pre',
|
||||
transform(code, id) {
|
||||
const _id = basename(id)
|
||||
|
||||
if (
|
||||
id.endsWith('.md') &&
|
||||
!excluded.includes(_id) &&
|
||||
// check if it's a post
|
||||
!id.includes('posts') &&
|
||||
!id.includes('other')
|
||||
) {
|
||||
const header = getHeader(meta, _id)
|
||||
const contents = transform(code)
|
||||
|
||||
if (_id === 'beginners-guide.md') {
|
||||
const _contents = transformGuide(contents)
|
||||
return header + _contents
|
||||
}
|
||||
if (_id === 'storage.md') return header + contents
|
||||
|
||||
return header + transformLinks(contents)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export const transformGuide = (text: string): string =>
|
||||
transformer(text)
|
||||
.transform('Beginners Guide', [
|
||||
{
|
||||
name: 'TOC',
|
||||
find: /\[TOC\]\n/gm,
|
||||
replace: ''
|
||||
},
|
||||
{
|
||||
name: 'TOC2',
|
||||
find: /\*\*Table of Contents\*\*\n\[TOC2\]\n/gm,
|
||||
replace: ''
|
||||
},
|
||||
{
|
||||
name: 'Beginners Guide',
|
||||
find: /# -> \*\*\*Beginners Guide to Piracy\*\*\* <-\n/gm,
|
||||
replace: ''
|
||||
},
|
||||
{
|
||||
name: 'Note',
|
||||
find: /!!!note\s(.+?)\n/gm,
|
||||
replace: '\n:::info\n$1\n:::\n'
|
||||
},
|
||||
{
|
||||
name: 'Info',
|
||||
find: /!!!info\s(.+?)\n/gm,
|
||||
replace: '\n:::info\n$1\n:::\n'
|
||||
},
|
||||
{
|
||||
name: 'Warning',
|
||||
find: /!!!warning\s(.+?)\n/gm,
|
||||
replace: ':::warning\n$1\n:::\n'
|
||||
},
|
||||
{
|
||||
name: 'Quote',
|
||||
find: />\s(.+?)\n/gm,
|
||||
replace: '> $1\n\n'
|
||||
},
|
||||
{
|
||||
name: 'Back to Top',
|
||||
find: /\*\*\[\^ Back to Top\]\(#beginners-guide-to-piracy\)\*\*/gm,
|
||||
replace: ''
|
||||
},
|
||||
{
|
||||
name: 'Back to Top',
|
||||
find: /\*\*\[\^ Back to Top\]\(#beginners-guide-to-piracy\)\*\*/gm,
|
||||
replace: ''
|
||||
}
|
||||
])
|
||||
.getText()
|
||||
|
||||
export function transform(text: string): string {
|
||||
let _text = text
|
||||
// Transform reddit index links
|
||||
.replace(
|
||||
/\*\*\[◄◄ Back to Wiki Index\]\(https:\/\/www\.reddit\.com\/r\/FREEMEDIAHECKYEAH\/wiki\/index\)\*\*\n/gm,
|
||||
''
|
||||
)
|
||||
.replace(
|
||||
/\*\*\[◄◄ Back to Wiki Index\]\(https:\/\/www\.reddit\.com\/r\/FREEMEDIAHECKYEAH\/wiki\/tools-index\)\*\*\n/gm,
|
||||
''
|
||||
)
|
||||
.replace(
|
||||
/\*\*\[Table of Contents\]\(https?:\/\/.*?ibb\.co.*\)\*\* - For mobile users\n/gm,
|
||||
''
|
||||
)
|
||||
// Remove extra lines
|
||||
.replace(/\*\*\*\n\*\*\*\n\*\*\*\n\*\*\*\n\n\n\*\*\*\n\*\*\*\n\n/gm, '')
|
||||
.replace(/\*\*\*\n\*\*\*\n\*\*\*\n\*\*\*\n\n\n\*\*\*\n\*\*\* \n\n/gm, '')
|
||||
.replace(/\*\*\*\n\*\*\*\n\*\*\*\n\n\n\*\*\*\n\*\*\*\n\n/gm, '')
|
||||
.replace(/\*\*\*\n\*\*\*\n\*\*\*\n\*\*\*\n\n\n\*\*\*\n\n/gm, '')
|
||||
.replace(/\*\*\*\n\*\*\*\n\n\n\*\*\*\n\n/gm, '')
|
||||
// Transform reddit links
|
||||
.replace(/https:\/\/www.reddit.com\/r\/FREEMEDIAHECKYEAH\/wiki\/ai/g, '/ai')
|
||||
.replace(
|
||||
/https:\/\/www.reddit.com\/r\/FREEMEDIAHECKYEAH\/wiki\/adblock-vpn-privacy/g,
|
||||
'/adblockvpnguide'
|
||||
)
|
||||
.replace(
|
||||
/https:\/\/www.reddit.com\/r\/FREEMEDIAHECKYEAH\/wiki\/android/g,
|
||||
'/android-iosguide'
|
||||
)
|
||||
.replace(
|
||||
/https:\/\/www.reddit.com\/r\/FREEMEDIAHECKYEAH\/wiki\/games/g,
|
||||
'/gamingpiracyguide'
|
||||
)
|
||||
.replace(
|
||||
/https:\/\/www.reddit.com\/r\/FREEMEDIAHECKYEAH\/wiki\/reading/g,
|
||||
'/readingpiracyguide'
|
||||
)
|
||||
.replace(
|
||||
/https:\/\/www.reddit.com\/r\/FREEMEDIAHECKYEAH\/wiki\/download/g,
|
||||
'/downloadpiracyguide'
|
||||
)
|
||||
.replace(
|
||||
/https:\/\/www.reddit.com\/r\/FREEMEDIAHECKYEAH\/wiki\/torrent/g,
|
||||
'/torrentpiracyguide'
|
||||
)
|
||||
.replace(
|
||||
/https:\/\/www.reddit.com\/r\/FREEMEDIAHECKYEAH\/wiki\/edu/g,
|
||||
'/edupiracyguide'
|
||||
)
|
||||
.replace(
|
||||
/https:\/\/www.reddit.com\/r\/FREEMEDIAHECKYEAH\/wiki\/system-tools/g,
|
||||
'/system-tools'
|
||||
)
|
||||
.replace(
|
||||
/https:\/\/www.reddit.com\/r\/FREEMEDIAHECKYEAH\/wiki\/file-tools/g,
|
||||
'/file-tools'
|
||||
)
|
||||
.replace(
|
||||
/https:\/\/www.reddit.com\/r\/FREEMEDIAHECKYEAH\/wiki\/internet-tools/g,
|
||||
'/internet-tools'
|
||||
)
|
||||
.replace(
|
||||
/https:\/\/www.reddit.com\/r\/FREEMEDIAHECKYEAH\/wiki\/social-media/g,
|
||||
'/social-media-tools'
|
||||
)
|
||||
.replace(
|
||||
/https:\/\/www.reddit.com\/r\/FREEMEDIAHECKYEAH\/wiki\/text-tools/g,
|
||||
'/text-tools'
|
||||
)
|
||||
.replace(
|
||||
/https:\/\/www.reddit.com\/r\/FREEMEDIAHECKYEAH\/wiki\/video-tools/g,
|
||||
'/video-tools'
|
||||
)
|
||||
.replace(
|
||||
/https:\/\/www.reddit.com\/r\/FREEMEDIAHECKYEAH\/wiki\/audio-tools/g,
|
||||
'/audio-tools'
|
||||
)
|
||||
.replace(
|
||||
/https:\/\/www.reddit.com\/r\/FREEMEDIAHECKYEAH\/wiki\/game-tools/g,
|
||||
'/gaming-tools'
|
||||
)
|
||||
.replace(
|
||||
/https:\/\/www.reddit.com\/r\/FREEMEDIAHECKYEAH\/wiki\/video/g,
|
||||
'/videopiracyguide'
|
||||
)
|
||||
.replace(
|
||||
/https:\/\/www.reddit.com\/r\/FREEMEDIAHECKYEAH\/wiki\/audio/g,
|
||||
'/audiopiracyguide'
|
||||
)
|
||||
.replace(
|
||||
/https:\/\/www.reddit.com\/r\/FREEMEDIAHECKYEAH\/wiki\/linux/g,
|
||||
'/linuxguide'
|
||||
)
|
||||
.replace(
|
||||
/https:\/\/www.reddit.com\/r\/FREEMEDIAHECKYEAH\/wiki\/non-eng/g,
|
||||
'/non-english'
|
||||
)
|
||||
.replace(
|
||||
/https:\/\/www.reddit.com\/r\/FREEMEDIAHECKYEAH\/wiki\/misc/g,
|
||||
'/miscguide'
|
||||
)
|
||||
.replace(
|
||||
/https:\/\/www.reddit.com\/r\/FREEMEDIAHECKYEAH\/wiki\/storage/g,
|
||||
'/storage'
|
||||
)
|
||||
.replace(
|
||||
/https:\/\/www.reddit.com\/r\/FREEMEDIAHECKYEAH\/wiki\/dev-tools/g,
|
||||
'/devtools'
|
||||
)
|
||||
.replace(
|
||||
/https:\/\/www.reddit.com\/r\/FREEMEDIAHECKYEAH\/wiki\/img-tools/g,
|
||||
'/img-tools'
|
||||
)
|
||||
// Remove extra characters
|
||||
.replace(/\/#wiki_/g, '/#')
|
||||
.replace(/#wiki_/g, '/#')
|
||||
.replace(/.25BA_/g, '')
|
||||
.replace(/.25B7_/g, '')
|
||||
.replace(/_.2F_/g, '-')
|
||||
|
||||
_text = replaceUnderscore(_text)
|
||||
.replace(/\/#(\d)/g, '/#_$1') // Prefix headings starting with numbers
|
||||
.replace(/#(\d)/g, '#_$1') // Prefix headings starting with numbers
|
||||
.replace(/(\]\(\s*)\/\s*(\#[^)\s]*?\s*\))/g, '$1$2')
|
||||
.replace(/\*\*\*\n\n/gm, '')
|
||||
.replace(/\*\*\*\n/gm, '')
|
||||
.replace(/# ►/g, '##')
|
||||
.replace(/## ▷/g, '###')
|
||||
.replace(/####/g, '###')
|
||||
// Replace emojis
|
||||
.replace(/🌟/g, ':glowing-star:')
|
||||
.replace(/⭐/g, ':star:')
|
||||
.replace(/🌐/g, ':globe-with-meridians:')
|
||||
.replace(/↪/g, ':repeat-button:')
|
||||
// Replace note/warning/tip
|
||||
.replace(/^\*\*Note\*\* - (.+)$/gm, ':::tip\n$1\n:::')
|
||||
.replace(/^\* \*\*Note\*\* - (.+)$/gm, ':::tip\n$1\n:::')
|
||||
.replace(/^Note - (.+)$/gm, ':::tip\n$1\n:::')
|
||||
.replace(/^\*\*Warning\*\* - (.+)$/gm, ':::warning\n$1\n:::')
|
||||
.replace(/^\* \*\*Warning\*\* - (.+)$/gm, ':::warning\n$1\n:::')
|
||||
.replace(/^\*\s([^*])/gm, '- $1')
|
||||
// Replace links
|
||||
.replace(
|
||||
/\/storage\/#encode--decode_urls/g,
|
||||
'/storage/#encode--decode-urls'
|
||||
)
|
||||
.replace(/\/devtools\/#machine-learning2/g, '/devtools/#machine-learning-1')
|
||||
.replace(/\/linuxguide#software-sites2/g, '/linuxguide#software-sites-1')
|
||||
.replace(/\/linuxguide#software_sites/g, '/linuxguide#software-sites')
|
||||
.replace(/\/non-english#reading10/g, '/non-english#reading-9')
|
||||
.replace(
|
||||
/\/storage#satellite-.26amp.3B_street_view_maps/g,
|
||||
'/storage#satellite-street-view-maps'
|
||||
)
|
||||
.replace(
|
||||
/(.+?) site or extension\.\n/gm,
|
||||
'Click on the texts to copy them decoded.\n'
|
||||
)
|
||||
|
||||
return _text
|
||||
}
|
||||
|
||||
const transformLinks = (text: string): string =>
|
||||
transformer(text)
|
||||
.transform('Links to Icons', [
|
||||
{
|
||||
name: 'Discord',
|
||||
find: /\[Discord\]\(([^\)]*?)\)/gm,
|
||||
replace:
|
||||
'<a target="_blank" href="$1"><div alt="Discord" class="i-carbon:logo-discord" /></a>'
|
||||
},
|
||||
{
|
||||
name: 'GitHub',
|
||||
find: /\[GitHub\]\(([^\)]*?)\)/gm,
|
||||
replace:
|
||||
'<a target="_blank" href="$1"><div alt="GitHub" class="i-carbon:logo-github" /></a>'
|
||||
},
|
||||
{
|
||||
name: 'GitLab',
|
||||
find: /\[GitLab\]\(([^\)]*?)\)/gm,
|
||||
replace:
|
||||
'<a target="_blank" href="$1"><div alt="GitLab" class="i-carbon:logo-gitlab" /></a>'
|
||||
},
|
||||
{
|
||||
name: 'Source Code',
|
||||
find: /\[Source Code\]\(([^\)]*?)\)/gm,
|
||||
replace:
|
||||
'<a target="_blank" href="$1"><div alt="Source Code" class="i-gravity-ui:code" /></a>'
|
||||
},
|
||||
{
|
||||
name: 'Telegram',
|
||||
find: /\[Telegram\]\(([^\)]*?)\)/gm,
|
||||
replace:
|
||||
'<a target="_blank" href="$1"><div alt="Telegram" class="i-mdi:telegram" /></a>'
|
||||
},
|
||||
{
|
||||
name: 'Subreddit',
|
||||
find: /\[Subreddit\]\(([^\)]*?)\)/gm,
|
||||
replace:
|
||||
'<a target="_blank" href="$1"><div alt="Reddit" class="i-mdi:reddit" /></a>'
|
||||
},
|
||||
{
|
||||
name: 'X',
|
||||
find: /\[X\]\(([^\)]*?)\)/gm,
|
||||
replace:
|
||||
'<a target="_blank" href="$1"><div alt="X" class="i-carbon:logo-x" /></a>'
|
||||
},
|
||||
{
|
||||
name: 'Tor',
|
||||
find: /\[.onion\]\(([^\)]*?)\)/gm,
|
||||
replace:
|
||||
'<a target="_blank" href="$1"><div alt=".onion" class="i-simple-icons:torbrowser w-1em h-1em" /></a>'
|
||||
},
|
||||
// Platform indicators
|
||||
{
|
||||
name: 'Windows',
|
||||
find: /(?<=\/ (\/>|[^/\r\n])*)(,\s)?(?<![a-z]\s)Windows(?=,|[ \t]\/|$)/gm,
|
||||
replace: ' <div alt="Windows" class="i-qlementine-icons:windows-24" /> '
|
||||
},
|
||||
{
|
||||
name: 'Mac',
|
||||
find: /(?<=\/ (\/>|[^/\r\n])*)(,\s)?(?<![a-z]\s)Mac(?=,|[ \t]\/|$)/gm,
|
||||
replace: ' <div alt="Mac" class="i-qlementine-icons:mac-fill-16" /> '
|
||||
},
|
||||
{
|
||||
name: 'Linux',
|
||||
find: /(?<=\/ (\/>|[^/\r\n])*)(,\s)?(?<![a-z]\s)Linux(?=,|[ \t]\/|$)/gm,
|
||||
replace: ' <div alt="Linux" class="i-fluent-mdl2:linux-logo-32" /> '
|
||||
},
|
||||
{
|
||||
name: 'Android',
|
||||
find: /(?<=\/ (\/>|[^/\r\n])*)(,\s)?(?<![a-z]\s)Android(?=,|[ \t]\/|$)/gm,
|
||||
replace: ' <div alt="Android" class="i-material-symbols:android" /> '
|
||||
},
|
||||
{
|
||||
name: 'iOS',
|
||||
find: /(?<=\/ (\/>|[^/\r\n])*)(,\s)?(?<![a-z]\s)iOS(?=,|[ \t]\/|$)/gm,
|
||||
replace: ' <div alt="iOS" class="i-simple-icons:ios" /> '
|
||||
},
|
||||
{
|
||||
name: 'Web',
|
||||
find: /(?<=\/ (\/>|[^/\r\n])*)(,\s)?(?<![a-z]\s)Web(?=,|[ \t]\/|$)/gm,
|
||||
replace: ' <div alt="Web" class="i-fluent:globe-32-filled" /> '
|
||||
}
|
||||
])
|
||||
.getText()
|
160
website/transformer/constants.ts
Normal file
160
website/transformer/constants.ts
Normal file
|
@ -0,0 +1,160 @@
|
|||
/**
|
||||
* Copyright (c) 2025 taskylizard. Apache License 2.0.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
interface Header {
|
||||
[file: string]: { title: string; description: string }
|
||||
}
|
||||
|
||||
export const headers: Header = {
|
||||
'adblockvpnguide.md': {
|
||||
title: 'Adblocking / Privacy',
|
||||
description: 'Adblocking, Privacy, VPNs, Proxies, Antiviruses'
|
||||
},
|
||||
'ai.md': {
|
||||
title: 'Artificial Intelligence',
|
||||
description: 'Chatbots, Text Generators, Image Generators, ChatGPT Tools'
|
||||
},
|
||||
'android-iosguide.md': {
|
||||
title: 'Android / iOS',
|
||||
description: 'Apps, Jailbreaking, Android Emulators'
|
||||
},
|
||||
'audiopiracyguide.md': {
|
||||
title: 'Music / Podcasts / Radio',
|
||||
description: 'Stream Audio, Download Audio, Torrent Audio'
|
||||
},
|
||||
'beginners-guide.md': {
|
||||
title: 'Beginners Guide',
|
||||
description: 'A Guide for Beginners to Piracy'
|
||||
},
|
||||
'downloadpiracyguide.md': {
|
||||
title: 'Downloading',
|
||||
description: 'Download Sites, Software Sites, Open Directories'
|
||||
},
|
||||
'edupiracyguide.md': {
|
||||
title: 'Educational',
|
||||
description: 'Courses, Documentaries, Learning Resources'
|
||||
},
|
||||
'gamingpiracyguide.md': {
|
||||
title: 'Gaming / Emulation',
|
||||
description: 'Download Games, ROMs, Gaming Tools'
|
||||
},
|
||||
'linuxguide.md': {
|
||||
title: 'Linux / macOS',
|
||||
description: 'Apps, Software Sites, Gaming'
|
||||
},
|
||||
'miscguide.md': {
|
||||
title: 'Miscellaneous',
|
||||
description: 'Extensions, Indexes, News, Health, Food, Fun'
|
||||
},
|
||||
'nsfwpiracy.md': {
|
||||
title: 'NSFW',
|
||||
description: 'NSFW Indexes, Streaming, Downloading'
|
||||
},
|
||||
'non-english.md': {
|
||||
title: 'Non-English',
|
||||
description: 'International Piracy Sites'
|
||||
},
|
||||
'readingpiracyguide.md': {
|
||||
title: 'Books / Comics / Manga',
|
||||
description: 'Books, Comics, Magazines, Newspapers'
|
||||
},
|
||||
'gaming-tools.md': {
|
||||
title: 'Gaming Tools',
|
||||
description: 'Gaming Optimization, Game Launchers, Multiplayer'
|
||||
},
|
||||
'devtools.md': {
|
||||
title: 'Developer Tools',
|
||||
description: 'Git, Hosting, App Dev, Software Dev'
|
||||
},
|
||||
'img-tools.md': {
|
||||
title: 'Image Tools',
|
||||
description: 'Image Editors, Generators, Compress'
|
||||
},
|
||||
'audio-tools.md': {
|
||||
title: 'Audio Tools',
|
||||
description: 'Audio Players, Audio Editors, Audio Downloaders'
|
||||
},
|
||||
'system-tools.md': {
|
||||
title: 'System Tools',
|
||||
description: 'System Tools, Hardware Tools, Windows ISOs, Customization'
|
||||
},
|
||||
'file-tools.md': {
|
||||
title: 'File Tools',
|
||||
description: 'Download Managers, File Hosting, File Archivers'
|
||||
},
|
||||
'video-tools.md': {
|
||||
title: 'Video Tools',
|
||||
description: 'Video Players, Video Editors, Live Streaming, Animation'
|
||||
},
|
||||
'text-tools.md': {
|
||||
title: 'Text Tools',
|
||||
description: 'Text Editors, Pastebins, Fonts, Translators'
|
||||
},
|
||||
'internet-tools.md': {
|
||||
title: 'Internet Tools',
|
||||
description: 'Browsers, Extensions, Search Engines'
|
||||
},
|
||||
'social-media-tools.md': {
|
||||
title: 'Social Media Tools',
|
||||
description: 'Discord Tools, Reddit Tools, YouTube Tools'
|
||||
},
|
||||
'storage.md': {
|
||||
title: 'Storage',
|
||||
description: 'Sections too big to fit on main pages'
|
||||
},
|
||||
'torrentpiracyguide.md': {
|
||||
title: 'Torrenting',
|
||||
description: 'Torrent Clients, Torrent Sites, Trackers'
|
||||
},
|
||||
'videopiracyguide.md': {
|
||||
title: 'Movies / TV / Anime',
|
||||
description: 'Stream Videos, Download Videos, Torrent Videos'
|
||||
},
|
||||
'base64.md': {
|
||||
title: 'Base64',
|
||||
description: 'Base64 storage'
|
||||
},
|
||||
'unsafesites.md': {
|
||||
title: 'Unsafe Sites',
|
||||
description: 'Unsafe/harmful sites to avoid.'
|
||||
}
|
||||
} as const
|
||||
|
||||
export const excluded = [
|
||||
'readme.md',
|
||||
'single-page',
|
||||
'feedback.md',
|
||||
'index.md',
|
||||
'sandbox.md',
|
||||
'startpage.md'
|
||||
]
|
||||
|
||||
export function getHeader(meta: { build: { api: boolean } }, id: string) {
|
||||
const title =
|
||||
'<div class="space-y-2 not-prose"><h1 class="text-4xl font-extrabold tracking-tight text-primary underline lg:text-5xl lg:leading-[3.5rem]">'
|
||||
|
||||
const description = '<p class="text-black dark:text-text-2">'
|
||||
|
||||
const feedback = meta.build.api ? '<Feedback />' : ''
|
||||
|
||||
const data = headers[id]
|
||||
let header = '---\n'
|
||||
header += `title: "${data.title}"\n`
|
||||
header += `description: ${data.description}\n`
|
||||
header += '---\n'
|
||||
header += `${title}${data.title}</h1>\n`
|
||||
header += `${description}${data.description}</p></div>\n\n${feedback}\n\n`
|
||||
return header
|
||||
}
|
69
website/transformer/core.ts
Normal file
69
website/transformer/core.ts
Normal file
|
@ -0,0 +1,69 @@
|
|||
/**
|
||||
* Copyright (c) 2025 taskylizard. Apache License 2.0.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
import consola from 'consola'
|
||||
|
||||
type Transform = {
|
||||
name: string
|
||||
find: string | RegExp
|
||||
replace: string | ((match: string) => string)
|
||||
}
|
||||
|
||||
type TransformerFunc = (name: string, transforms: Transform[]) => Replacer
|
||||
|
||||
interface Replacer {
|
||||
transform: TransformerFunc
|
||||
getText(): string
|
||||
}
|
||||
|
||||
export const transformer = (text: string) => {
|
||||
const handler: ProxyHandler<{ text: string }> = {
|
||||
get(target: { text: string }, prop: string | symbol) {
|
||||
if (prop === 'transform') {
|
||||
return (name: string, transforms: Transform[]): Replacer => {
|
||||
consola.debug(`Starting transform ${name} with ${transforms}`)
|
||||
|
||||
transforms.forEach(({ name, find, replace }) => {
|
||||
consola.debug(`Transforming ${name} with ${find}`)
|
||||
target.text = target.text.replace(find, replace as any)
|
||||
})
|
||||
|
||||
// @ts-expect-error - Proxy is not typed
|
||||
return proxy
|
||||
}
|
||||
}
|
||||
if (prop === 'getText') {
|
||||
return () => target.text
|
||||
}
|
||||
return Reflect.get(target, prop)
|
||||
}
|
||||
}
|
||||
|
||||
const target = { text }
|
||||
const proxy = new Proxy(target, handler)
|
||||
return proxy as unknown as Replacer
|
||||
}
|
||||
|
||||
export function replaceUnderscore(text: string): string {
|
||||
const pattern = /\/#[\w\-]+(?:_[\w]+)*/g
|
||||
const matches = text.match(pattern) || []
|
||||
let _text = text
|
||||
for (const match of matches) {
|
||||
const replacement = match.replace(/_/g, '-')
|
||||
_text = _text.replace(match, replacement)
|
||||
}
|
||||
return _text
|
||||
}
|
50
website/types/Feedback.ts
Normal file
50
website/types/Feedback.ts
Normal file
|
@ -0,0 +1,50 @@
|
|||
/**
|
||||
* Copyright (c) 2025 taskylizard. Apache License 2.0.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
import z from 'zod'
|
||||
|
||||
export const FeedbackSchema = z.object({
|
||||
message: z.string().min(5).max(1000),
|
||||
type: z.enum(['suggestion', 'appreciation', 'other']),
|
||||
page: z.string().min(3).max(20),
|
||||
// For heading based feedback
|
||||
heading: z.string().min(3).max(20).optional()
|
||||
})
|
||||
|
||||
export interface Option {
|
||||
label: string
|
||||
value: FeedbackType['type']
|
||||
}
|
||||
|
||||
export const feedbackOptions: Option[] = [
|
||||
{
|
||||
label: '💡 I have a suggestion',
|
||||
value: 'suggestion'
|
||||
},
|
||||
{
|
||||
label: '👍 I appreciate the work',
|
||||
value: 'appreciation'
|
||||
},
|
||||
{ label: '📂 Something else', value: 'other' }
|
||||
]
|
||||
|
||||
export function getFeedbackOption(
|
||||
value: FeedbackType['type']
|
||||
): Option | undefined {
|
||||
return feedbackOptions.find((option) => option.value === value)
|
||||
}
|
||||
|
||||
export type FeedbackType = z.infer<typeof FeedbackSchema>
|
28
website/utils.ts
Normal file
28
website/utils.ts
Normal file
|
@ -0,0 +1,28 @@
|
|||
/**
|
||||
* Copyright (c) 2025 taskylizard. Apache License 2.0.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
export function groupBy<T, K extends keyof any>(
|
||||
arr: T[],
|
||||
key: (i: T) => K
|
||||
): Record<K, T[]> {
|
||||
return arr.reduce(
|
||||
(groups, item) => {
|
||||
// biome-ignore lint/suspicious/noAssignInExpressions: <explanation>
|
||||
;(groups[key(item)] ||= []).push(item)
|
||||
return groups
|
||||
},
|
||||
{} as Record<K, T[]>
|
||||
)
|
||||
}
|
22
website/vue-shim.d.ts
vendored
Normal file
22
website/vue-shim.d.ts
vendored
Normal file
|
@ -0,0 +1,22 @@
|
|||
/**
|
||||
* Copyright (c) 2025 taskylizard. Apache License 2.0.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
/* eslint-disable ts/consistent-type-imports */
|
||||
declare module '*.vue' {
|
||||
const component: import('vue').Component
|
||||
export default component
|
||||
}
|
||||
|
||||
declare const FMHY_HOMEPAGE_ITEMS: typeof import('./constants').wikiSidebar
|
Loading…
Add table
Add a link
Reference in a new issue