Merge branch 'docs-pena-team' of github.com:janhq/jan into docs-pena-team

This commit is contained in:
Arista Indrajaya 2024-03-19 21:37:28 +07:00
commit bf1abd377c
124 changed files with 3670 additions and 901 deletions

View File

@ -22,6 +22,7 @@ on:
branches:
- main
- dev
- release/**
paths:
- "electron/**"
- .github/workflows/jan-electron-linter-and-test.yml

View File

@ -43,31 +43,31 @@ Jan is an open-source ChatGPT alternative that runs 100% offline on your compute
<tr style="text-align:center">
<td style="text-align:center"><b>Stable (Recommended)</b></td>
<td style="text-align:center">
<a href='https://github.com/janhq/jan/releases/download/v0.4.8/jan-win-x64-0.4.8.exe'>
<a href='https://github.com/janhq/jan/releases/download/v0.4.9/jan-win-x64-0.4.9.exe'>
<img src='./docs/static/img/windows.png' style="height:14px; width: 14px" />
<b>jan.exe</b>
</a>
</td>
<td style="text-align:center">
<a href='https://github.com/janhq/jan/releases/download/v0.4.8/jan-mac-x64-0.4.8.dmg'>
<a href='https://github.com/janhq/jan/releases/download/v0.4.9/jan-mac-x64-0.4.9.dmg'>
<img src='./docs/static/img/mac.png' style="height:15px; width: 15px" />
<b>Intel</b>
</a>
</td>
<td style="text-align:center">
<a href='https://github.com/janhq/jan/releases/download/v0.4.8/jan-mac-arm64-0.4.8.dmg'>
<a href='https://github.com/janhq/jan/releases/download/v0.4.9/jan-mac-arm64-0.4.9.dmg'>
<img src='./docs/static/img/mac.png' style="height:15px; width: 15px" />
<b>M1/M2</b>
</a>
</td>
<td style="text-align:center">
<a href='https://github.com/janhq/jan/releases/download/v0.4.8/jan-linux-amd64-0.4.8.deb'>
<a href='https://github.com/janhq/jan/releases/download/v0.4.9/jan-linux-amd64-0.4.9.deb'>
<img src='./docs/static/img/linux.png' style="height:14px; width: 14px" />
<b>jan.deb</b>
</a>
</td>
<td style="text-align:center">
<a href='https://github.com/janhq/jan/releases/download/v0.4.8/jan-linux-x86_64-0.4.8.AppImage'>
<a href='https://github.com/janhq/jan/releases/download/v0.4.9/jan-linux-x86_64-0.4.9.AppImage'>
<img src='./docs/static/img/linux.png' style="height:14px; width: 14px" />
<b>jan.AppImage</b>
</a>
@ -76,31 +76,31 @@ Jan is an open-source ChatGPT alternative that runs 100% offline on your compute
<tr style="text-align:center">
<td style="text-align:center"><b>Experimental (Nightly Build)</b></td>
<td style="text-align:center">
<a href='https://delta.jan.ai/latest/jan-win-x64-0.4.8-332.exe'>
<a href='https://delta.jan.ai/latest/jan-win-x64-0.4.9-335.exe'>
<img src='./docs/static/img/windows.png' style="height:14px; width: 14px" />
<b>jan.exe</b>
</a>
</td>
<td style="text-align:center">
<a href='https://delta.jan.ai/latest/jan-mac-x64-0.4.8-332.dmg'>
<a href='https://delta.jan.ai/latest/jan-mac-x64-0.4.9-335.dmg'>
<img src='./docs/static/img/mac.png' style="height:15px; width: 15px" />
<b>Intel</b>
</a>
</td>
<td style="text-align:center">
<a href='https://delta.jan.ai/latest/jan-mac-arm64-0.4.8-332.dmg'>
<a href='https://delta.jan.ai/latest/jan-mac-arm64-0.4.9-335.dmg'>
<img src='./docs/static/img/mac.png' style="height:15px; width: 15px" />
<b>M1/M2</b>
</a>
</td>
<td style="text-align:center">
<a href='https://delta.jan.ai/latest/jan-linux-amd64-0.4.8-332.deb'>
<a href='https://delta.jan.ai/latest/jan-linux-amd64-0.4.9-335.deb'>
<img src='./docs/static/img/linux.png' style="height:14px; width: 14px" />
<b>jan.deb</b>
</a>
</td>
<td style="text-align:center">
<a href='https://delta.jan.ai/latest/jan-linux-x86_64-0.4.8-332.AppImage'>
<a href='https://delta.jan.ai/latest/jan-linux-x86_64-0.4.9-335.AppImage'>
<img src='./docs/static/img/linux.png' style="height:14px; width: 14px" />
<b>jan.AppImage</b>
</a>
@ -327,6 +327,7 @@ Jan builds on top of other open-source projects:
- [llama.cpp](https://github.com/ggerganov/llama.cpp)
- [LangChain](https://github.com/langchain-ai)
- [TensorRT](https://github.com/NVIDIA/TensorRT)
- [TensorRT-LLM](https://github.com/NVIDIA/TensorRT-LLM)
## Contact

View File

@ -46,7 +46,7 @@
},
"devDependencies": {
"@types/jest": "^29.5.12",
"@types/node": "^12.0.2",
"@types/node": "^20.11.4",
"eslint": "8.57.0",
"eslint-plugin-jest": "^27.9.0",
"jest": "^29.7.0",

View File

@ -33,7 +33,7 @@ export enum AppRoute {
stopServer = 'stopServer',
log = 'log',
logServer = 'logServer',
systemInformations = 'systemInformations',
systemInformation = 'systemInformation',
showToast = 'showToast',
}
@ -95,6 +95,8 @@ export enum FileManagerRoute {
getUserHomePath = 'getUserHomePath',
fileStat = 'fileStat',
writeBlob = 'writeBlob',
mkdir = 'mkdir',
rm = 'rm',
}
export type ApiFunction = (...args: any[]) => any

View File

@ -1,4 +1,4 @@
import { DownloadRequest, FileStat, NetworkConfig } from './types'
import { DownloadRequest, FileStat, NetworkConfig, SystemInformation } from './types'
/**
* Execute a extension module function in main process
@ -110,7 +110,8 @@ const isSubdirectory: (from: string, to: string) => Promise<boolean> = (from: st
* Get system information
* @returns {Promise<any>} - A promise that resolves with the system information.
*/
const systemInformations: () => Promise<any> = () => global.core.api?.systemInformations()
const systemInformation: () => Promise<SystemInformation> = () =>
global.core.api?.systemInformation()
/**
* Show toast message from browser processes.
@ -146,7 +147,7 @@ export {
log,
isSubdirectory,
getUserHomePath,
systemInformations,
systemInformation,
showToast,
FileStat,
}

View File

@ -19,6 +19,7 @@ export interface Compatibility {
const ALL_INSTALLATION_STATE = [
'NotRequired', // not required.
'Installed', // require and installed. Good to go.
'Updatable', // require and installed but need to be updated.
'NotInstalled', // require to be installed.
'Corrupted', // require but corrupted. Need to redownload.
] as const
@ -59,6 +60,13 @@ export abstract class BaseExtension implements ExtensionType {
return undefined
}
/**
* Determine if the extension is updatable.
*/
updatable(): boolean {
return false
}
/**
* Determine if the prerequisites for the extension are installed.
*

View File

@ -1,4 +1,4 @@
import { executeOnMain, getJanDataFolderPath, joinPath } from '../../core'
import { executeOnMain, getJanDataFolderPath, joinPath, systemInformation } from '../../core'
import { events } from '../../events'
import { Model, ModelEvent } from '../../types'
import { OAIEngine } from './OAIEngine'
@ -30,11 +30,11 @@ export abstract class LocalOAIEngine extends OAIEngine {
if (model.engine.toString() !== this.provider) return
const modelFolder = await joinPath([await getJanDataFolderPath(), this.modelFolder, model.id])
const systemInfo = await systemInformation()
const res = await executeOnMain(this.nodeModule, this.loadModelFunctionName, {
modelFolder,
model,
})
}, systemInfo)
if (res?.error) {
events.emit(ModelEvent.OnModelFail, {

View File

@ -1,5 +1,5 @@
import { BaseExtension, ExtensionTypeEnum } from '../extension'
import { GpuSetting, MonitoringInterface } from '../index'
import { GpuSetting, MonitoringInterface, OperatingSystemInfo } from '../index'
/**
* Monitoring extension for system monitoring.
@ -16,4 +16,5 @@ export abstract class MonitoringExtension extends BaseExtension implements Monit
abstract getGpuSetting(): Promise<GpuSetting>
abstract getResourcesInfo(): Promise<any>
abstract getCurrentLoad(): Promise<any>
abstract getOsInfo(): Promise<OperatingSystemInfo>
}

View File

@ -37,12 +37,17 @@ const readdirSync = (...args: any[]) => global.core.api?.readdirSync(...args)
*/
const mkdirSync = (...args: any[]) => global.core.api?.mkdirSync(...args)
const mkdir = (...args: any[]) => global.core.api?.mkdir(...args)
/**
* Removes a directory at the specified path.
* @returns {Promise<any>} A Promise that resolves when the directory is removed successfully.
*/
const rmdirSync = (...args: any[]) =>
global.core.api?.rmdirSync(...args, { recursive: true, force: true })
const rm = (path: string) => global.core.api?.rm(path)
/**
* Deletes a file from the local file system.
* @param {string} path - The path of the file to delete.
@ -92,7 +97,9 @@ export const fs = {
existsSync,
readdirSync,
mkdirSync,
mkdir,
rmdirSync,
rm,
unlinkSync,
appendFileSync,
copyFileSync,

View File

@ -88,4 +88,28 @@ export class FSExt implements Processor {
})
})
}
mkdir(path: string): Promise<void> {
return new Promise((resolve, reject) => {
fs.mkdir(path, { recursive: true }, (err) => {
if (err) {
reject(err)
} else {
resolve()
}
})
})
}
rmdir(path: string): Promise<void> {
return new Promise((resolve, reject) => {
fs.rm(path, { recursive: true }, (err) => {
if (err) {
reject(err)
} else {
resolve()
}
})
})
}
}

View File

@ -93,8 +93,7 @@ export function persistExtensions() {
*/
export async function installExtensions(extensions: any) {
const installed: Extension[] = []
for (const ext of extensions) {
// Set install options and activation based on input type
const installations = extensions.map((ext: any): Promise<void> => {
const isObject = typeof ext === 'object'
const spec = isObject ? [ext.specifier, ext] : [ext]
const activate = isObject ? ext.activate !== false : true
@ -102,15 +101,17 @@ export async function installExtensions(extensions: any) {
// Install and possibly activate extension
const extension = new Extension(...spec)
if (!extension.origin) {
continue
return Promise.resolve()
}
await extension._install()
if (activate) extension.setActive(true)
return extension._install().then(() => {
if (activate) extension.setActive(true)
// Add extension to store if needed
addExtension(extension)
installed.push(extension)
})
})
// Add extension to store if needed
addExtension(extension)
installed.push(extension)
}
await Promise.all(installations)
// Return list of all installed extensions
return installed

View File

@ -82,26 +82,34 @@ export const getJanExtensionsPath = (): string => {
*/
export const physicalCpuCount = async (): Promise<number> => {
const platform = os.platform()
if (platform === 'linux') {
const output = await exec('lscpu -p | egrep -v "^#" | sort -u -t, -k 2,4 | wc -l')
return parseInt(output.trim(), 10)
} else if (platform === 'darwin') {
const output = await exec('sysctl -n hw.physicalcpu_max')
return parseInt(output.trim(), 10)
} else if (platform === 'win32') {
const output = await exec('WMIC CPU Get NumberOfCores')
return output
.split(os.EOL)
.map((line: string) => parseInt(line))
.filter((value: number) => !isNaN(value))
.reduce((sum: number, number: number) => sum + number, 1)
} else {
const cores = os.cpus().filter((cpu: any, index: number) => {
const hasHyperthreading = cpu.model.includes('Intel')
const isOdd = index % 2 === 1
return !hasHyperthreading || isOdd
})
return cores.length
try {
if (platform === 'linux') {
const output = await exec('lscpu -p | egrep -v "^#" | sort -u -t, -k 2,4 | wc -l')
return parseInt(output.trim(), 10)
} else if (platform === 'darwin') {
const output = await exec('sysctl -n hw.physicalcpu_max')
return parseInt(output.trim(), 10)
} else if (platform === 'win32') {
const output = await exec('WMIC CPU Get NumberOfCores')
return output
.split(os.EOL)
.map((line: string) => parseInt(line))
.filter((value: number) => !isNaN(value))
.reduce((sum: number, number: number) => sum + number, 1)
} else {
const cores = os.cpus().filter((cpu: any, index: number) => {
const hasHyperthreading = cpu.model.includes('Intel')
const isOdd = index % 2 === 1
return !hasHyperthreading || isOdd
})
return cores.length
}
} catch (err) {
console.warn('Failed to get physical CPU count', err)
// Divide by 2 to get rid of hyper threading
const coreCount = Math.ceil(os.cpus().length / 2)
console.debug('Using node API to get physical CPU count:', coreCount)
return coreCount
}
}

View File

@ -1,6 +1,6 @@
import { SystemResourceInfo } from '../../types'
import { physicalCpuCount } from './config'
import { log, logServer } from './log'
import { log } from './log'
export const getSystemResourceInfo = async (): Promise<SystemResourceInfo> => {
const cpu = await physicalCpuCount()

View File

@ -30,3 +30,27 @@ export type GpuSettingInfo = {
name: string
arch?: string
}
export type SystemInformation = {
gpuSetting: GpuSetting
osInfo?: OperatingSystemInfo
}
export const SupportedPlatforms = ['win32', 'linux', 'darwin'] as const
export type SupportedPlatformTuple = typeof SupportedPlatforms
export type SupportedPlatform = SupportedPlatformTuple[number]
export type OperatingSystemInfo = {
platform: SupportedPlatform | 'unknown'
arch: string
release: string
machine: string
version: string
totalMem: number
freeMem: number
}
export type CpuCoreInfo = {
model: string
speed: number
}

View File

@ -3,4 +3,5 @@ UMAMI_PROJECT_API_KEY=xxxx
UMAMI_APP_URL=xxxx
ALGOLIA_API_KEY=xxxx
ALGOLIA_APP_ID=xxxx
GITHUB_ACCESS_TOKEN=xxxx
GITHUB_ACCESS_TOKEN=xxxx
API_KEY_BREVO=xxxx

View File

@ -5,6 +5,21 @@ slug: /postmortems/january-10-2024-bitdefender-false-positive-flag
tags: [Postmortem]
---
<head>
<title>Jan 10, 2024 Incident Postmortem - Bitdefender False Positive Flag on Jan AI Resolved</title>
<meta charSet="utf-8" />
<meta name="description" content="Comprehensive postmortem on the Jan AI v0.4.4 Bitdefender false positive incident on January 10, 2024. Learn about the investigation, solutions, and preventive measures." />
<meta name="keywords" content="Jan AI, Jan, ChatGPT alternative, local AI, private AI, conversational AI, no-subscription fee, large language model, postmortem, incident, flagging issue" />
<meta name="twitter:card" content="summary" />
<link rel="canonical" href="https://jan.ai/blog/postmortems/january-10-2024-bitdefender-false-positive-flag/" />
<meta property="og:title" content="Bitdefender False Positive Flag on Jan AI Resolved - Jan 10, 2024 Incident Postmortem" />
<meta property="og:description" content="Comprehensive postmortem on the Jan AI v0.4.4 Bitdefender false positive incident on January 10, 2024. Learn about the investigation, solutions, and preventive measures." />
<meta property="og:url" content="https://jan.ai/blog/postmortems/january-10-2024-bitdefender-false-positive-flag/" />
<meta property="og:type" content="article" />
<meta property="og:image" content="https://jan.ai/img/og-image.png" />
</head>
Following the recent incident related to Jan version 0.4.4 triggering Bitdefender on Windows with Gen:Variant.Tedy.258323 on January 10, 2024, we wanted to provide a comprehensive postmortem and outline the necessary follow-up actions.
## Incident Overview

View File

@ -2,6 +2,20 @@
title: Jan's Vision for 2035
---
<head>
<title>Jan's Vision for 2035</title>
<meta charset="utf-8" />
<meta name="description" content="Discover Jan's vision for the year 2035, where it aims to transform into a robotics company. Learn about its planning parameters, 10-year vision, 2-week sprint, and success measurement through Quarterly OKRs." />
<meta name="keywords" content="Jan, vision, 2035, robotics company, planning parameters, 10-year vision, 2-week sprint, Quarterly OKRs" />
<meta name="twitter:card" content="summary" />
<link rel="canonical" href="https://jan.ai/jans-vision-for-2035" />
<meta property="og:title" content="Jan's Vision for 2035" />
<meta property="og:description" content="Discover Jan's vision for the year 2035, where it aims to transform into a robotics company. Learn about its planning parameters, 10-year vision, 2-week sprint, and success measurement through Quarterly OKRs." />
<meta property="og:url" content="https://jan.ai/jans-vision-for-2035" />
<meta property="og:type" content="article" />
<meta property="og:image" content="https://jan.ai/img/og-image-jans-vision.png" />
</head>
[Jan 2035: A Robotics Company](https://hackmd.io/QIWyYbNNQVWVbupuI3kjAA)
We only have 2 planning parameters:

View File

@ -18,6 +18,20 @@ keywords:
]
---
<head>
<title>About Jan</title>
<meta charset="utf-8" />
<meta name="description" content="Discover Jan, a desktop application that turns computers into thinking machines. Learn about its features, principles, vision, and how to get involved with the Jan Labs team." />
<meta name="keywords" content="Jan, Jan AI, ChatGPT alternative, local AI, private AI, conversational AI, no-subscription fee, large language model, desktop application, thinking machine, about Jan" />
<meta name="twitter:card" content="summary" />
<link rel="canonical" href="https://jan.ai/about" />
<meta property="og:title" content="About Jan" />
<meta property="og:description" content="Discover Jan, a desktop application that turns computers into thinking machines. Learn about its features, principles, vision, and how to get involved with the Jan Labs team." />
<meta property="og:url" content="https://jan.ai/about" />
<meta property="og:type" content="article" />
<meta property="og:image" content="https://jan.ai/img/og-image-about-jan.png" />
</head>
Jan turns computers into thinking machines to change how we use them.
Jan is created and maintained by Jan Labs, a robotics company.

View File

@ -1,3 +1,21 @@
---
title: Frequently Asked Questions (FAQ) - Jan
---
<head>
<title>Frequently Asked Questions (FAQ)</title>
<meta charset="utf-8" />
<meta name="description" content="Explore frequently asked questions about Jan, including its features, compatibility, privacy policy, usage, and community involvement." />
<meta name="keywords" content="Jan, frequently asked questions, FAQ, about Jan, usage, compatibility, privacy, community, contribution, troubleshooting, self-hosting, hiring" />
<meta name="twitter:card" content="summary" />
<link rel="canonical" href="https://jan.ai/faq" />
<meta property="og:title" content="Frequently Asked Questions (FAQ)" />
<meta property="og:description" content="Explore frequently asked questions about Jan, including its features, compatibility, privacy policy, usage, and community involvement." />
<meta property="og:url" content="https://jan.ai/faq" />
<meta property="og:type" content="article" />
<meta property="og:image" content="https://jan.ai/img/og-image-faq.png" />
</head>
# Frequently Asked Questions (FAQ)
## What is Jan?

View File

@ -2,5 +2,19 @@
title: Roadmap
---
<head>
<title>Roadmap</title>
<meta charset="utf-8" />
<meta name="description" content="Explore Jan's roadmap to see the immediate and longer-term plans for development and features." />
<meta name="keywords" content="Jan, roadmap, development, features, immediate roadmap, longer-term roadmap, GitHub, Discord" />
<meta name="twitter:card" content="summary" />
<link rel="canonical" href="https://jan.ai/roadmap" />
<meta property="og:title" content="Roadmap" />
<meta property="og:description" content="Explore Jan's roadmap to see the immediate and longer-term plans for development and features." />
<meta property="og:url" content="https://jan.ai/roadmap" />
<meta property="og:type" content="article" />
<meta property="og:image" content="https://jan.ai/img/og-image-roadmap.png" />
</head>
- [ ] [Immediate Roadmap on Github](https://github.com/orgs/janhq/projects/5/views/16)
- [ ] [Longer-term Roadmap on Discord](https://discord.gg/Ey62mynnYr)
- [ ] [Longer-term Roadmap on Discord](https://discord.gg/Ey62mynnYr)

View File

@ -17,6 +17,17 @@ keywords:
]
---
<head>
<meta name="description" content="Jan is a ChatGPT-alternative that runs on your own computer, with a local API server. Explore the third-party libraries that have contributed to the development of Jan."/>
<meta name="keywords" content="Jan AI, Jan, ChatGPT alternative, local AI, private AI, conversational AI, no-subscription fee, large language model, acknowledgements, third-party libraries"/>
<meta property="og:title" content="Acknowledgements - Jan"/>
<meta property="og:description" content="Jan is a ChatGPT-alternative that runs on your own computer, with a local API server. Explore the third-party libraries that have contributed to the development of Jan."/>
<meta property="og:url" content="https://jan.ai/acknowledgements"/>
<meta name="twitter:card" content="summary"/>
<meta name="twitter:title" content="Acknowledgements - Jan"/>
<meta name="twitter:description" content="Jan is a ChatGPT-alternative that runs on your own computer, with a local API server. Explore the third-party libraries that have contributed to the development of Jan."/>
</head>
# Acknowledgements
We would like to express our gratitude to the following third-party libraries that have made the development of Jan possible.
@ -24,3 +35,4 @@ We would like to express our gratitude to the following third-party libraries th
- [llama.cpp](https://github.com/ggerganov/llama.cpp/blob/master/LICENSE)
- [LangChain.js](https://github.com/langchain-ai/langchainjs/blob/main/LICENSE)
- [TensorRT](https://github.com/NVIDIA/TensorRT/blob/main/LICENSE)
- [TensorRT-LLM](https://github.com/NVIDIA/TensorRT-LLM/blob/main/LICENSE)

View File

@ -15,6 +15,20 @@ keywords:
]
---
<head>
<title>Jan's Community</title>
<meta charset="utf-8" />
<meta name="description" content="Join Jan's community to connect with other users, stay updated, and explore career opportunities." />
<meta name="keywords" content="Jan, community, Discord, Twitter, HuggingFace, LinkedIn, Reddit, newsletter, careers" />
<meta name="twitter:card" content="summary" />
<link rel="canonical" href="https://jan.ai/community" />
<meta property="og:title" content="Jan's Community" />
<meta property="og:description" content="Join Jan's community to connect with other users, stay updated, and explore career opportunities." />
<meta property="og:url" content="https://jan.ai/community" />
<meta property="og:type" content="article" />
<meta property="og:image" content="https://jan.ai/img/og-image-community.png" />
</head>
## Socials
- [Discord](https://discord.gg/SH3DGmUs6b)

View File

@ -15,6 +15,20 @@ keywords:
]
---
<head>
<title>Jan AI Architecture - Modular and Extensible Framework</title>
<meta charSet="utf-8" />
<meta name="description" content="Discover the modular architecture of Jan, a ChatGPT alternative that runs on your own computer. Learn about Jan's local API server, Desktop UI, and the Nitro inference engine." />
<meta name="keywords" content="Jan AI, Jan, ChatGPT alternative, local AI, private AI, conversational AI, no-subscription fee, large language model, modular architecture, Extensions API" />
<meta name="twitter:card" content="summary" />
<link rel="canonical" href="https://jan.ai/developer/architecture/" />
<meta property="og:title" content="Jan AI Architecture - Modular and Extensible Framework" />
<meta property="og:description" content="Discover the modular architecture of Jan, a ChatGPT alternative that runs on your own computer. Learn about Jan's local API server, Desktop UI, and the Nitro inference engine." />
<meta property="og:url" content="https://jan.ai/developer/architecture/" />
<meta property="og:type" content="article" />
<meta property="og:image" content="https://jan.ai/img/og-image.png" />
</head>
:::warning
This page is still under construction, and should be read as a scratchpad

View File

@ -15,6 +15,20 @@ keywords:
]
---
<head>
<title>Jan AI File-based Data Persistence Approach</title>
<meta charSet="utf-8" />
<meta name="description" content="Learn how Jan, a ChatGPT alternative, leverages a local filesystem for data persistence, promoting composability and tinkerability similar to VSCode." />
<meta name="keywords" content="Jan AI, Jan, ChatGPT alternative, local AI, private AI, conversational AI, no-subscription fee, large language model, file-based data storage, data persistence" />
<meta name="twitter:card" content="summary" />
<link rel="canonical" href="https://jan.ai/developer/file-based/" />
<meta property="og:title" content="Jan AI File-based Data Persistence Approach" />
<meta property="og:description" content="Learn how Jan, a ChatGPT alternative, leverages a local filesystem for data persistence, promoting composability and tinkerability similar to VSCode." />
<meta property="og:url" content="https://jan.ai/developer/file-based/" />
<meta property="og:type" content="article" />
<meta property="og:image" content="https://jan.ai/img/og-image.png" />
</head>
:::warning
This page is still under construction, and should be read as a scratchpad

View File

@ -15,6 +15,20 @@ keywords:
]
---
<head>
<title>Jan AI User Interface - Customizable UI Kit</title>
<meta charSet="utf-8" />
<meta name="description" content="Explore Jan's UI Kit for customizing the user interface to fit your brand and style. Learn how to personalize your application with Jan's flexible UI components." />
<meta name="keywords" content="Jan AI, Jan, ChatGPT alternative, local AI, private AI, conversational AI, no-subscription fee, large language model, UI Kit, customizable UI" />
<meta name="twitter:card" content="summary" />
<link rel="canonical" href="https://jan.ai/developer/ui/" />
<meta property="og:title" content="Jan AI User Interface - Customizable UI Kit" />
<meta property="og:description" content="Explore Jan's UI Kit for customizing the user interface to fit your brand and style. Learn how to personalize your application with Jan's flexible UI components." />
<meta property="og:url" content="https://jan.ai/developer/ui/" />
<meta property="og:type" content="article" />
<meta property="og:image" content="https://jan.ai/img/og-image.png" />
</head>
:::warning
This page is still under construction, and should be read as a scratchpad

View File

@ -18,6 +18,20 @@ keywords:
]
---
<head>
<title>Jan AI Installation and Setup Guide - Developer Prerequisites</title>
<meta charSet="utf-8" />
<meta name="description" content="Comprehensive guide to installing and setting up Jan for development. Covers hardware, system requirements, and step-by-step instructions for developers." />
<meta name="keywords" content="Jan AI, Jan, ChatGPT alternative, local AI, private AI, conversational AI, no-subscription fee, large language model, installation, prerequisites, developer setup" />
<meta name="twitter:card" content="summary" />
<link rel="canonical" href="https://jan.ai/developer/prereq/" />
<meta property="og:title" content="Jan AI Installation and Setup Guide - Developer Prerequisites" />
<meta property="og:description" content="Comprehensive guide to installing and setting up Jan for development. Covers hardware, system requirements, and step-by-step instructions for developers." />
<meta property="og:url" content="https://jan.ai/developer/prereq/" />
<meta property="og:type" content="article" />
<meta property="og:image" content="https://jan.ai/img/og-image.png" />
</head>
## Requirements
### Hardware Requirements

View File

@ -15,6 +15,20 @@ keywords:
]
---
<head>
<title>Jan AI Developer Documentation - Building Extensions and SDK Overview</title>
<meta charSet="utf-8" />
<meta name="description" content="Guide for developers on building extensions on top of the Jan Framework. Learn about Jan's extensible framework for AI applications, available on all platforms." />
<meta name="keywords" content="Jan AI, Jan, ChatGPT alternative, local AI, private AI, conversational AI, no-subscription fee, large language model, extensible framework, SDK, building extensions" />
<meta name="twitter:card" content="summary" />
<link rel="canonical" href="https://jan.ai/developer/" />
<meta property="og:title" content="Jan AI Developer Documentation - Building Extensions and SDK Overview" />
<meta property="og:description" content="Guide for developers on building extensions on top of the Jan Framework. Learn about Jan's extensible framework for AI applications, available on all platforms." />
<meta property="og:url" content="https://jan.ai/developer/" />
<meta property="og:type" content="article" />
<meta property="og:image" content="https://jan.ai/img/og-image.png" />
</head>
The following docs are aimed at developers who want to build extensions on top of the Jan Framework.
:::tip

View File

@ -17,7 +17,20 @@ keywords:
]
---
<head>
<title>Your First Assistant</title>
<meta charset="utf-8" />
<meta name="description" content="Get started quickly with building your first assistant using Jan. Learn the basics of creating conversational AI." />
<meta name="keywords" content="Jan, build assistant, quick start, conversational AI, local AI, private AI, large language model" />
<meta name="twitter:card" content="summary" />
<link rel="canonical" href="https://jan.ai/developer/build-assistant/your-first-assistant/" />
<meta property="og:title" content="Your First Assistant" />
<meta property="og:description" content="Get started quickly with building your first assistant using Jan. Learn the basics of creating conversational AI." />
<meta property="og:url" content="https://jan.ai/developer/build-assistant/your-first-assistant/" />
<meta property="og:type" content="article" />
<meta property="og:image" content="https://jan.ai/img/og-image-first-assistant.png" />
</head>
:::caution
This is currently under development.
:::

View File

@ -17,6 +17,20 @@ keywords:
]
---
<head>
<title>Building Your First Jan AI Extension - Quick Start Guide</title>
<meta charSet="utf-8" />
<meta name="description" content="Step-by-step guide on how to build your first extension for Jan AI. Learn how to use the extension template and integrate your custom functionality into Jan." />
<meta name="keywords" content="Jan AI, Jan, ChatGPT alternative, local AI, private AI, conversational AI, no-subscription fee, large language model, quick start, build extension" />
<meta name="twitter:card" content="summary" />
<link rel="canonical" href="https://jan.ai/developer/build-extension/your-first-extension/" />
<meta property="og:title" content="Building Your First Jan AI Extension - Quick Start Guide" />
<meta property="og:description" content="Step-by-step guide on how to build your first extension for Jan AI. Learn how to use the extension template and integrate your custom functionality into Jan." />
<meta property="og:url" content="https://jan.ai/developer/build-extension/your-first-extension/" />
<meta property="og:type" content="article" />
<meta property="og:image" content="https://jan.ai/img/og-image.png" />
</head>
:::caution
This is currently under development.
:::
@ -76,13 +90,13 @@ There are a few things to keep in mind when writing your extension code:
In `index.ts`, you will see that the extension function will return a `Promise<any>`.
```typescript
import { core } from "@janhq/core";
import { core } from '@janhq/core'
function onStart(): Promise<any> {
return core.invokePluginFunc(MODULE_PATH, "run", 0);
return core.invokePluginFunc(MODULE_PATH, 'run', 0)
}
```
For more information about the Jan Extension Core module, see the [documentation](https://github.com/janhq/jan/blob/main/core/README.md).
Now, go ahead and start customizing your extension! Happy coding!
Now, go ahead and start customizing your extension! Happy coding!

View File

@ -1,5 +1,5 @@
---
title: "Assistants"
title: 'Assistants'
description: Jan is a ChatGPT-alternative that runs on your own computer, with a local API server.
keywords:
[
@ -14,6 +14,19 @@ keywords:
]
---
<head>
<title>Assistants</title>
<meta charset="utf-8" />
<meta name="description" content="Jan is a ChatGPT-alternative that runs on your own computer, with a local API server." />
<meta name="keywords" content="Jan AI, Jan, ChatGPT alternative, local AI, private AI, conversational AI, no-subscription fee, large language model" />
<meta name="twitter:card" content="summary" />
<link rel="canonical" href="https://jan.ai/assistants" />
<meta property="og:title" content="Assistants" />
<meta property="og:description" content="Jan is a ChatGPT-alternative that runs on your own computer, with a local API server." />
<meta property="og:url" content="https://jan.ai/assistants" />
<meta property="og:type" content="article" />
</head>
:::caution
This is currently under development.

View File

@ -14,6 +14,19 @@ keywords:
]
---
<head>
<title>Chats</title>
<meta charset="utf-8" />
<meta name="description" content="Jan is a ChatGPT-alternative that runs on your own computer, with a local API server." />
<meta name="keywords" content="Jan AI, Jan, ChatGPT alternative, local AI, private AI, conversational AI, no-subscription fee, large language model" />
<meta name="twitter:card" content="summary" />
<link rel="canonical" href="https://jan.ai/chats" />
<meta property="og:title" content="Chats" />
<meta property="og:description" content="Jan is a ChatGPT-alternative that runs on your own computer, with a local API server." />
<meta property="og:url" content="https://jan.ai/chats" />
<meta property="og:type" content="article" />
</head>
:::caution
This is currently under development.

View File

@ -2,6 +2,19 @@
title: Engine
---
<head>
<title>Engine</title>
<meta charset="utf-8" />
<meta name="description" content="Currently Under Development" />
<meta name="keywords" content="Jan AI, Jan, ChatGPT alternative, local AI, private AI, conversational AI, no-subscription fee, large language model" />
<meta name="twitter:card" content="summary" />
<link rel="canonical" href="https://jan.ai/engine" />
<meta property="og:title" content="Engine" />
<meta property="og:description" content="Currently Under Development" />
<meta property="og:url" content="https://jan.ai/engine" />
<meta property="og:type" content="article" />
</head>
:::caution
Currently Under Development

View File

@ -1,5 +1,5 @@
---
title: "Files"
title: 'Files'
description: Jan is a ChatGPT-alternative that runs on your own computer, with a local API server.
keywords:
[
@ -14,6 +14,19 @@ keywords:
]
---
<head>
<title>Files</title>
<meta charset="utf-8" />
<meta name="description" content="Jan is a ChatGPT-alternative that runs on your own computer, with a local API server." />
<meta name="keywords" content="Jan AI, Jan, ChatGPT alternative, local AI, private AI, conversational AI, no-subscription fee, large language model" />
<meta name="twitter:card" content="summary" />
<link rel="canonical" href="https://jan.ai/files" />
<meta property="og:title" content="Files" />
<meta property="og:description" content="Jan is a ChatGPT-alternative that runs on your own computer, with a local API server." />
<meta property="og:url" content="https://jan.ai/files" />
<meta property="og:type" content="article" />
</head>
:::warning
Draft Specification: functionality has not been implemented yet.

View File

@ -14,6 +14,19 @@ keywords:
]
---
<head>
<title>Messages</title>
<meta charset="utf-8" />
<meta name="description" content="Jan is a ChatGPT-alternative that runs on your own computer, with a local API server." />
<meta name="keywords" content="Jan AI, Jan, ChatGPT alternative, local AI, private AI, conversational AI, no-subscription fee, large language model" />
<meta name="twitter:card" content="summary" />
<link rel="canonical" href="https://jan.ai/messages" />
<meta property="og:title" content="Messages" />
<meta property="og:description" content="Jan is a ChatGPT-alternative that runs on your own computer, with a local API server." />
<meta property="og:url" content="https://jan.ai/messages" />
<meta property="og:type" content="article" />
</head>
:::caution
This is currently under development.

View File

@ -14,6 +14,19 @@ keywords:
]
---
<head>
<title>Models</title>
<meta charset="utf-8" />
<meta name="description" content="Jan is a ChatGPT-alternative that runs on your own computer, with a local API server." />
<meta name="keywords" content="Jan AI, Jan, ChatGPT alternative, local AI, private AI, conversational AI, no-subscription fee, large language model" />
<meta name="twitter:card" content="summary" />
<link rel="canonical" href="https://jan.ai/models" />
<meta property="og:title" content="Models" />
<meta property="og:description" content="Jan is a ChatGPT-alternative that runs on your own computer, with a local API server." />
<meta property="og:url" content="https://jan.ai/models" />
<meta property="og:type" content="article" />
</head>
:::caution
This is currently under development.

View File

@ -14,6 +14,19 @@ keywords:
]
---
<head>
<title>Threads</title>
<meta charset="utf-8" />
<meta name="description" content="Jan is a ChatGPT-alternative that runs on your own computer, with a local API server." />
<meta name="keywords" content="Jan AI, Jan, ChatGPT alternative, local AI, private AI, conversational AI, no-subscription fee, large language model" />
<meta name="twitter:card" content="summary" />
<link rel="canonical" href="https://jan.ai/threads" />
<meta property="og:title" content="Threads" />
<meta property="og:description" content="Jan is a ChatGPT-alternative that runs on your own computer, with a local API server." />
<meta property="og:url" content="https://jan.ai/threads" />
<meta property="og:type" content="article" />
</head>
:::caution
This is currently under development.

View File

@ -14,6 +14,19 @@ keywords:
]
---
<head>
<title>Chat</title>
<meta charset="utf-8" />
<meta name="description" content="Jan is a ChatGPT-alternative that runs on your own computer, with a local API server." />
<meta name="keywords" content="Jan AI, Jan, ChatGPT alternative, local AI, private AI, conversational AI, no-subscription fee, large language model" />
<meta name="twitter:card" content="summary" />
<link rel="canonical" href="https://jan.ai/chat" />
<meta property="og:title" content="Chat" />
<meta property="og:description" content="Jan is a ChatGPT-alternative that runs on your own computer, with a local API server." />
<meta property="og:url" content="https://jan.ai/chat" />
<meta property="og:type" content="article" />
</head>
## Overview
A home screen for users to chat with [assistants](/docs/engineering/assistants) via conversation [threads](/docs/engineering/threads).

View File

@ -14,6 +14,19 @@ keywords:
]
---
<head>
<title>Hub</title>
<meta charset="utf-8" />
<meta name="description" content="Jan is a ChatGPT-alternative that runs on your own computer, with a local API server." />
<meta name="keywords" content="Jan AI, Jan, ChatGPT alternative, local AI, private AI, conversational AI, no-subscription fee, large language model" />
<meta name="twitter:card" content="summary" />
<link rel="canonical" href="https://jan.ai/hub" />
<meta property="og:title" content="Hub" />
<meta property="og:description" content="Jan is a ChatGPT-alternative that runs on your own computer, with a local API server." />
<meta property="og:url" content="https://jan.ai/hub" />
<meta property="og:type" content="article" />
</head>
## Overview
The Hub is like a store for everything, where users can discover and download models, assistants, and more.

View File

@ -14,6 +14,19 @@ keywords:
]
---
<head>
<title>Jan (The Default Assistant)</title>
<meta charset="utf-8" />
<meta name="description" content="Jan is a ChatGPT-alternative that runs on your own computer, with a local API server." />
<meta name="keywords" content="Jan AI, Jan, ChatGPT alternative, local AI, private AI, conversational AI, no-subscription fee, large language model" />
<meta name="twitter:card" content="summary" />
<link rel="canonical" href="https://jan.ai/jan" />
<meta property="og:title" content="Jan (The Default Assistant)" />
<meta property="og:description" content="Jan is a ChatGPT-alternative that runs on your own computer, with a local API server." />
<meta property="og:url" content="https://jan.ai/jan" />
<meta property="og:type" content="article" />
</head>
Jan ships with a default assistant "Jan" that lets users chat with any open source model out-of-the-box.
This assistant is defined in `/jan`. It is a generic assistant to illustrate power of Jan. In the future, it will support additional features e.g. multi-assistant conversations

View File

@ -14,6 +14,19 @@ keywords:
]
---
<head>
<title>Settings</title>
<meta charset="utf-8" />
<meta name="description" content="Jan is a ChatGPT-alternative that runs on your own computer, with a local API server." />
<meta name="keywords" content="Jan AI, Jan, ChatGPT alternative, local AI, private AI, conversational AI, no-subscription fee, large language model" />
<meta name="twitter:card" content="summary" />
<link rel="canonical" href="https://jan.ai/settings" />
<meta property="og:title" content="Settings" />
<meta property="og:description" content="Jan is a ChatGPT-alternative that runs on your own computer, with a local API server." />
<meta property="og:url" content="https://jan.ai/settings" />
<meta property="og:type" content="article" />
</head>
## Overview
A settings page for users to add extensions, configure model settings, change app appearance, add keyboard shortcuts, and a plethora of other personalizations.

View File

@ -14,6 +14,19 @@ keywords:
]
---
<head>
<title>System Monitor</title>
<meta charset="utf-8" />
<meta name="description" content="Jan is a ChatGPT-alternative that runs on your own computer, with a local API server." />
<meta name="keywords" content="Jan AI, Jan, ChatGPT alternative, local AI, private AI, conversational AI, no-subscription fee, large language model" />
<meta name="twitter:card" content="summary" />
<link rel="canonical" href="https://jan.ai/system-monitor" />
<meta property="og:title" content="System Monitor" />
<meta property="og:description" content="Jan is a ChatGPT-alternative that runs on your own computer, with a local API server." />
<meta property="og:url" content="https://jan.ai/system-monitor" />
<meta property="og:type" content="article" />
</head>
## Overview
An activity screen to monitor system health and running models.

View File

@ -1,10 +1,23 @@
---
title: "Jan's AI Hacker House (Ho Chi Minh City)"
description: "24-27 Oct 2023, District 3, HCMC. AI-focused talks, workshops and social events. Hosted by Jan.ai"
description: '24-27 Oct 2023, District 3, HCMC. AI-focused talks, workshops and social events. Hosted by Jan.ai'
slug: /events/hcmc-oct23
image: /img/hcmc-launch-party.png
---
<head>
<title>Jan's AI Hacker House (Ho Chi Minh City)</title>
<meta charset="utf-8" />
<meta name="description" content="24-27 Oct 2023, District 3, HCMC. AI-focused talks, workshops and social events. Hosted by Jan.ai" />
<meta name="keywords" content="Jan AI, Jan, ChatGPT alternative, local AI, private AI, conversational AI, no-subscription fee, large language model" />
<meta name="twitter:card" content="summary" />
<link rel="canonical" href="https://jan.ai/events/hcmc-oct23" />
<meta property="og:title" content="Jan's AI Hacker House (Ho Chi Minh City)" />
<meta property="og:description" content="24-27 Oct 2023, District 3, HCMC. AI-focused talks, workshops and social events. Hosted by Jan.ai" />
<meta property="og:url" content="https://jan.ai/events/hcmc-oct23" />
<meta property="og:type" content="article" />
</head>
![](/img/hcmc-launch-party.png)
🎉 Join us at our Friday Launch Party for an evening of AI talks from other builders! [(RSVP here)](https://jan-launch-party.eventbrite.sg/) 🎉

View File

@ -1,21 +1,33 @@
---
title: "Nov 23: Nvidia GenAI Day"
description: Nvidia's LLM Day
title: 'Nov 23: Nvidia GenAI Day'
description: Nvidia's LLM Day
---
<head>
<title>Nov 23: Nvidia GenAI Day</title>
<meta charset="utf-8" />
<meta name="description" content="Nvidia's LLM Day" />
<meta name="keywords" content="Jan AI, Jan, ChatGPT alternative, local AI, private AI, conversational AI, no-subscription fee, large language model" />
<meta name="twitter:card" content="summary" />
<link rel="canonical" href="https://jan.ai/events/nvidia-genai-day" />
<meta property="og:title" content="Nov 23: Nvidia GenAI Day" />
<meta property="og:description" content="Nvidia's LLM Day" />
<meta property="og:url" content="https://jan.ai/events/nvidia-genai-day" />
<meta property="og:type" content="article" />
</head>
![](/img/nvidia-llm-day-header.png)
## Nvidia GenAI Innovation Day
Jan will be at Nvidia's GenAI Innovation Day in Nov '23, focusing on Enterprise use-cases of LLMs.
Jan will be at Nvidia's GenAI Innovation Day in Nov '23, focusing on Enterprise use-cases of LLMs.
### Location
- JW Marriott Hanoi Hotel
- JW Marriott Hanoi Hotel
- 8:30am November 8th 2023
- Registration: [https://gmcgroup.com.vn/nvidia-genai-event/](https://gmcgroup.com.vn/nvidia-genai-event/)
### Programme
![](/img/nvidia-llm-day.png)

View File

@ -18,6 +18,17 @@ keywords:
]
---
<head>
<title>Open Interpreter</title>
<meta name="description" content="A step-by-step guide on how to integrate Jan with Open Interpreter. Learn how to install Open Interpreter, configure Jan's local API server, and set up the Open Interpreter environment for seamless interaction with Jan."/>
<meta name="keywords" content="Jan AI, Jan, ChatGPT alternative, local AI, private AI, conversational AI, no-subscription fee, large language model, Open Interpreter integration"/>
<meta property="og:title" content="Open Interpreter"/>
<meta property="og:description" content="A step-by-step guide on how to integrate Jan with Open Interpreter. Learn how to install Open Interpreter, configure Jan's local API server, and set up the Open Interpreter environment for seamless interaction with Jan."/>
<meta property="og:url" content="https://jan.ai/guides/integration/open-interpreter"/>
<meta name="twitter:card" content="summary"/>
<meta name="twitter:title" content="Open Interpreter"/>
<meta name="twitter:description" content="A step-by-step guide on how to integrate Jan with Open Interpreter. Learn how to install Open Interpreter, configure Jan's local API server, and set up the Open Interpreter environment for seamless interaction with Jan."/>
</head>
## Integrate Open Interpreter with Jan

View File

@ -18,6 +18,17 @@ keywords:
description: A step-by-step guide on how to integrate Jan with Raycast.
---
<head>
<title>Raycast</title>
<meta name="description" content="A step-by-step guide on how to integrate Jan with Raycast. Learn how to download the TinyLlama model, clone and run the program, and use Jan models in Raycast for enhanced productivity."/>
<meta name="keywords" content="Jan AI, Jan, ChatGPT alternative, local AI, private AI, conversational AI, no-subscription fee, large language model, Raycast integration"/>
<meta property="og:title" content="Raycast"/>
<meta property="og:description" content="A step-by-step guide on how to integrate Jan with Raycast. Learn how to download the TinyLlama model, clone and run the program, and use Jan models in Raycast for enhanced productivity."/>
<meta property="og:url" content="https://jan.ai/guides/integration/raycast"/>
<meta name="twitter:card" content="summary"/>
<meta name="twitter:title" content="Raycast"/>
<meta name="twitter:description" content="A step-by-step guide on how to integrate Jan with Raycast. Learn how to download the TinyLlama model, clone and run the program, and use Jan models in Raycast for enhanced productivity."/>
</head>
## Integrate Raycast with Jan
[Raycast](https://www.raycast.com/) is a productivity tool designed for macOS that enhances workflow efficiency by providing quick access to various tasks and functionalities through a keyboard-driven interface. To integrate Raycast with Jan, follow the steps below:

View File

@ -18,6 +18,17 @@ keywords:
]
---
<head>
<title>OpenRouter</title>
<meta name="description" content="A step-by-step guide on how to integrate Jan with OpenRouter. Learn how to configure the OpenRouter API key, set up model configuration, and start using remote Large Language Models (LLMs) through OpenRouter with Jan."/>
<meta name="keywords" content="Jan AI, Jan, ChatGPT alternative, local AI, private AI, conversational AI, no-subscription fee, large language model, OpenRouter integration"/>
<meta property="og:title" content="OpenRouter"/>
<meta property="og:description" content="A step-by-step guide on how to integrate Jan with OpenRouter. Learn how to configure the OpenRouter API key, set up model configuration, and start using remote Large Language Models (LLMs) through OpenRouter with Jan."/>
<meta property="og:url" content="https://jan.ai/guides/integration/openrouter"/>
<meta name="twitter:card" content="summary"/>
<meta name="twitter:title" content="OpenRouter"/>
<meta name="twitter:description" content="A step-by-step guide on how to integrate Jan with OpenRouter. Learn how to configure the OpenRouter API key, set up model configuration, and start using remote Large Language Models (LLMs) through OpenRouter with Jan."/>
</head>
## Integrate OpenRouter with Jan

View File

@ -17,6 +17,18 @@ keywords:
]
---
<head>
<title>Groq</title>
<meta name="description" content="Learn how to integrate Groq API with Jan for enhanced functionality. Follow step-by-step instructions to obtain Groq API credentials, configure Jan settings, enable Groq integration, and troubleshoot any issues."/>
<meta name="keywords" content="Groq API, Jan, Jan AI, ChatGPT alternative, conversational AI, large language model, integration, Groq integration, API integration"/>
<meta property="og:title" content="Groq"/>
<meta property="og:description" content="Learn how to integrate Groq API with Jan for enhanced functionality. Follow step-by-step instructions to obtain Groq API credentials, configure Jan settings, enable Groq integration, and troubleshoot any issues."/>
<meta property="og:url" content="https://jan.ai/guides/integration/groq"/>
<meta name="twitter:card" content="summary"/>
<meta name="twitter:title" content="Groq"/>
<meta name="twitter:description" content="Learn how to integrate Groq API with Jan for enhanced functionality. Follow step-by-step instructions to obtain Groq API credentials, configure Jan settings, enable Groq integration, and troubleshoot any issues."/>
</head>
## How to Integrate Mistral AI with Jan
This guide provides step-by-step instructions on integrating the Groq API with Jan, enabling users to leverage Groq's capabilities within Jan's conversational interface.

View File

@ -17,6 +17,18 @@ keywords:
]
---
<head>
<title>Mistral AI</title>
<meta name="description" content="A step-by-step guide on how to integrate Jan with Mistral AI. Learn how to configure Mistral API keys, set up model configuration, and start the model in Jan for enhanced functionality."/>
<meta name="keywords" content="Jan AI, Jan, ChatGPT alternative, local AI, private AI, conversational AI, no-subscription fee, large language model, Mistral integration"/>
<meta property="og:title" content="Mistral AI"/>
<meta property="og:description" content="A step-by-step guide on how to integrate Jan with Mistral AI. Learn how to configure Mistral API keys, set up model configuration, and start the model in Jan for enhanced functionality."/>
<meta property="og:url" content="https://jan.ai/guides/integration/mistral-ai"/>
<meta name="twitter:card" content="summary"/>
<meta name="twitter:title" content="Mistral AI"/>
<meta name="twitter:description" content="A step-by-step guide on how to integrate Jan with Mistral AI. Learn how to configure Mistral API keys, set up model configuration, and start the model in Jan for enhanced functionality."/>
</head>
## How to Integrate Mistral AI with Jan
[Mistral AI](https://docs.mistral.ai/) provides two ways to use their Large Language Models (LLM):

View File

@ -19,6 +19,18 @@ keywords:
]
---
<head>
<title>Remote Server Integration</title>
<meta name="description" content="A step-by-step guide on how to set up Jan to connect with any remote or local API server. Learn how to configure Jan as a client to connect with OpenAI Platform or any OpenAI-compatible endpoint, and how to start models using Jan's Hub."/>
<meta name="keywords" content="Jan AI, Jan, ChatGPT alternative, local AI, private AI, conversational AI, no-subscription fee, large language model, import-models-manually, remote server, OAI compatible"/>
<meta property="og:title" content="Remote Server Integration"/>
<meta property="og:description" content="A step-by-step guide on how to set up Jan to connect with any remote or local API server. Learn how to configure Jan as a client to connect with OpenAI Platform or any OpenAI-compatible endpoint, and how to start models using Jan's Hub."/>
<meta property="og:url" content="https://jan.ai/guides/remote-server-integration"/>
<meta name="twitter:card" content="summary"/>
<meta name="twitter:title" content="Remote Server Integration"/>
<meta name="twitter:description" content="A step-by-step guide on how to set up Jan to connect with any remote or local API server. Learn how to configure Jan as a client to connect with OpenAI Platform or any OpenAI-compatible endpoint, and how to start models using Jan's Hub."/>
</head>
This guide will show you how to configure Jan as a client and point it to any remote & local (self-hosted) API server.
## OpenAI Platform Configuration

View File

@ -21,6 +21,20 @@ keywords:
]
---
<head>
<title>Advanced Settings</title>
<meta name="description" content="This guide will show you how to use the advanced settings in Jan. Learn about keyboard shortcuts, experimental mode, GPU acceleration, Jan data folder access, HTTPS proxy configuration, SSL certificate handling, log clearing, and resetting to factory default settings."/>
<meta name="keywords" content="Jan AI, Jan, ChatGPT alternative, local AI, private AI, conversational AI, no-subscription fee, large language model, advanced-settings"/>
<meta property="og:title" content="Advanced Settings"/>
<meta property="og:description" content="This guide will show you how to use the advanced settings in Jan. Learn about keyboard shortcuts, experimental mode, GPU acceleration, Jan data folder access, HTTPS proxy configuration, SSL certificate handling, log clearing, and resetting to factory default settings."/>
<meta property="og:image" content="https://jan.ai/img/advanced-settings.png"/>
<meta property="og:url" content="https://jan.ai/advanced-settings"/>
<meta name="twitter:card" content="summary_large_image"/>
<meta name="twitter:title" content="Advanced Settings"/>
<meta name="twitter:description" content="This guide will show you how to use the advanced settings in Jan. Learn about keyboard shortcuts, experimental mode, GPU acceleration, Jan data folder access, HTTPS proxy configuration, SSL certificate handling, log clearing, and resetting to factory default settings."/>
<meta name="twitter:image" content="https://jan.ai/img/advanced-settings.png"/>
</head>
import Tabs from '@theme/Tabs';
import TabItem from '@theme/TabItem';

View File

@ -1,12 +1,36 @@
---
title: Hardware Examples
description: Jan is a ChatGPT-alternative that runs on your own computer, with a local API server.
keywords: [Jan AI, Jan, ChatGPT alternative, local AI, private AI, conversational AI, no-subscription fee, large language model ]
keywords:
[
Jan AI,
Jan,
ChatGPT alternative,
local AI,
private AI,
conversational AI,
no-subscription fee,
large language model,
]
---
<head>
<title>Hardware Examples</title>
<meta charset="utf-8" />
<meta name="description" content="Jan is a ChatGPT-alternative that runs on your own computer, with a local API server. Add your own hardware examples to this page by creating a new file in the `docs/docs/hardware/examples` directory." />
<meta name="keywords" content="Jan AI, Jan, ChatGPT alternative, local AI, private AI, conversational AI, no-subscription fee, large language model" />
<meta name="twitter:card" content="summary" />
<link rel="canonical" href="https://jan.ai/guides/hardware-examples" />
<meta property="og:title" content="Hardware Examples" />
<meta property="og:description" content="Jan is a ChatGPT-alternative that runs on your own computer, with a local API server. Add your own hardware examples to this page by creating a new file in the `docs/docs/hardware/examples` directory." />
<meta property="og:url" content="https://jan.ai/guides/hardware-examples" />
<meta property="og:type" content="article" />
<meta property="og:image" content="https://jan.ai/img/og-image-hardware-examples.png" />
</head>
## Add your own example
Add your own examples to this page by creating a new file in the `docs/docs/hardware/examples` directory.
Add your own examples to this page by creating a new file in the `docs/docs/hardware/examples` directory.
```shell
docs
@ -18,9 +42,10 @@ docs
// highlight-next-line
└── <YOUR_BUILD_HERE>.md
```
### File and Title Convention
We use a specific naming convention for the file name.
We use a specific naming convention for the file name.
```shell
# Filename
@ -52,4 +77,4 @@ You are allowed to include affiliate links in your example.
## Longer-Term
We will likely build a simple web app to make it easier to add your own examples, sort and retrieve.
We will likely build a simple web app to make it easier to add your own examples, sort and retrieve.

View File

@ -2,6 +2,20 @@
title: GPUs and VRAM
---
<head>
<title>Understanding GPUs and VRAM for AI and Gaming</title>
<meta charSet="utf-8" />
<meta name="description" content="Explore the world of GPUs and VRAM, learn their importance in gaming, AI, machine learning, and more. Understand how to connect a GPU to a motherboard and choose the right graphics card for your needs." />
<meta name="keywords" content="GPU, VRAM, graphics card, gaming, AI, machine learning, CUDA, NVIDIA, AMD, PCIe, VRAM vs RAM, choosing GPU" />
<meta name="twitter:card" content="summary" />
<link rel="canonical" href="https://jan.ai/guides/gpus-and-vram" />
<meta property="og:title" content="Understanding GPUs and VRAM for AI and Gaming" />
<meta property="og:description" content="Explore the world of GPUs and VRAM, learn their importance in gaming, AI, machine learning, and more. Understand how to connect a GPU to a motherboard and choose the right graphics card for your needs." />
<meta property="og:url" content="https://jan.ai/guides/gpus-and-vram" />
<meta property="og:type" content="article" />
<meta property="og:image" content="https://jan.ai/img/og-image.png" />
</head>
## What Is a GPU?
A Graphics Card, or GPU (Graphics Processing Unit), is a fundamental component in modern computing. Think of it as the powerhouse behind rendering the stunning visuals you see on your screen. Similar to the motherboard in your computer, the graphics card is a printed circuit board. However, it's not just a passive piece of hardware; it's a sophisticated device equipped with essential components like fans, onboard RAM, a dedicated memory controller, BIOS, and various other features. If you want to learn more about GPUs then read here to [Understand the architecture of a GPU.](https://medium.com/codex/understanding-the-architecture-of-a-gpu-d5d2d2e8978b)

View File

@ -2,6 +2,18 @@
title: Cloud vs. Self-hosting Your AI
---
<head>
<title>Cloud vs. Self-hosting Your AI</title>
<meta name="description" content="Explore the pros and cons of renting AI services from the cloud versus self-hosting, including cost comparisons, business considerations, and conclusions about the best approach for different scenarios."/>
<meta name="keywords" content="Cloud AI, Self-hosted AI, AI cost comparison, AI business considerations, AI deployment, cloud vs self-hosting AI"/>
<meta property="og:title" content="Cloud vs. Self-hosting Your AI"/>
<meta property="og:description" content="Explore the pros and cons of renting AI services from the cloud versus self-hosting, including cost comparisons, business considerations, and conclusions about the best approach for different scenarios."/>
<meta property="og:url" content="https://jan.ai/articles/cloud-vs-self-hosting-your-ai"/>
<meta name="twitter:card" content="summary"/>
<meta name="twitter:title" content="Cloud vs. Self-hosting Your AI"/>
<meta name="twitter:description" content="Explore the pros and cons of renting AI services from the cloud versus self-hosting, including cost comparisons, business considerations, and conclusions about the best approach for different scenarios."/>
</head>
The choice of how to run your AI - on GPU cloud services, on-prem, or just using an API provider - involves various trade-offs. The following is a naive exploration of the pros and cons of renting vs self-hosting.
## Cost Comparison

View File

@ -2,6 +2,20 @@
title: GPU vs CPU What's the Difference?
---
<head>
<title>GPU vs CPU What's the Difference?</title>
<meta name="description" content="Explore the differences between CPU and GPU in terms of function, processing, design, and best-suited applications."/>
<meta name="keywords" content="CPU, GPU, CPU vs GPU, Central Processing Unit, Graphics Processing Unit, CPU vs GPU differences"/>
<meta property="og:title" content="GPU vs CPU What's the Difference?"/>
<meta property="og:description" content="Explore the differences between CPU and GPU in terms of function, processing, design, and best-suited applications."/>
<meta property="og:image" content="https://media.discordapp.net/attachments/964896173401976932/1157998193741660222/CPU-vs-GPU-rendering.png?ex=651aa55b&is=651953db&hm=a22c80ed108a0d25106a20aa25236f7d0fa74167a50788194470f57ce7f4a6ca&=&width=807&height=426"/>
<meta property="og:url" content="https://jan.ai/articles/gpu-vs-cpu-differences"/>
<meta name="twitter:card" content="summary_large_image"/>
<meta name="twitter:title" content="GPU vs CPU What's the Difference?"/>
<meta name="twitter:description" content="Explore the differences between CPU and GPU in terms of function, processing, design, and best-suited applications."/>
<meta name="twitter:image" content="https://media.discordapp.net/attachments/964896173401976932/1157998193741660222/CPU-vs-GPU-rendering.png?ex=651aa55b&is=651953db&hm=a22c80ed108a0d25106a20aa25236f7d0fa74167a50788194470f57ce7f4a6ca&=&width=807&height=426"/>
</head>
## CPU vs. GPU
| | CPU | GPU |

View File

@ -2,6 +2,20 @@
title: Recommended AI Hardware by Budget
---
<head>
<title>Recommended AI Hardware Builds by Budget</title>
<meta charSet="utf-8" />
<meta name="description" content="Explore recommended AI hardware builds for entry-level, mid-range, and high-end budgets. Find the perfect balance of performance and cost for your AI and machine learning projects." />
<meta name="keywords" content="AI hardware, budget PC build, entry-level AI PC, mid-range AI PC, high-end AI PC, GPU for AI, AI PC build, machine learning hardware" />
<meta name="twitter:card" content="summary" />
<link rel="canonical" href="https://jan.ai/guides/recommended-ai-hardware-by-budget" />
<meta property="og:title" content="Recommended AI Hardware Builds by Budget" />
<meta property="og:description" content="Explore recommended AI hardware builds for entry-level, mid-range, and high-end budgets. Find the perfect balance of performance and cost for your AI and machine learning projects." />
<meta property="og:url" content="https://jan.ai/guides/recommended-ai-hardware-by-budget" />
<meta property="og:type" content="article" />
<meta property="og:image" content="https://jan.ai/img/og-image.png" />
</head>
> :warning: **Warning:** Do your own research before any purchase. Jan is not liable for compatibility, performance or other issues. Products can become outdated quickly.
## Entry-level PC Build at $1000

View File

@ -2,6 +2,20 @@
title: Selecting AI Hardware
---
<head>
<title>Selecting AI Hardware</title>
<meta charset="utf-8" />
<meta name="description" content="Guidance on selecting optimal AI hardware, including GPUs, CPUs, RAM, and motherboards for running Large Language Models (LLMs) efficiently. Explore factors like VRAM, CUDA compatibility, and unified memory architecture to build a powerful AI setup." />
<meta name="keywords" content="AI hardware, GPU for LLM, CPU for AI, RAM for machine learning, motherboard for AI, CUDA, VRAM, Unified Memory Architecture, M1, M2 Pro/Max, VRAM calculation" />
<meta name="twitter:card" content="summary" />
<link rel="canonical" href="https://jan.ai/guides/selecting-ai-hardware" />
<meta property="og:title" content="Selecting AI Hardware" />
<meta property="og:description" content="Guidance on selecting optimal AI hardware, including GPUs, CPUs, RAM, and motherboards for running Large Language Models (LLMs) efficiently. Explore factors like VRAM, CUDA compatibility, and unified memory architecture to build a powerful AI setup." />
<meta property="og:url" content="https://jan.ai/guides/selecting-ai-hardware" />
<meta property="og:type" content="article" />
<meta property="og:image" content="https://jan.ai/img/og-image-ai-hardware.png" />
</head>
When selecting a GPU for LLMs, remember that it's not just about the GPU itself. Consider the synergy with other components in your PC:
- **CPU**: To ensure efficient processing, pair your GPU with a powerful CPU. LLMs benefit from fast processors, so having a capable CPU is essential.

View File

@ -2,6 +2,20 @@
title: Recommended AI Hardware by Model
---
<head>
<title>Recommended AI Hardware by Model</title>
<meta charset="utf-8" />
<meta name="description" content="Explore the recommended AI hardware specifications for running Codellama models efficiently. Find RAM and VRAM requirements for different parameter sizes and quantization formats, along with minimum recommended GPUs." />
<meta name="keywords" content="Codellama, AI hardware, recommended hardware, system requirements, RAM requirements, VRAM requirements, GPU recommendations, GPTQ, GGML, GGUF, parameter models, quantization formats" />
<meta name="twitter:card" content="summary" />
<link rel="canonical" href="https://jan.ai/recommended-ai-hardware-by-model" />
<meta property="og:title" content="Recommended AI Hardware by Model" />
<meta property="og:description" content="Explore the recommended AI hardware specifications for running Codellama models efficiently. Find RAM and VRAM requirements for different parameter sizes and quantization formats, along with minimum recommended GPUs." />
<meta property="og:url" content="https://jan.ai/recommended-ai-hardware-by-model" />
<meta property="og:type" content="article" />
<meta property="og:image" content="https://jan.ai/img/og-image-recommended-hardware.png" />
</head>
## Codellama 34b
### System Requirements:

View File

@ -2,6 +2,20 @@
title: Recommended AI Hardware by Use Case
---
<head>
<title>Recommended AI Hardware by Model</title>
<meta charset="utf-8" />
<meta name="description" content="Explore hardware requirements for running Codellama 34b models effectively. Find system, RAM, and VRAM requirements along with GPU recommendations tailored for optimal performance or budget-friendly setups." />
<meta name="keywords" content="AI hardware, Codellama 34b, system requirements, RAM requirements, VRAM requirements, GPU recommendations, optimal performance, budget-friendly setup" />
<meta name="twitter:card" content="summary" />
<link rel="canonical" href="https://jan.ai/guides/recommended-ai-hardware-by-model" />
<meta property="og:title" content="Recommended AI Hardware by Model" />
<meta property="og:description" content="Explore hardware requirements for running Codellama 34b models effectively. Find system, RAM, and VRAM requirements along with GPU recommendations tailored for optimal performance or budget-friendly setups." />
<meta property="og:url" content="https://jan.ai/guides/recommended-ai-hardware-by-model" />
<meta property="og:type" content="article" />
<meta property="og:image" content="https://jan.ai/img/og-image-ai-hardware-model.png" />
</head>
## Which AI Hardware to Choose Based on Your Use Case
Artificial intelligence (AI) is rapidly changing the world, and AI hardware is becoming increasingly important for businesses and individuals alike. Choosing the right hardware for your AI needs is crucial to get the best performance and results. Here are some tips for selecting AI hardware based on your specific use case and requirements.

View File

@ -2,6 +2,18 @@
title: How We Work
---
<head>
<title>How We Work - Jan</title>
<meta name="description" content="Learn about how Jan operates as an open-source startup, building in public, with a remote team. Explore Jan's GitHub repositories, Kanban board, and roadmap."/>
<meta name="keywords" content="Jan AI, Jan, open source, build in public, GitHub, remote team, Discord, roadmap, Kanban"/>
<meta property="og:title" content="How We Work - Jan"/>
<meta property="og:description" content="Learn about how Jan operates as an open-source startup, building in public, with a remote team. Explore Jan's GitHub repositories, Kanban board, and roadmap."/>
<meta property="og:url" content="https://jan.ai/how-we-work"/>
<meta name="twitter:card" content="summary"/>
<meta name="twitter:title" content="How We Work - Jan"/>
<meta name="twitter:description" content="Learn about how Jan operates as an open-source startup, building in public, with a remote team. Explore Jan's GitHub repositories, Kanban board, and roadmap."/>
</head>
### Open Source
Jan is a startup with an open source business model. We believe in the need for an open source AI ecosystem, and are committed to building it.

View File

@ -2,6 +2,18 @@
title: Analytics
---
<head>
<title>Analytics</title>
<meta name="description" content="Learn about the analytics philosophy for Jan, focusing on privacy preservation and collecting minimal data for essential functionality."/>
<meta name="keywords" content="analytics, privacy-preserving, Umami, data collection, GDPR compliance"/>
<meta property="og:title" content="Analytics"/>
<meta property="og:description" content="Learn about the analytics philosophy for Jan, focusing on privacy preservation and collecting minimal data for essential functionality."/>
<meta property="og:url" content="https://jan.ai/analytics"/>
<meta name="twitter:card" content="summary"/>
<meta name="twitter:title" content="Analytics"/>
<meta name="twitter:description" content="Learn about the analytics philosophy for Jan, focusing on privacy preservation and collecting minimal data for essential functionality."/>
</head>
Adhering to Jan's privacy preserving philosophy, our analytics philosophy is to get "barely-enough-to-function'.
#### What is tracked

View File

@ -15,6 +15,18 @@ keywords:
]
---
<head>
<title>QA</title>
<meta name="description" content="Jan is a ChatGPT-alternative that runs on your own computer, with a local API server. Learn about the QA process for engineering and development phases."/>
<meta name="keywords" content="Jan AI, Jan, ChatGPT alternative, local AI, private AI, conversational AI, no-subscription fee, large language model, QA, quality assurance, engineering, development"/>
<meta property="og:title" content="QA"/>
<meta property="og:description" content="Jan is a ChatGPT-alternative that runs on your own computer, with a local API server. Learn about the QA process for engineering and development phases."/>
<meta property="og:url" content="https://jan.ai/engineering/qa"/>
<meta name="twitter:card" content="summary"/>
<meta name="twitter:title" content="QA"/>
<meta name="twitter:description" content="Jan is a ChatGPT-alternative that runs on your own computer, with a local API server. Learn about the QA process for engineering and development phases."/>
</head>
### Phase 1: Planning
#### Definition of Ready (DoR):

View File

@ -2,6 +2,18 @@
title: Project Management
---
<head>
<title>Project Management</title>
<meta name="description" content="Learn about Jan's project management approach, including roadmap management, organization of epics and tasks, and Kanban board usage."/>
<meta name="keywords" content="Jan AI, project management, roadmap, epics, tasks, Kanban board"/>
<meta property="og:title" content="Project Management"/>
<meta property="og:description" content="Learn about Jan's project management approach, including roadmap management, organization of epics and tasks, and Kanban board usage."/>
<meta property="og:url" content="https://jan.ai/project-management"/>
<meta name="twitter:card" content="summary"/>
<meta name="twitter:title" content="Project Management"/>
<meta name="twitter:description" content="Learn about Jan's project management approach, including roadmap management, organization of epics and tasks, and Kanban board usage."/>
</head>
We use the [Jan Monorepo Project](https://github.com/orgs/janhq/projects/5) in Github to manage our roadmap and sprint Kanbans.
As much as possible, everyone owns their respective `epics` and `tasks`.
@ -58,7 +70,6 @@ We aim to always sprint on `tasks` that are a part of the [current roadmap](http
- `Urgent bugs`: assign to an owner (or @engineers if you are not sure) && tag the current `sprint` & `milestone`
- `All else`: assign the correct roadmap `label(s)` and owner (if any)
#### Request for help
As a result, our feature prioritization can feel a bit black box at times.

View File

@ -2,7 +2,20 @@
title: Strategy
---
<head>
<title>Strategy</title>
<meta name="description" content="Learn about Jan's strategy, ideal customer, problems it solves, and solutions provided."/>
<meta name="keywords" content="Jan AI, Jan, AI enthusiast, business, open source alternatives, control, stability, privacy, customisability"/>
<meta property="og:title" content="Strategy"/>
<meta property="og:description" content="Learn about Jan's strategy, ideal customer, problems it solves, and solutions provided."/>
<meta property="og:url" content="https://jan.ai/strategy"/>
<meta name="twitter:card" content="summary"/>
<meta name="twitter:title" content="Strategy"/>
<meta name="twitter:description" content="Learn about Jan's strategy, ideal customer, problems it solves, and solutions provided."/>
</head>
We only have 2 planning parameters:
- 10 year vision
- 2 week sprint
- Quarterly OKRs
@ -46,7 +59,6 @@ Jan is a seamless user experience that runs on your personal computer, that glue
- We run on top of a local folder of non-proprietary files, that anyone can tinker with (yes, even other apps!)
- We provide open formats for packaging and distributing AI to run reproducibly across devices
## Prerequisites
- [Figma](https://figma.com)

View File

@ -2,6 +2,18 @@
title: Website & Docs
---
<head>
<title>Website & Docs</title>
<meta name="description" content="Learn about the website architecture and documentation structure for Jan, including information on how to contribute, prerequisites, installation, deployment, and additional plugins."/>
<meta name="keywords" content="Jan AI, website, documentation, Docusaurus, contribution guide, installation, deployment, plugins"/>
<meta property="og:title" content="Website & Docs"/>
<meta property="og:description" content="Learn about the website architecture and documentation structure for Jan, including information on how to contribute, prerequisites, installation, deployment, and additional plugins."/>
<meta property="og:url" content="https://jan.ai/website-docs"/>
<meta name="twitter:card" content="summary"/>
<meta name="twitter:title" content="Website & Docs"/>
<meta name="twitter:description" content="Learn about the website architecture and documentation structure for Jan, including information on how to contribute, prerequisites, installation, deployment, and additional plugins."/>
</head>
This website is built using [Docusaurus 3.0](https://docusaurus.io/), a modern static website generator.
### Information Architecture

View File

@ -15,6 +15,18 @@ keywords:
]
---
<head>
<title>Jan Desktop</title>
<meta name="description" content="Turn any computer into an AI computer with Jan Desktop. Run AI models directly on your laptop without an internet connection. Enjoy private conversations and customize your AI experience."/>
<meta name="keywords" content="Jan AI, Jan, ChatGPT alternative, local AI, private AI, conversational AI, desktop app, AI models, offline AI"/>
<meta property="og:title" content="Jan Desktop"/>
<meta property="og:description" content="Turn any computer into an AI computer with Jan Desktop. Run AI models directly on your laptop without an internet connection. Enjoy private conversations and customize your AI experience."/>
<meta property="og:url" content="https://jan.ai/desktop"/>
<meta name="twitter:card" content="summary"/>
<meta name="twitter:title" content="Jan Desktop"/>
<meta name="twitter:description" content="Turn any computer into an AI computer with Jan Desktop. Run AI models directly on your laptop without an internet connection. Enjoy private conversations and customize your AI experience."/>
</head>
# Turn any computer into an AI computer
![Alt text](image.png)

View File

@ -1,3 +1,21 @@
---
title: Privacy - Jan
---
<head>
<title>Privacy Policy - Jan</title>
<meta charset="utf-8" />
<meta name="description" content="Learn about Jan's commitment to privacy and how your personal information is handled when using our mobile application. Understand our data collection, sharing, and security measures." />
<meta name="keywords" content="Jan AI, Jan, privacy policy, data collection, data usage, data sharing, data security, user choices, contact us" />
<meta name="twitter:card" content="summary" />
<link rel="canonical" href="https://jan.ai/privacy-policy" />
<meta property="og:title" content="Privacy Policy - Jan" />
<meta property="og:description" content="Learn about Jan's commitment to privacy and how your personal information is handled when using our mobile application. Understand our data collection, sharing, and security measures." />
<meta property="og:url" content="https://jan.ai/privacy-policy" />
<meta property="og:type" content="article" />
<meta property="og:image" content="https://jan.ai/img/og-image-privacy-policy.png" />
</head>
# Privacy Policy
Jan is committed to protecting your privacy and ensuring that your personal information is handled in a safe and responsible way. This policy outlines how we collect, store, and use your personal information when you use our mobile application.

View File

@ -15,6 +15,18 @@ keywords:
]
---
<head>
<title>Jan Enterprise</title>
<meta name="description" content="Jan Enterprise is built for enterprise deployments, allowing organizations to customize and run AI at scale across their infrastructure. Own your AI, data, and IP with Jan Enterprise."/>
<meta name="keywords" content="Jan AI, Jan, ChatGPT alternative, local AI, private AI, conversational AI, enterprise AI, on-prem AI, datacenter AI"/>
<meta property="og:title" content="Jan Enterprise"/>
<meta property="og:description" content="Jan Enterprise is built for enterprise deployments, allowing organizations to customize and run AI at scale across their infrastructure. Own your AI, data, and IP with Jan Enterprise."/>
<meta property="og:url" content="https://jan.ai/enterprise"/>
<meta name="twitter:card" content="summary"/>
<meta name="twitter:title" content="Jan Enterprise"/>
<meta name="twitter:description" content="Jan Enterprise is built for enterprise deployments, allowing organizations to customize and run AI at scale across their infrastructure. Own your AI, data, and IP with Jan Enterprise."/>
</head>
# Customize and run AI across your organization
Jan can professional backend to create, customize and run AIs at scale, for production-grade data centers.

View File

@ -15,6 +15,18 @@ keywords:
]
---
<head>
<title>Jan Home Server</title>
<meta name="description" content="Jan Home Server is built for home server deployments, allowing individuals to customize and run AI across all their devices. Self-host Jan, access it from anywhere, and collaborate with others using Jan Server Suite."/>
<meta name="keywords" content="Jan AI, Jan, ChatGPT alternative, local AI, private AI, conversational AI, home server, self-hosted AI, personal AI"/>
<meta property="og:title" content="Jan Home Server"/>
<meta property="og:description" content="Jan Home Server is built for home server deployments, allowing individuals to customize and run AI across all their devices. Self-host Jan, access it from anywhere, and collaborate with others using Jan Server Suite."/>
<meta property="og:url" content="https://jan.ai/home-server"/>
<meta name="twitter:card" content="summary"/>
<meta name="twitter:title" content="Jan Home Server"/>
<meta name="twitter:description" content="Jan Home Server is built for home server deployments, allowing individuals to customize and run AI across all their devices. Self-host Jan, access it from anywhere, and collaborate with others using Jan Server Suite."/>
</head>
# Customize and run AI across all of your devices
Self-host and access your AI from anywhere with Jan server suite.

View File

@ -1,3 +1,21 @@
---
title: Support - Jan
---
<head>
<title>Support - Jan</title>
<meta charset="utf-8" />
<meta name="description" content="Find support options for Jan, including bug reporting, discussion forums, business inquiries, and job applications. Connect with us through GitHub, Discord, or email." />
<meta name="keywords" content="Jan AI, Jan, support, bug reporting, GitHub, Discord, business inquiries, job applications, contact us" />
<meta name="twitter:card" content="summary" />
<link rel="canonical" href="https://jan.ai/support" />
<meta property="og:title" content="Support - Jan" />
<meta property="og:description" content="Find support options for Jan, including bug reporting, discussion forums, business inquiries, and job applications. Connect with us through GitHub, Discord, or email." />
<meta property="og:url" content="https://jan.ai/support" />
<meta property="og:type" content="article" />
<meta property="og:image" content="https://jan.ai/img/og-image-support.png" />
</head>
# Support
- Bugs & requests: file a GitHub ticket [here](https://github.com/janhq/jan/issues)

View File

@ -2,6 +2,18 @@
title: Who we are
---
<head>
<title>Who we are - Jan</title>
<meta name="description" content="Learn about Jan, a company aiming to build the cognitive framework for future robots. We are an open source startup with a commitment to the open source AI ecosystem. Jan is currently a bootstrapped startup seeking a sustainable business model. Join us on our journey to find product-market fit."/>
<meta name="keywords" content="Jan AI, Jan, open source, startup, cognitive framework, future robots, bootstrapped, PMF, sustainable business model"/>
<meta property="og:title" content="Who we are - Jan"/>
<meta property="og:description" content="Learn about Jan, a company aiming to build the cognitive framework for future robots. We are an open source startup with a commitment to the open source AI ecosystem. Jan is currently a bootstrapped startup seeking a sustainable business model. Join us on our journey to find product-market fit."/>
<meta property="og:url" content="https://jan.ai/who-we-are"/>
<meta name="twitter:card" content="summary"/>
<meta name="twitter:title" content="Who we are - Jan"/>
<meta name="twitter:description" content="Learn about Jan, a company aiming to build the cognitive framework for future robots. We are an open source startup with a commitment to the open source AI ecosystem. Jan is currently a bootstrapped startup seeking a sustainable business model. Join us on our journey to find product-market fit."/>
</head>
What's Jan the company about?
We aim to build the cognitive framework for future robots
@ -13,7 +25,6 @@ Jan is a startup with an open source business model. We believe in the need for
- [Jan Desktop Client & Local server](https://jan.ai) (AGPLv3, built on Jan Framework)
- [Nitro: run Local AI](https://github.com/janhq/nitro) (AGPLv3)
### Bootstrapped
Jan is currently a bootstrapped startup.
@ -25,4 +36,4 @@ We balance technical invention with the search for a sustainable business model.
## Our Team
- Contributors
- Core Team
- Core Team

View File

@ -26,7 +26,6 @@
- [ ] :key::warning: Check that the uninstallation process removes the app successfully from the system.
- [ ] Clean the Jan root directory and open the app to check if it creates all the necessary folders, especially models and extensions.
## B. Overview
### 1. Shortcut key, memory usage / CPU usage
@ -71,10 +70,12 @@
- [ ] :key: Ensure that users switch between threads with different models, the app can handle it.
### 3. Model dropdown
- [ ] :key: Model list should highlight recommended based on user RAM
- [ ] Model size should display (for both installed and imported models)
### 4. Users can click on a history thread
- [ ] Confirm that the chat window displays the entire conversation from the selected history thread without any missing messages.
- [ ] :key: Check the performance and accuracy of the history feature when dealing with a large number of threads.
- [ ] Validate that historical threads reflect the exact state of the chat at that time, including settings.
@ -82,12 +83,12 @@
- [ ] Confirm that changing the title of the thread updates correctly.
### 5. Users can config instructions for the assistant.
- [ ] Test if the instructions set by the user are being followed by the assistant in subsequent conversations.
- [ ] :key: Validate that changes to instructions are updated in real time and do not require a restart of the application or session.
- [ ] :key: Check for the ability to reset instructions to default or clear them completely.
- [ ] :key: RAG - Users can import documents and the system should process queries about the uploaded file, providing accurate and appropriate responses in the conversation thread.
## D. Hub
### 1. Users can discover recommended models (Jan ships with a few preconfigured model.json files)
@ -117,13 +118,14 @@
### 5. Users can use the model as they want
- [ ] :key: Check `start` / `stop` / `delete` button response exactly what it does.
- [ ] :key: Check `start` / `stop` / `delete` button response exactly what it does.
- [ ] Check if starting another model stops the other model entirely.
- [x] :rocket: Check the `Explore models` navigate correctly to the model panel.
- [ ] :key: Check when deleting a model it will delete all the files on the user's computer.
- [ ] :warning:The recommended tags should present right for the user's hardware.
### 6. Users can Integrate With a Remote Server
- [ ] :key: Import openAI GPT model https://jan.ai/guides/using-models/integrate-with-remote-server/ and the model displayed in Hub / Thread dropdown
- [ ] Users can use the remote model properly
@ -184,9 +186,10 @@
## G. Local API server
### 1. Local Server Usage with Server Options
- [ ] :key: Explore API Reference: Swagger API for sending/receiving requests
- [ ] Use default server option
- [ ] Configure and use custom server options
- [ ] Use default server option
- [ ] Configure and use custom server options
- [ ] Test starting/stopping the local API server with different Model/Model settings
- [ ] Server logs captured with correct Server Options provided
- [ ] Verify functionality of Open logs/Clear feature

View File

@ -2,6 +2,18 @@
title: Wall of Love ❤️
---
<head>
<title>Wall of Love ❤️ - Jan</title>
<meta name="description" content="See what users are saying about Jan on Twitter and watch amazing videos demonstrating the use of Jan by the community. Share your love for Jan on Twitter and tag us @janframework!"/>
<meta name="keywords" content="Jan AI, Jan, testimonials, Twitter, YouTube, community, feedback, videos"/>
<meta property="og:title" content="Wall of Love ❤️ - Jan"/>
<meta property="og:description" content="See what users are saying about Jan on Twitter and watch amazing videos demonstrating the use of Jan by the community. Share your love for Jan on Twitter and tag us @janframework!"/>
<meta property="og:url" content="https://jan.ai/wall-of-love"/>
<meta name="twitter:card" content="summary"/>
<meta name="twitter:title" content="Wall of Love ❤️ - Jan"/>
<meta name="twitter:description" content="See what users are saying about Jan on Twitter and watch amazing videos demonstrating the use of Jan by the community. Share your love for Jan on Twitter and tag us @janframework!"/>
</head>
## Twitter
Check out our amazing users and what they are saying about Jan!

View File

@ -222,8 +222,7 @@ const config = {
metadata: [
{
name: 'description',
content:
'Jan runs 100% offline on your computer, utilizes open-source AI models, prioritizes privacy, and is highly customizable.',
content: `Jan turns your computer into an AI machine by running LLMs locally on your computer. It's a privacy-focus, local-first, open-source solution.`,
},
{
name: 'keywords',
@ -233,12 +232,11 @@ const config = {
{ name: 'robots', content: 'index, follow' },
{
property: 'og:title',
content: 'Jan | Open-source ChatGPT Alternative',
content: 'Jan AI | Rethink the Computer',
},
{
property: 'og:description',
content:
'Jan runs 100% offline on your computer, utilizes open-source AI models, prioritizes privacy, and is highly customizable.',
content: `Jan turns your computer into an AI machine by running LLMs locally on your computer. It's a privacy-focus, local-first, open-source solution.`,
},
{
property: 'og:image',
@ -249,12 +247,11 @@ const config = {
{ property: 'twitter:site', content: '@janframework' },
{
property: 'twitter:title',
content: 'Jan | Open-source ChatGPT Alternative',
content: 'Jan AI | Rethink the Computer',
},
{
property: 'twitter:description',
content:
'Jan runs 100% offline on your computer, utilizes open-source AI models, prioritizes privacy, and is highly customizable.',
content: `Jan turns your computer into an AI machine by running LLMs locally on your computer. It's a privacy-focus, local-first, open-source solution.`,
},
{
property: 'twitter:image',
@ -280,8 +277,7 @@ const config = {
'@context': 'https://schema.org/',
'@type': 'localAI',
'name': 'Jan',
'description':
'Jan runs 100% offline on your computer, utilizes open-source AI models, prioritizes privacy, and is highly customizable.',
'description': `Jan turns your computer into an AI machine by running LLMs locally on your computer. It's a privacy-focus, local-first, open-source solution.`,
'keywords':
'Jan AI, Jan, ChatGPT alternative, local AI, private AI, conversational AI, no-subscription fee, large language model ',
'applicationCategory': 'BusinessApplication',
@ -338,10 +334,15 @@ const config = {
position: 'left',
label: 'Ecosystem',
},
{
to: 'download',
position: 'left',
label: 'Download',
},
// {
// type: "docSidebar",
// sidebarId: "pricingSidebar",
// positionL: "left",
// positionl: "left",
// label: "Pricing",
// },
// Navbar right
@ -403,6 +404,11 @@ const config = {
},
},
// Put your custom environment here
customFields: {
apiKeyBrevo: process.env.API_KEY_BREVO,
},
themes: ['@docusaurus/theme-live-codeblock', '@docusaurus/theme-mermaid'],
}

View File

@ -37,9 +37,12 @@
"postcss": "^8.4.30",
"posthog-docusaurus": "^2.0.0",
"prism-react-renderer": "^1.3.5",
"lucide-react": "^0.291.0",
"react": "^18.2.0",
"react-dom": "^18.2.0",
"react-hook-form": "^7.47.0",
"react-icons": "^4.11.0",
"react-tweet": "^3.2.0",
"redocusaurus": "^2.0.0",
"sass": "^1.69.3",
"tailwind-merge": "^2.1.0",
@ -47,7 +50,7 @@
},
"devDependencies": {
"@docusaurus/module-type-aliases": "^3.0.0",
"dotenv": "^16.3.1",
"dotenv": "^16.4.5",
"tailwindcss-animate": "^1.0.7"
},
"browserslist": {

View File

@ -1,32 +1,43 @@
import React from "react";
import React from 'react'
import { useAppStars } from "@site/src/hooks/useAppStars";
import { useAppRelease } from "@site/src/hooks/useAppRelease";
import { useAppStars } from '@site/src/hooks/useAppStars'
import { useAppRelease } from '@site/src/hooks/useAppRelease'
import { AiOutlineGithub, AiOutlineTwitter } from "react-icons/ai";
import { BiLogoDiscordAlt } from "react-icons/bi";
import { AiOutlineGithub, AiOutlineTwitter } from 'react-icons/ai'
import { BiLogoDiscordAlt } from 'react-icons/bi'
import { FaLinkedin } from 'react-icons/fa'
const socials = [
{
icon: <AiOutlineTwitter className="text-xl text-white" />,
href: "https://twitter.com/janframework",
href: 'https://twitter.com/janframework',
},
{
icon: <BiLogoDiscordAlt className="text-xl text-white" />,
href: "https://discord.com/invite/FTk2MvZwJH",
href: 'https://discord.com/invite/FTk2MvZwJH',
},
{
icon: <AiOutlineGithub className="text-lg text-white" />,
href: "https://github.com/janhq/jan",
href: 'https://github.com/janhq/jan',
},
];
{
icon: <FaLinkedin className="text-lg text-white" />,
href: 'https://www.linkedin.com/company/janframework/',
},
]
export default function AnnoncementBanner() {
const { stargazers } = useAppStars();
const { release } = useAppRelease();
const { stargazers } = useAppStars()
const { release } = useAppRelease()
return (
<div className="h-10 w-full flex-shrink-0 bg-blue-600">
<div
className="h-10 w-full flex-shrink-0"
style={{
background:
'radial-gradient(58.83% 95.12% at 62.37% 97.91%, rgba(238, 203, 255, 0.59) 0%, rgba(255, 255, 255, 0.00) 100%), linear-gradient(249deg, rgba(67, 119, 233, 0.80) 79.81%, rgba(67, 119, 233, 0.80) 93.59%, rgba(194, 226, 255, 0.80) 110.85%)',
}}
>
<div className="px-4 lg:px-10 flex h-full items-center justify-between py-0.5">
<div className="flex h-6 items-center shadow-sm">
<a
@ -75,10 +86,10 @@ export default function AnnoncementBanner() {
>
{social.icon}
</a>
);
)
})}
</div>
</div>
</div>
);
)
}

View File

@ -1,135 +1,161 @@
import React, { useState, useEffect } from "react";
import axios from "axios";
import { FaWindows, FaApple, FaLinux } from "react-icons/fa";
import { twMerge } from "tailwind-merge";
import React, { useState, useEffect } from 'react'
import axios from 'axios'
import { FaWindows, FaApple, FaLinux } from 'react-icons/fa'
import { twMerge } from 'tailwind-merge'
import { DownloadIcon } from 'lucide-react'
const systemsTemplate = [
{
name: "Mac M1, M2, M3",
name: 'Mac M1, M2, M3',
label: 'Apple Silicon',
logo: FaApple,
fileFormat: "{appname}-mac-arm64-{tag}.dmg",
comingSoon: false,
fileFormat: '{appname}-mac-arm64-{tag}.dmg',
},
{
name: "Mac (Intel)",
name: 'Mac (Intel)',
label: 'Apple Intel',
logo: FaApple,
fileFormat: "{appname}-mac-x64-{tag}.dmg",
comingSoon: false,
fileFormat: '{appname}-mac-x64-{tag}.dmg',
},
{
name: "Windows",
name: 'Windows',
label: 'Standard (64-bit)',
logo: FaWindows,
fileFormat: "{appname}-win-x64-{tag}.exe",
fileFormat: '{appname}-win-x64-{tag}.exe',
},
{
name: "Linux (AppImage)",
name: 'Linux (AppImage)',
label: 'AppImage',
logo: FaLinux,
fileFormat: "{appname}-linux-x86_64-{tag}.AppImage",
fileFormat: '{appname}-linux-x86_64-{tag}.AppImage',
},
{
name: "Linux (deb)",
name: 'Linux (deb)',
label: 'Deb',
logo: FaLinux,
fileFormat: "{appname}-linux-amd64-{tag}.deb",
fileFormat: '{appname}-linux-amd64-{tag}.deb',
},
];
]
const groupTemnplate = [
{ label: 'MacOS', name: 'mac', logo: FaApple },
{ label: 'Windows', name: 'windows', logo: FaWindows },
{ label: 'Linux', name: 'linux', logo: FaLinux },
]
export default function DownloadApp() {
const [systems, setSystems] = useState(systemsTemplate);
const [systems, setSystems] = useState(systemsTemplate)
const getLatestReleaseInfo = async (repoOwner, repoName) => {
const url = `https://api.github.com/repos/${repoOwner}/${repoName}/releases/latest`;
const url = `https://api.github.com/repos/${repoOwner}/${repoName}/releases/latest`
try {
const response = await axios.get(url);
return response.data;
const response = await axios.get(url)
return response.data
} catch (error) {
console.error(error);
return null;
console.error(error)
return null
}
};
}
const extractAppName = (fileName) => {
// Extract appname using a regex that matches the provided file formats
const regex = /^(.*?)-(?:mac|win|linux)-(?:arm64|x64|amd64|x86_64)-.*$/;
const match = fileName.match(regex);
return match ? match[1] : null;
};
const regex = /^(.*?)-(?:mac|win|linux)-(?:arm64|x64|amd64|x86_64)-.*$/
const match = fileName.match(regex)
return match ? match[1] : null
}
useEffect(() => {
const updateDownloadLinks = async () => {
try {
const releaseInfo = await getLatestReleaseInfo("janhq", "jan");
const releaseInfo = await getLatestReleaseInfo('janhq', 'jan')
// Extract appname from the first asset name
const firstAssetName = releaseInfo.assets[0].name;
const appname = extractAppName(firstAssetName);
const firstAssetName = releaseInfo.assets[0].name
const appname = extractAppName(firstAssetName)
if (!appname) {
console.error(
"Failed to extract appname from file name:",
'Failed to extract appname from file name:',
firstAssetName
);
)
return;
return
}
// Remove 'v' at the start of the tag_name
const tag = releaseInfo.tag_name.startsWith("v")
const tag = releaseInfo.tag_name.startsWith('v')
? releaseInfo.tag_name.substring(1)
: releaseInfo.tag_name;
: releaseInfo.tag_name
const updatedSystems = systems.map((system) => {
const downloadUrl = system.fileFormat
.replace("{appname}", appname)
.replace("{tag}", tag);
.replace('{appname}', appname)
.replace('{tag}', tag)
return {
...system,
href: `https://github.com/janhq/jan/releases/download/${releaseInfo.tag_name}/${downloadUrl}`,
};
});
}
})
setSystems(updatedSystems);
setSystems(updatedSystems)
} catch (error) {
console.error("Failed to update download links:", error);
console.error('Failed to update download links:', error)
}
};
}
updateDownloadLinks();
}, []);
updateDownloadLinks()
}, [])
const renderDownloadLink = (group) => {
return (
<>
{systems
.filter((x) => x.name.toLowerCase().includes(group))
.map((system, i) => (
<div
key={i}
className="border-b border-[#F0F0F0] dark:border-gray-800 last:border-none pb-2 pt-2"
>
<a
href={system.href || ''}
className={twMerge(
'inline-flex text-lg my-2 font-semibold cursor-pointer justify-center items-center space-x-2] text-blue-500 hover:text-blue-500 gap-2',
system.comingSoon && 'pointer-events-none'
)}
>
<span className="text-sm">{system.label}</span>
<DownloadIcon size={16} />
</a>
</div>
))}
</>
)
}
return (
<div>
<div className="flex flex-col lg:flex-row items-center justify-center gap-4 mb-4">
<span className="text-zinc-500 text-lg font-medium inline-block">
Download for PC
</span>
<div className="bg-yellow-50 text-yellow-700 space-x-2 px-4 py-2 border border-yellow-400 rounded-lg text-base">
<span>🚧</span>
<span className="font-semibold">Warning:</span>
<span className="font-medium">
Jan is in the process of being built. Expect bugs!
</span>
</div>
</div>
<div className="mx-auto text-center">
{systems.map((system, i) => (
<a
key={i}
href={system.href || ""}
className={twMerge(
"btn-shadow inline-flex m-2 px-4 rounded-lg text-lg font-semibold cursor-pointer justify-center items-center space-x-2 border border-zinc-200 dark:border-gray-700 text-black dark:text-white bg-zinc-50 min-w-[150px] dark:bg-[#18181B] h-[36px]",
system.comingSoon && "pointer-events-none"
)}
>
<system.logo />
<span className="text-sm">{system.name}</span>
{system.comingSoon && (
<span className="bg-zinc-200 py-0.5 px-2 inline-block ml-2 rounded-md text-xs h-[20px] dark:text-black">
Coming Soon
</span>
)}
</a>
))}
<div className="w-full lg:w-3/5 mx-auto px-4">
<div className="grid grid-cols-1 lg:grid-cols-3 py-10 gap-8">
{groupTemnplate.map((item, i) => {
return (
<div
className="border border-[#F0F0F0] dark:border-gray-800 rounded-xl text-center"
key={i}
>
<div className="text-center">
<div className="flex gap-2 p-4 border-b border-[#F0F0F0] dark:border-gray-800 items-center justify-center">
<div className="text-2xl">
<item.logo />
</div>
<h6>{item.label}</h6>
</div>
<div className="mx-auto text-center py-2">
{renderDownloadLink(item.name)}
</div>
</div>
</div>
)
})}
</div>
</div>
);
)
}

View File

@ -1,134 +1,134 @@
import React, { useState, useEffect } from "react";
import { Fragment } from "react";
import { Menu, Transition } from "@headlessui/react";
import { ChevronDownIcon } from "@heroicons/react/20/solid";
import axios from "axios";
import { FaWindows, FaApple, FaLinux } from "react-icons/fa";
import React, { useState, useEffect } from 'react'
import { Fragment } from 'react'
import { Menu, Transition } from '@headlessui/react'
import { ChevronDownIcon } from '@heroicons/react/20/solid'
import axios from 'axios'
import { FaWindows, FaApple, FaLinux } from 'react-icons/fa'
const systemsTemplate = [
{
name: "Download for Mac (M1/M2/M3)",
name: 'Download for Mac (M1/M2/M3)',
logo: FaApple,
fileFormat: "{appname}-mac-arm64-{tag}.dmg",
fileFormat: '{appname}-mac-arm64-{tag}.dmg',
},
{
name: "Download for Mac (Intel)",
name: 'Download for Mac (Intel)',
logo: FaApple,
fileFormat: "{appname}-mac-x64-{tag}.dmg",
fileFormat: '{appname}-mac-x64-{tag}.dmg',
},
{
name: "Download for Windows",
name: 'Download for Windows',
logo: FaWindows,
fileFormat: "{appname}-win-x64-{tag}.exe",
fileFormat: '{appname}-win-x64-{tag}.exe',
},
{
name: "Download for Linux (AppImage)",
name: 'Download for Linux (AppImage)',
logo: FaLinux,
fileFormat: "{appname}-linux-x86_64-{tag}.AppImage",
fileFormat: '{appname}-linux-x86_64-{tag}.AppImage',
},
{
name: "Download for Linux (deb)",
name: 'Download for Linux (deb)',
logo: FaLinux,
fileFormat: "{appname}-linux-amd64-{tag}.deb",
}
];
fileFormat: '{appname}-linux-amd64-{tag}.deb',
},
]
function classNames(...classes) {
return classes.filter(Boolean).join(" ");
return classes.filter(Boolean).join(' ')
}
export default function Dropdown() {
const [systems, setSystems] = useState(systemsTemplate);
const [defaultSystem, setDefaultSystem] = useState(systems[0]);
const [systems, setSystems] = useState(systemsTemplate)
const [defaultSystem, setDefaultSystem] = useState(systems[0])
const getLatestReleaseInfo = async (repoOwner, repoName) => {
const url = `https://api.github.com/repos/${repoOwner}/${repoName}/releases/latest`;
const url = `https://api.github.com/repos/${repoOwner}/${repoName}/releases/latest`
try {
const response = await axios.get(url);
return response.data;
const response = await axios.get(url)
return response.data
} catch (error) {
console.error(error);
return null;
console.error(error)
return null
}
};
}
const extractAppName = (fileName) => {
// Extract appname using a regex that matches the provided file formats
const regex = /^(.*?)-(?:mac|win|linux)-(?:arm64|x64|x86_64|amd64)-.*$/;
const match = fileName.match(regex);
return match ? match[1] : null;
};
const regex = /^(.*?)-(?:mac|win|linux)-(?:arm64|x64|x86_64|amd64)-.*$/
const match = fileName.match(regex)
return match ? match[1] : null
}
const changeDefaultSystem = async (systems) => {
const userAgent = navigator.userAgent;
const userAgent = navigator.userAgent
if (userAgent.includes("Windows")) {
if (userAgent.includes('Windows')) {
// windows user
setDefaultSystem(systems[2]);
} else if (userAgent.includes("Linux")) {
setDefaultSystem(systems[2])
} else if (userAgent.includes('Linux')) {
// linux user
setDefaultSystem(systems[3]);
} else if (userAgent.includes("Mac OS")) {
setDefaultSystem(systems[0]);
setDefaultSystem(systems[3])
} else if (userAgent.includes('Mac OS')) {
setDefaultSystem(systems[0])
} else {
setDefaultSystem(systems[1]);
setDefaultSystem(systems[1])
}
};
}
useEffect(() => {
const updateDownloadLinks = async () => {
try {
const releaseInfo = await getLatestReleaseInfo("janhq", "jan");
const releaseInfo = await getLatestReleaseInfo('janhq', 'jan')
// Extract appname from the first asset name
const firstAssetName = releaseInfo.assets[0].name;
const appname = extractAppName(firstAssetName);
const firstAssetName = releaseInfo.assets[0].name
const appname = extractAppName(firstAssetName)
if (!appname) {
console.error(
"Failed to extract appname from file name:",
'Failed to extract appname from file name:',
firstAssetName
);
changeDefaultSystem(systems);
return;
)
changeDefaultSystem(systems)
return
}
// Remove 'v' at the start of the tag_name
const tag = releaseInfo.tag_name.startsWith("v")
const tag = releaseInfo.tag_name.startsWith('v')
? releaseInfo.tag_name.substring(1)
: releaseInfo.tag_name;
: releaseInfo.tag_name
const updatedSystems = systems.map((system) => {
const downloadUrl = system.fileFormat
.replace("{appname}", appname)
.replace("{tag}", tag);
.replace('{appname}', appname)
.replace('{tag}', tag)
return {
...system,
href: `https://github.com/janhq/jan/releases/download/${releaseInfo.tag_name}/${downloadUrl}`,
};
});
}
})
setSystems(updatedSystems);
changeDefaultSystem(updatedSystems);
setSystems(updatedSystems)
changeDefaultSystem(updatedSystems)
} catch (error) {
console.error("Failed to update download links:", error);
console.error('Failed to update download links:', error)
}
};
}
updateDownloadLinks();
}, []);
updateDownloadLinks()
}, [])
return (
<div className="inline-flex align-items-stretch">
<a
href={defaultSystem.href || ""}
className="cursor-pointer relative inline-flex items-center rounded-l-md border-0 px-4 py-3 text-base font-semibold dark:bg-white dark:text-black bg-black text-white dark:hover:text-black hover:text-white"
href={defaultSystem.href || ''}
className="cursor-pointer relative inline-flex items-center rounded-l-xl border-0 px-4 py-4 text-base font-semibold dark:bg-[#343435] dark:text-white bg-black text-white hover:text-white dark:border dark:border-[#B2B2B3]"
>
<defaultSystem.logo className="h-5 mr-3 -mt-1" />
{defaultSystem.name}
</a>
<Menu as="div" className="relative -ml-px block">
<Menu.Button className="cursor-pointer relative inline-flex items-center rounded-r-md border-l border-gray-600 h-full dark:bg-white dark:text-black bg-black text-white dark:hover:text-black hover:text-white w-8 justify-center">
<Menu.Button className="cursor-pointer relative inline-flex items-center rounded-r-xl border-l border-gray-600 h-full dark:bg-[#343435] dark:text-white bg-black text-white hover:text-white w-8 justify-center dark:border dark:border-[#B2B2B3]">
<span className="sr-only">Open OS options</span>
<ChevronDownIcon className="h-6 w-6" aria-hidden="true" />
</Menu.Button>
@ -141,7 +141,7 @@ export default function Dropdown() {
leaveFrom="transform opacity-100 scale-100"
leaveTo="transform opacity-0 scale-95"
>
<Menu.Items className="absolute right-0 z-10 mt-1 w-80 text-left origin-top-right rounded-md dark:bg-white dark:text-black bg-black text-white dark:hover:text-black hover:text-white shadow-2xl ring-1 ring-black ring-opacity-5 focus:outline-none overflow-hidden">
<Menu.Items className="absolute right-0 z-10 mt-1 w-80 text-left origin-top-right rounded-xl dark:bg-[#343435] dark:text-white bg-black text-white hover:text-white shadow-2xl ring-1 ring-black ring-opacity-5 focus:outline-none overflow-hidden">
<div className="overflow-hidden">
{systems.map((system) => (
<Menu.Item
@ -150,16 +150,16 @@ export default function Dropdown() {
>
{({ active }) => (
<a
href={system.href || ""}
href={system.href || ''}
className={classNames(
active
? "dark:bg-blue-100 bg-gray-900 hover:text-white dark:text-black"
: "text-white dark:text-black",
"flex px-4 py-3 items-center text-white hover:text-white dark:text-black"
? 'dark:bg-black/20 bg-gray-900 hover:text-white'
: 'text-white ',
'flex px-4 py-3 items-center text-white hover:text-white'
)}
>
<system.logo className="w-3 mr-3 -mt-1 flex-shrink-0" />
<span className="text-white dark:text-black font-medium">
<span className="text-white font-medium">
{system.name}
</span>
</a>
@ -171,5 +171,5 @@ export default function Dropdown() {
</Transition>
</Menu>
</div>
);
)
}

View File

@ -1,134 +1,208 @@
import React from "react";
import React from 'react'
import { AiOutlineGithub, AiOutlineTwitter } from "react-icons/ai";
import { BiLogoDiscordAlt, BiLogoLinkedin } from "react-icons/bi";
import useDocusaurusContext from '@docusaurus/useDocusaurusContext'
import { AiOutlineGithub, AiOutlineTwitter } from 'react-icons/ai'
import { BiLogoDiscordAlt, BiLogoLinkedin } from 'react-icons/bi'
import { useForm } from 'react-hook-form'
const socials = [
{
icon: <AiOutlineTwitter className="text-xl text-black dark:text-white" />,
href: "https://twitter.com/janframework",
icon: (
<AiOutlineTwitter className="text-xl text-black/60 dark:text-white/60" />
),
href: 'https://twitter.com/janframework',
},
{
icon: <BiLogoDiscordAlt className="text-xl text-black dark:text-white" />,
href: "https://discord.com/invite/FTk2MvZwJH",
icon: (
<BiLogoDiscordAlt className="text-xl text-black/60 dark:text-white/60" />
),
href: 'https://discord.com/invite/FTk2MvZwJH',
},
{
icon: <AiOutlineGithub className="text-lg text-black dark:text-white" />,
href: "https://github.com/janhq/jan",
icon: (
<AiOutlineGithub className="text-lg text-black/60 dark:text-white/60" />
),
href: 'https://github.com/janhq/jan',
},
{
icon: <BiLogoLinkedin className="text-xl text-black dark:text-white" />,
href: "https://www.linkedin.com/company/janframework/",
}
];
icon: (
<BiLogoLinkedin className="text-xl text-black/60 dark:text-white/60" />
),
href: 'https://www.linkedin.com/company/janframework/',
},
]
const menus = [
{
name: "For Developers",
name: 'Product',
child: [
{
menu: "Documentation",
path: "/developer",
menu: 'Download',
path: '/download',
},
{
menu: "Hardware",
path: "/hardware",
menu: 'Documentation',
path: '/developer',
},
{
menu: "API Reference",
path: "/api-reference",
},
{
menu: "Changelog",
path: "https://github.com/janhq/jan/releases",
menu: 'Changelog',
path: 'https://github.com/janhq/jan/releases',
external: true,
},
],
},
{
name: "Community",
name: 'For Developers',
child: [
{
menu: "Github",
path: "https://github.com/janhq/jan",
external: true,
menu: 'Guides',
path: '/guides',
},
{
menu: "Discord",
path: "https://discord.gg/FTk2MvZwJH",
external: true,
menu: 'Developer',
path: '/developer',
},
{
menu: "Twitter",
path: "https://twitter.com/janframework",
external: true,
menu: 'API Reference',
path: '/api-reference',
},
{
menu: "LinkedIn",
path: "https://www.linkedin.com/company/janframework/",
external: true,
}
],
},
{
name: "Company",
name: 'Community',
child: [
{
menu: "About",
path: "/about",
},
{
menu: "Blog",
path: "/blog",
},
{
menu: "Careers",
path: "https://janai.bamboohr.com/careers",
menu: 'Github',
path: 'https://github.com/janhq/jan',
external: true,
},
{
menu: "Newsletter",
path: "/community#newsletter",
}
menu: 'Discord',
path: 'https://discord.gg/FTk2MvZwJH',
external: true,
},
{
menu: 'Twitter',
path: 'https://twitter.com/janframework',
external: true,
},
{
menu: 'LinkedIn',
path: 'https://www.linkedin.com/company/janframework/',
external: true,
},
],
},
];
{
name: 'Company',
child: [
{
menu: 'About',
path: '/about',
},
{
menu: 'Blog',
path: '/blog',
},
{
menu: 'Careers',
path: 'https://janai.bamboohr.com/careers',
external: true,
},
{
menu: 'Newsletter',
path: '/community#newsletter',
},
],
},
]
const getCurrentYear = new Date().getFullYear();
const getCurrentYear = new Date().getFullYear()
export default function Footer() {
const { register, handleSubmit, reset } = useForm({
defaultValues: {
email: '',
},
})
const {
siteConfig: { customFields },
} = useDocusaurusContext()
const onSubmit = (data) => {
const { email } = data
const options = {
method: 'POST',
headers: {
'accept': 'application/json',
'content-type': 'application/json',
'api-key': customFields.apiKeyBrevo,
},
body: JSON.stringify({
updateEnabled: false,
email,
listIds: [13],
}),
}
if (email) {
fetch('https://api.brevo.com/v3/contacts', options)
.then((response) => response.json())
.then((response) => {
if (response.id) {
reset()
}
})
.catch((err) => console.error(err))
}
}
return (
<footer className="flex-shrink-0 dark:bg-[#09090B]/10 bg-[#D4D4D8]/10 relative overflow-hidden py-10">
<footer className="flex-shrink-0 relative overflow-hidden py-10">
<div className="container">
<div className="grid grid-cols-2 gap-8 md:grid-cols-2 lg:grid-cols-6">
<div className="lg:col-span-3 col-span-2">
<div className="col-span-2">
<div className="flex items-center space-x-2 mb-3">
<img alt="Jan Logo" src="/img/logo.svg" />
<h2 className="h6">Jan</h2>
<h2 className="h5">Jan</h2>
</div>
<div className="w-full lg:w-1/2">
<p className="dark:text-gray-400 text-gray-600">
Jan is the open-source, self-hosted&nbsp;
<div className="w-full lg:w-3/4 mt-2">
<h6>The Soul of a New Machine</h6>
<p className="dark:text-gray-400 text-gray-600 mt-2">
Subscribe to our newsletter on AI{' '}
<br className="hidden lg:block" />
&nbsp;alternative to ChatGPT.
research and building Jan:
</p>
<div className="mt-4">
<div className="flex items-center gap-x-3">
{socials.map((social, i) => {
return (
<a
aria-label={`social-${i}`}
key={i}
href={social.href}
target="_blank"
rel="noopener"
>
{social.icon}
</a>
);
})}
</div>
<form className="relative" onSubmit={handleSubmit(onSubmit)}>
<input
type="email"
className="w-full h-12 p-4 pr-14 rounded-xl border dark:border-gray-600 dark:bg-[#252525] border-[#F0F0F0]"
placeholder="Enter your email"
{...register('email')}
/>
<button
type="submit"
className="absolute flex p-2 bg-black dark:bg-[#3B3B3C] w-8 h-8 border dark:border-gray-600 rounded-lg top-1/2 right-3 -translate-y-1/2"
>
<svg
width="16"
height="16"
viewBox="0 0 16 16"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<path
fillRule="evenodd"
clipRule="evenodd"
d="M6.09026 8.41933L3.72077 7.62985C1.24061 6.80348 0 6.3903 0 5.63033C0 4.87142 1.24061 4.45718 3.72077 3.63081L12.6938 0.639442C14.4393 0.0576106 15.3121 -0.233305 15.7727 0.227312C16.2333 0.687928 15.9424 1.56068 15.3616 3.30512L12.3692 12.2792C11.5428 14.7594 11.1296 16 10.3697 16C9.61076 16 9.19652 14.7594 8.37015 12.2792L7.57962 9.9108L12.1689 5.3215C12.3609 5.1227 12.4672 4.85645 12.4648 4.58008C12.4624 4.30372 12.3515 4.03935 12.1561 3.84392C11.9607 3.64849 11.6963 3.53764 11.4199 3.53524C11.1435 3.53284 10.8773 3.63908 10.6785 3.83108L6.09026 8.41933Z"
fill="white"
/>
</svg>
</button>
</form>
</div>
</div>
</div>
@ -142,25 +216,42 @@ export default function Footer() {
<li key={i}>
<a
href={child.path}
target={child.external ? "_blank" : "_self"}
target={child.external ? '_blank' : '_self'}
className="inline-block py-1 dark:text-gray-400 text-gray-600"
>
{child.menu}
</a>
</li>
);
)
})}
</ul>
</div>
);
)
})}
</div>
</div>
<div className="container mt-6">
<span className="dark:text-gray-300 text-gray-700">
&copy;{getCurrentYear}&nbsp;Jan AI Pte Ltd.
</span>
<div className="container mt-8">
<div className="flex w-full justify-between items-center">
<span className="dark:text-gray-300 text-gray-700">
&copy;{getCurrentYear}&nbsp;Jan AI Pte Ltd.
</span>
<div className="flex items-center gap-x-3">
{socials.map((social, i) => {
return (
<a
aria-label={`social-${i}`}
key={i}
href={social.href}
target="_blank"
rel="noopener"
>
{social.icon}
</a>
)
})}
</div>
</div>
</div>
</footer>
);
)
}

View File

@ -1,47 +0,0 @@
import React from "react";
import { FaGithub, FaDiscord } from "react-icons/fa";
import { RiStarSFill } from "react-icons/ri";
import { useAppStars } from "@site/src/hooks/useAppStars";
import { useDiscordWidget } from "@site/src/hooks/useDiscordWidget";
export default function SocialButton() {
const { stargazers } = useAppStars();
const { data } = useDiscordWidget();
return (
<div className="flex items-center space-x-2 justify-start">
<a
href="https://github.com/janhq/jan"
target="_blank"
className="inline-flex px-4 py-3 rounded-lg font-semibold cursor-pointer justify-center items-center space-x-4 border border-gray-400 dark:border-gray-700 text-white bg-black hover:text-white"
>
<span>
<FaGithub className="text-3xl" />
</span>
<div className="flex-col">
<p className="text-base">Github</p>
<p className="text-sm text-white flex items-center space-x-1">
<RiStarSFill className="text-lg text-[#FEC928]" />
<span>{stargazers.count} stars</span>
</p>
</div>
</a>
<a
href="https://discord.gg/FTk2MvZwJH"
target="_blank"
className="text-white bg-[#5765F2] hover:bg-[#5765F2] hover:text-white inline-flex px-4 py-3 rounded-lg font-semibold cursor-pointer justify-center items-center space-x-4"
>
<span>
<FaDiscord className="text-3xl" />
</span>
<div className="flex-col">
<p className="text-base">Discord</p>
<div className="text-sm text-white flex items-center space-x-1">
<div className="w-2 h-2 bg-green-500 rounded-full" />
<span>{data.presence_count} online</span>
</div>
</div>
</a>
</div>
);
}

View File

@ -0,0 +1,370 @@
import { useColorMode } from '@docusaurus/theme-common'
import { Tweet } from 'react-tweet'
const firstColumn = [
{
type: 'tweet',
id: '1742843063938994469',
},
{
type: 'youtube',
id: 'ZCiEQVOjH5U',
},
{
type: 'youtube',
id: '7JpzE-_cKo4',
},
{
type: 'tweet',
id: '1744729548074459310',
},
]
const secondColumn = [
{
type: 'youtube',
id: 'QpMQgJL4AZA',
},
{
type: 'tweet',
id: '1750801065132384302',
},
{
type: 'youtube',
id: '9ta2S425Zu8',
},
{
type: 'tweet',
id: '1757504717519749292',
},
]
const thirdColumn = [
{
type: 'tweet',
id: '1745560583548670250',
},
{
type: 'youtube',
id: 'zkafOIyQM8s',
},
{
type: 'tweet',
id: '1757500111629025788',
},
]
const fourthColumn = [
{
type: 'tweet',
id: '1742993414986068423',
},
{
type: 'youtube',
id: '9ta2S425Zu8',
},
{
type: 'youtube',
id: 'ES021_sY6WQ',
},
{
type: 'youtube',
id: 'CbJGxNmdWws',
},
]
const Testimonial = () => {
const { colorMode } = useColorMode()
return (
<div className="bg-[#F0F0F0] dark:bg-[#242424] p-8 mt-10 pb-20">
<div className="w-full xl:w-3/5 mx-auto relative py-8 text-center">
<h1 className="text-5xl !font-normal leading-tight lg:leading-tight mt-2 font-serif">
People say nice things
</h1>
<p className="leading-relaxed mt-2 text-black/60 dark:text-white/60 flex gap-x-2 justify-center">
...despite our bugs and fast moving releases{' '}
<svg
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<g clip-path="url(#clip0_1810_7276)">
<path
d="M24.0001 11.4301H22.8601V19.4326H24.0001V11.4301Z"
className="fill-black/60 dark:fill-white/60"
/>
<path
d="M22.8599 19.4325H21.7124V20.5725H22.8599V19.4325Z"
className="fill-black/60 dark:fill-white/60"
/>
<path
d="M22.8599 9.14246H21.7124V11.43H22.8599V9.14246Z"
className="fill-black/60 dark:fill-white/60"
/>
<path
d="M21.7125 20.5725H20.5725V21.72H21.7125V20.5725Z"
className="fill-black/60 dark:fill-white/60"
/>
<path
d="M21.7125 6.86255H20.5725V9.14255H21.7125V6.86255Z"
className="fill-black/60 dark:fill-white/60"
/>
<path
d="M20.5726 21.72H19.4326V22.86H20.5726V21.72Z"
className="fill-black/60 dark:fill-white/60"
/>
<path
d="M20.5726 5.71497H19.4326V6.86247H20.5726V5.71497Z"
className="fill-black/60 dark:fill-white/60"
/>
<path
d="M19.4324 2.28748H18.2849V5.71498H19.4324V2.28748Z"
className="fill-black/60 dark:fill-white/60"
/>
<path
d="M12.5701 22.86V21.72H14.8576V20.5725H11.4301V21.72H5.71509V22.86H11.4301V24H19.4326V22.86H12.5701Z"
className="fill-black/60 dark:fill-white/60"
/>
<path
d="M18.285 1.14746H17.145V2.28746H18.285V1.14746Z"
className="fill-black/60 dark:fill-white/60"
/>
<path
d="M17.1449 11.4301H14.8574V12.5701H17.1449V11.4301Z"
className="fill-black/60 dark:fill-white/60"
/>
<path
d="M16.0049 19.4325H14.8574V20.5725H16.0049V19.4325Z"
className="fill-black/60 dark:fill-white/60"
/>
<path
d="M17.145 0H13.7175V1.1475H17.145V0Z"
className="fill-black/60 dark:fill-white/60"
/>
<path
d="M14.8575 18.285H13.7175V19.4325H14.8575V18.285Z"
className="fill-black/60 dark:fill-white/60"
/>
<path
d="M14.8575 12.5699H13.7175V13.7174H14.8575V12.5699Z"
className="fill-black/60 dark:fill-white/60"
/>
<path
d="M16.005 2.28748H13.7175V4.57498H16.005V2.28748Z"
className="fill-black/60 dark:fill-white/60"
/>
<path
d="M13.7176 13.7175H12.5701V18.285H13.7176V13.7175Z"
className="fill-black/60 dark:fill-white/60"
/>
<path
d="M13.7176 1.14746H12.5701V2.28746H13.7176V1.14746Z"
className="fill-black/60 dark:fill-white/60"
/>
<path
d="M12.5699 2.28748H11.4299V4.57498H12.5699V2.28748Z"
className="fill-black/60 dark:fill-white/60"
/>
<path
d="M11.43 19.4325H10.29V20.5725H11.43V19.4325Z"
className="fill-black/60 dark:fill-white/60"
/>
<path
d="M10.2901 16.005H9.14258V19.4325H10.2901V16.005Z"
className="fill-black/60 dark:fill-white/60"
/>
<path
d="M11.4301 4.57495H9.14258V5.71495H11.4301V4.57495Z"
className="fill-black/60 dark:fill-white/60"
/>
<path
d="M9.14244 14.8575H8.00244V16.005H9.14244V14.8575Z"
className="fill-black/60 dark:fill-white/60"
/>
<path
d="M9.14244 6.86255H8.00244V8.00255H9.14244V6.86255Z"
className="fill-black/60 dark:fill-white/60"
/>
<path
d="M9.14244 2.28748H8.00244V4.57498H9.14244V2.28748Z"
className="fill-black/60 dark:fill-white/60"
/>
<path
d="M8.00255 1.14746H6.86255V2.28746H8.00255V1.14746Z"
className="fill-black/60 dark:fill-white/60"
/>
<path
d="M8.00245 8.00244H4.57495V9.14244H8.00245V8.00244Z"
className="fill-black/60 dark:fill-white/60"
/>
<path
d="M5.71495 20.5725H4.57495V21.72H5.71495V20.5725Z"
className="fill-black/60 dark:fill-white/60"
/>
<path
d="M6.86249 0H3.42749V1.1475H6.86249V0Z"
className="fill-black/60 dark:fill-white/60"
/>
<path
d="M1.1475 22.86V21.72H0V24H5.715V22.86H1.1475Z"
className="fill-black/60 dark:fill-white/60"
/>
<path
d="M8.0026 13.7175H2.2876V14.8575H8.0026V13.7175Z"
className="fill-black/60 dark:fill-white/60"
/>
<path
d="M5.71499 2.28748H3.42749V4.57498H5.71499V2.28748Z"
className="fill-black/60 dark:fill-white/60"
/>
<path
d="M3.42746 20.5725H4.57496V19.4325H2.28746V20.5725H1.14746V21.72H3.42746V20.5725Z"
className="fill-black/60 dark:fill-white/60"
/>
<path
d="M3.4276 5.71497H2.2876V8.00247H3.4276V5.71497Z"
className="fill-black/60 dark:fill-white/60"
/>
<path
d="M3.4276 1.14746H2.2876V2.28746H3.4276V1.14746Z"
className="fill-black/60 dark:fill-white/60"
/>
<path
d="M2.28746 18.285H1.14746V19.4325H2.28746V18.285Z"
className="fill-black/60 dark:fill-white/60"
/>
<path
d="M2.28746 8.00244H1.14746V10.2899H2.28746V8.00244Z"
className="fill-black/60 dark:fill-white/60"
/>
<path
d="M2.28746 2.28748H1.14746V5.71498H2.28746V2.28748Z"
className="fill-black/60 dark:fill-white/60"
/>
<path
d="M2.2875 16.005V14.8575H1.1475V10.29H0V18.285H1.1475V16.005H2.2875Z"
className="fill-black/60 dark:fill-white/60"
/>
</g>
<defs>
<clipPath id="clip0_1810_7276">
<rect width="24" height="24" fill="white" />
</clipPath>
</defs>
</svg>
</p>
</div>
<div className="w-full xl:w-3/4 mx-auto relative text-center">
<div data-theme={colorMode} className="mt-10">
<div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-4 lg:gap-8 text-left">
<div className="space-y-4 lg:space-y-8">
{firstColumn.map((item, i) => {
if (item.type === 'tweet')
return (
<div key={i} className="tweet-wrapper">
<Tweet id={item.id} />
</div>
)
if (item.type === 'youtube')
return (
<div key={i}>
<iframe
width="100%"
height="260"
src={`https://www.youtube.com/embed/${item.id}`}
title="Install Jan to Run LLM Offline and Local First"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
allowFullScreen
className="rounded-xl"
loading="lazy"
/>
</div>
)
})}
</div>
<div className="space-y-4 lg:space-y-8">
{secondColumn.map((item, i) => {
if (item.type === 'tweet')
return (
<div key={i} className="tweet-wrapper">
<Tweet id={item.id} />
</div>
)
if (item.type === 'youtube')
return (
<div key={i}>
<iframe
width="100%"
height="260"
src={`https://www.youtube.com/embed/${item.id}`}
title="Install Jan to Run LLM Offline and Local First"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
allowFullScreen
className="rounded-xl"
loading="lazy"
/>
</div>
)
})}
</div>
<div className="space-y-4 lg:space-y-8">
{thirdColumn.map((item, i) => {
if (item.type === 'tweet')
return (
<div key={i} className="tweet-wrapper">
<Tweet id={item.id} />
</div>
)
if (item.type === 'youtube')
return (
<div key={i}>
<iframe
width="100%"
height="260"
src={`https://www.youtube.com/embed/${item.id}`}
title="Install Jan to Run LLM Offline and Local First"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
allowFullScreen
className="rounded-xl"
loading="lazy"
/>
</div>
)
})}
</div>
<div className="space-y-4 lg:space-y-8">
{fourthColumn.map((item, i) => {
if (item.type === 'tweet')
return (
<div key={i} className="tweet-wrapper">
<Tweet id={item.id} />
</div>
)
if (item.type === 'youtube')
return (
<div key={i}>
<iframe
width="100%"
height="260"
src={`https://www.youtube.com/embed/${item.id}`}
title="Install Jan to Run LLM Offline and Local First"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
allowFullScreen
className="rounded-xl"
loading="lazy"
/>
</div>
)
})}
</div>
</div>
</div>
</div>
</div>
)
}
export default Testimonial

View File

@ -34,7 +34,7 @@
/* Dark mode styles based on Docusaurus dark theme */
[data-theme='dark'] .head_Menu div {
font-weight: bold;
background-color: var(--ifm-background-color);
/* background-color: var(--ifm-background-color); */
color: var(--ifm-font-color-base);
margin-left: 0.7rem;
font-size: larger;
@ -42,14 +42,14 @@
[data-theme='dark'] .head_Menu li {
font-weight: normal;
background-color: var(--ifm-background-color);
/* background-color: var(--ifm-background-color); */
margin-bottom: 5px;
color: var(--ifm-font-color-base);
}
[data-theme='dark'] .head_SubMenu div {
font-weight: normal;
background-color: var(--ifm-background-color);
/* background-color: var(--ifm-background-color); */
color: var(--ifm-font-color-base);
margin-left: 0rem;
font-size: medium;

View File

@ -0,0 +1,53 @@
import React, { useState, useEffect } from 'react'
import DownloadApp from '@site/src/containers/DownloadApp'
import ThemedImage from '@theme/ThemedImage'
import Layout from '@theme/Layout'
import Banner from '@site/src/containers/Banner'
import useBaseUrl from '@docusaurus/useBaseUrl'
export default function Download() {
return (
<>
<Banner />
<Layout
title="Download"
description="Jan turns your computer into an AI machine by running LLMs locally on your computer. It's a privacy-focus, local-first, open-source solution."
>
<main>
{/* Hero */}
<div className="text-center px-4 py-20">
<h1 className="text-6xl lg:text-7xl !font-normal leading-tight lg:leading-tight mt-2 font-serif">
Download Jan for your desktop
</h1>
<p className="text-2xl -mt-1 leading-relaxed text-black/60 dark:text-white/60">
Turn your computer into an AI machine
</p>
<div className="my-8">
<DownloadApp />
</div>
<div className="mb-14">
<a
href="https://jan.ai/guides/install/"
target="_blank"
className="text-blue-500 hover:text-blue-500 pr-4 border-r border-black/40 dark:border-white/40 mr-4 inline-block"
>
Installation Guide
</a>
<a
href="https://jan.ai/changelog/"
target="_blank"
className="text-blue-500 hover:text-blue-500"
>
Changelog
</a>
</div>
</div>
</main>
</Layout>
</>
)
}

File diff suppressed because it is too large Load Diff

View File

@ -1,5 +1,5 @@
@layer base {
html[data-theme="light"] {
html[data-theme='light'] {
--custom-radial-blur: #e1e7fd;
--ifm-background-color: #fff;
--ifm-color-primary: #2563eb; /* New Primary Blue */
@ -14,7 +14,7 @@
--docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.1);
}
html[data-theme="dark"] {
html[data-theme='dark'] {
--custom-radial-blur: #1d1b48;
--ifm-background-color: #18181b;
--ifm-color-primary: #ffffff; /* New Primary Blue */
@ -27,6 +27,92 @@
--docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.3);
}
.react-tweet-theme {
--tweet-container-margin: 1.5rem 0;
--tweet-header-font-size: 0.9375rem;
--tweet-header-line-height: 1.25rem;
--tweet-body-font-size: 1.25rem;
--tweet-body-font-weight: 400;
--tweet-body-line-height: 1.5rem;
--tweet-body-margin: 0;
--tweet-quoted-container-margin: 0.75rem 0;
--tweet-quoted-body-font-size: 0.938rem;
--tweet-quoted-body-font-weight: 400;
--tweet-quoted-body-line-height: 1.25rem;
--tweet-quoted-body-margin: 0.25rem 0 0.75rem 0;
--tweet-info-font-size: 0.9375rem;
--tweet-info-line-height: 1.25rem;
--tweet-actions-font-size: 0.875rem;
--tweet-actions-line-height: 1rem;
--tweet-actions-font-weight: 700;
--tweet-actions-icon-size: 1.25em;
--tweet-actions-icon-wrapper-size: calc(
var(--tweet-actions-icon-size) + 0.75em
);
--tweet-replies-font-size: 0.875rem;
--tweet-replies-line-height: 1rem;
--tweet-replies-font-weight: 700;
}
:is([data-theme='light'], .light) :where(.react-tweet-theme),
:where(.react-tweet-theme) {
--tweet-skeleton-gradient: linear-gradient(
270deg,
#fafafa,
#eaeaea,
#eaeaea,
#fafafa
);
--tweet-border: 1px solid #cfd9de;
--tweet-font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto,
Helvetica, Arial, sans-serif;
--tweet-font-color: #0f1419;
--tweet-font-color-secondary: #536471;
--tweet-bg-color: #fff;
--tweet-bg-color-hover: #f7f9f9;
--tweet-quoted-bg-color-hover: rgba(0, 0, 0, 0.03);
--tweet-color-blue-primary: #1d9bf0;
--tweet-color-blue-primary-hover: #1a8cd8;
--tweet-color-blue-secondary: #006fd6;
--tweet-color-blue-secondary-hover: rgba(0, 111, 214, 0.1);
--tweet-color-red-primary: #f91880;
--tweet-color-red-primary-hover: rgba(249, 24, 128, 0.1);
--tweet-color-green-primary: #00ba7c;
--tweet-color-green-primary-hover: rgba(0, 186, 124, 0.1);
--tweet-twitter-icon-color: var(--tweet-font-color);
--tweet-verified-old-color: #829aab;
--tweet-verified-blue-color: var(--tweet-color-blue-primary);
}
:is([data-theme='dark'], .dark) :where(.react-tweet-theme) {
--tweet-skeleton-gradient: linear-gradient(
270deg,
#15202b,
#1e2732,
#1e2732,
#15202b
);
--tweet-border: 1px solid #425364;
--tweet-font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto,
Helvetica, Arial, sans-serif;
--tweet-font-color: #f7f9f9;
--tweet-font-color-secondary: #8b98a5;
--tweet-bg-color: #333333;
--tweet-bg-color-hover: #1e2732;
--tweet-quoted-bg-color-hover: hsla(0, 0%, 100%, 0.03);
--tweet-color-blue-primary: #1d9bf0;
--tweet-color-blue-primary-hover: #1a8cd8;
--tweet-color-blue-secondary: #6bc9fb;
--tweet-color-blue-secondary-hover: rgba(107, 201, 251, 0.1);
--tweet-color-red-primary: #f91880;
--tweet-color-red-primary-hover: rgba(249, 24, 128, 0.1);
--tweet-color-green-primary: #00ba7c;
--tweet-color-green-primary-hover: rgba(0, 186, 124, 0.1);
--tweet-twitter-icon-color: var(--tweet-font-color);
--tweet-verified-old-color: #829aab;
--tweet-verified-blue-color: #fff;
}
pre,
code {
@apply text-sm;
@ -35,7 +121,11 @@
body {
@apply text-base;
@apply antialiased;
@apply bg-white dark:bg-[#18181B];
@apply bg-white dark:bg-[#0C0C0C];
}
#__docusaurus {
@apply bg-white dark:bg-[#0C0C0C];
}
img {
@ -65,3 +155,19 @@
box-shadow: 0px 1px 2px 0px rgba(16, 24, 40, 0.05);
}
}
.tweet-wrapper {
[class*='actions_'] {
display: none !important;
}
[class*='authorFollow_'] {
display: none !important;
}
[class*='replies_'] {
margin-top: 10px;
}
}
.font-serif {
letter-spacing: -4px;
}

View File

@ -29,6 +29,32 @@
0px -1px 1px 0px rgba(0, 0, 0, 0.1) inset,
0px 1px 1px 0px #4c4c4c inset;
}
.card-wrapper {
border-radius: 16px;
background: linear-gradient(180deg, #fafafa 0%, #ededed 100%);
box-shadow:
0px 4px 12px 0px rgba(0, 0, 0, 0.12),
0px -1px 1px 0px rgba(0, 0, 0, 0.1) inset,
0px 1px 1px 0px #fff inset;
}
.card-wrapper-dark {
border-radius: 12px;
background: var(
--Linear-dark,
linear-gradient(
268deg,
rgba(117, 117, 117, 0.38) 0%,
rgba(121, 119, 128, 0.33) 100%
)
);
box-shadow:
0px 4px 12px 0px rgba(0, 0, 0, 0.12),
0px -1px 1px 0px rgba(0, 0, 0, 0.1) inset,
0px 0.2px 1px 0px #fff inset;
}
.card {
@apply rounded-xl border bg-gray-50 border-gray-50 dark:border-[#202231] dark:bg-[#111217]/50;

View File

@ -1,15 +1,17 @@
@import "tailwindcss/base";
@import "tailwindcss/components";
@import "tailwindcss/utilities";
@import url('https://fonts.googleapis.com/css2?family=Josefin+Sans:ital,wght@0,100..700;1,100..700&display=swap&family=Inter:wght@100..900&display=swap');
@import "./components/base.scss";
@import "./components/typography.scss";
@import "./components/card.scss";
@import 'tailwindcss/base';
@import 'tailwindcss/components';
@import 'tailwindcss/utilities';
@import "./tweaks/navbar.scss";
@import "./tweaks/breadcrumb.scss";
@import "./tweaks/markdown.scss";
@import "./tweaks/redocusaurus.scss";
@import "./tweaks/sidebar.scss";
@import './components/base.scss';
@import './components/typography.scss';
@import './components/card.scss';
@import "../css/custom.css";
@import './tweaks/navbar.scss';
@import './tweaks/breadcrumb.scss';
@import './tweaks/markdown.scss';
@import './tweaks/redocusaurus.scss';
@import './tweaks/sidebar.scss';
@import '../css/custom.css';

View File

@ -2,7 +2,7 @@
@apply bg-transparent py-0 shadow-none px-0;
&__inner {
@apply border border-gray-200 dark:border-gray-800 bg-white/80 dark:bg-[#09090B]/50 backdrop-blur-md flex items-center h-14 px-4 lg:px-8 relative;
@apply border-b border-gray-200 dark:border-gray-800 bg-white/80 dark:bg-[#09090B]/50 backdrop-blur-md flex items-center h-14 px-4 lg:px-8 relative;
}
&__logo {
@ -19,7 +19,7 @@
font-size: 18px;
}
[class*="searchBox_"] {
[class*='searchBox_'] {
display: none;
}
}

View File

@ -1,23 +1,33 @@
import React from "react";
import clsx from "clsx";
import ErrorBoundary from "@docusaurus/ErrorBoundary";
import React from 'react'
import clsx from 'clsx'
import ErrorBoundary from '@docusaurus/ErrorBoundary'
import {
PageMetadata,
SkipToContentFallbackId,
ThemeClassNames,
} from "@docusaurus/theme-common";
import { useKeyboardNavigation } from "@docusaurus/theme-common/internal";
import SkipToContent from "@theme/SkipToContent";
import AnnouncementBar from "@theme/AnnouncementBar";
import Navbar from "@theme/Navbar";
import Footer from "@site/src/containers/Footer";
import LayoutProvider from "@theme/Layout/Provider";
import ErrorPageContent from "@theme/ErrorPageContent";
import styles from "./styles.module.scss";
import NavBarExtension from "../NavbarExtension";
import { useLocation } from "react-router-dom";
} from '@docusaurus/theme-common'
import { useKeyboardNavigation } from '@docusaurus/theme-common/internal'
import SkipToContent from '@theme/SkipToContent'
import AnnouncementBar from '@theme/AnnouncementBar'
import Navbar from '@theme/Navbar'
import Footer from '@site/src/containers/Footer'
import LayoutProvider from '@theme/Layout/Provider'
import ErrorPageContent from '@theme/ErrorPageContent'
import styles from './styles.module.scss'
import NavBarExtension from '../NavbarExtension'
import { useLocation } from 'react-router-dom'
const allowedPaths = ["/docs/", "/developer/", "/api-reference/", "/guides/", "/guides", "/docs", "/developer", "/api-reference", "/changelog"];
const allowedPaths = [
'/docs/',
'/developer/',
'/api-reference/',
'/guides/',
'/guides',
'/docs',
'/developer',
'/api-reference',
'/changelog',
]
export default function Layout(props) {
const {
@ -27,12 +37,14 @@ export default function Layout(props) {
// Not really layout-related, but kept for convenience/retro-compatibility
title,
description,
} = props;
useKeyboardNavigation();
} = props
useKeyboardNavigation()
const location = useLocation();
const location = useLocation()
const isAllowedPath = allowedPaths.some(path => location.pathname.startsWith(path));
const isAllowedPath = allowedPaths.some((path) =>
location.pathname.startsWith(path)
)
return (
<LayoutProvider>
@ -42,20 +54,19 @@ export default function Layout(props) {
<AnnouncementBar />
<Navbar/>
<Navbar />
{isAllowedPath ? <NavBarExtension /> : ""}
{isAllowedPath ? <NavBarExtension /> : ''}
{/* {console.log("Is allowed path?", location.pathname)} */}
<div
id={SkipToContentFallbackId}
className={clsx(
ThemeClassNames.wrapper.main,
styles.mainWrapper,
wrapperClassName,
isAllowedPath && "mt-0 md:mt-11"
isAllowedPath && 'mt-0 md:mt-11'
)}
>
<ErrorBoundary fallback={(params) => <ErrorPageContent {...params} />}>
@ -65,5 +76,5 @@ export default function Layout(props) {
{!noFooter && <Footer />}
</LayoutProvider>
);
)
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 201 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 214 KiB

BIN
docs/static/img/homepage/features01.webp vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 113 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 108 KiB

BIN
docs/static/img/homepage/features02.webp vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

BIN
docs/static/img/homepage/features03.webp vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 80 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 77 KiB

BIN
docs/static/img/homepage/features04.webp vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 74 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 77 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Some files were not shown because too many files have changed in this diff Show More