Skip to content

Commit

Permalink
Merge branch 'docs/install-succinct' into docs/fix-error-messages
Browse files Browse the repository at this point in the history
  • Loading branch information
dan-menlo committed Nov 23, 2023
2 parents a22e41d + 07b01e8 commit 6110de4
Show file tree
Hide file tree
Showing 5 changed files with 99 additions and 42 deletions.
59 changes: 49 additions & 10 deletions docs/docs/install/windows.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,19 +2,58 @@
title: Windows
---

# Jan on Windows
# Installing Jan on Windows

## Installation
1. To download the lastest version of Jan on Windows, please visit the [Jan's homepage](https://jan.ai/).
2. Once Jan installer (jan-win-x64-{version}.exe) is downloaded, run the installer. The installation process is expected to take around a minute.
3. By default, Jan is installed under this directory

Jan is available for download via our homepage, [https://jan.ai](https://jan.ai/).

For Windows, the download should be available as a `.exe` file in the following format.

```bash
jan-win-x64-{version}.exe
```

The typical installation process takes around a minute.

### Github Releases

Jan is also available from [Jan's Github Releases](https://github.com/janhq/jan/releases) page, with a recommended [latest stable release](https://github.com/janhq/jan/releases/latest).

Within the Releases' assets, you will find the following files for Windows:

```bash
# Windows Installers
jan-win-x64-{version}.exe
```

### Default Installation Directory

By default, Jan is installed in the following directory:

```bash
# Default installation directory
C:\Users\{username}\AppData\Local\Programs\Jan
```
## Uninstall Jan
If you have installed Jan on your Windows computer, either as a User or System installation, you can easily uninstall it by going to the Windows Control Panel.
In case you wish to completely remove all user data associated with Jan after uninstallation, you can delete the user data folders located at `%APPDATA%\Jan`. This will return your system to its state prior to the installation of Jan. This method can also be used to reset all settings if you are experiencing any issues with Jan.

## Common Questions
### Microsoft Defender SmartScreen prevented an unrecognized app from starting
When initiating the Jan Installer, be aware that Windows Defender may display a warning. This warning is a standard security measure, as the installer will make changes to the system. To proceed with the installation, navigate through the warning options, typically found in "More info" section and select the appropriate option to continue with the installation.
## Uninstalling Jan

To uninstall Jan in Windows, use the [Windows Control Panel](https://support.microsoft.com/en-us/windows/uninstall-or-remove-apps-and-programs-in-windows-4b55f974-2cc6-2d2b-d092-5905080eaf98).

To remove all user data associated with Jan, you can delete the `/Jan` directory in Windows' [AppData directory](https://superuser.com/questions/632891/what-is-appdata).

```shell
# Jan's User Data directory
%AppData%\Jan
```

## Troubleshooting

### Microsoft Defender

**Error: "Microsoft Defender Smartscreen prevented an unrecognized app from starting"**

Windows Defender may display the above warning when running the Jan Installer, as a standard security measure.

To proceed, select the "More info" option and select the "Run Anyway" option to continue with the installation.

8 changes: 7 additions & 1 deletion docs/sidebars.js
Original file line number Diff line number Diff line change
Expand Up @@ -25,9 +25,15 @@ const sidebars = {
{
type: "category",
label: "Installation",
link: { type: "doc", id: "install/overview" },
collapsible: true,
collapsed: true,
items: ["install/overview","install/windows", "install/mac", "install/linux", "install/from-source"],
items: [
"install/windows",
"install/mac",
"install/linux",
"install/from-source",
],
},
{
type: "category",
Expand Down
2 changes: 0 additions & 2 deletions web/containers/ModalCancelDownload/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@ import {
import { atom, useAtomValue } from 'jotai'

import { useDownloadState } from '@/hooks/useDownloadState'
import useGetPerformanceTag from '@/hooks/useGetPerformanceTag'

import { formatDownloadPercentage } from '@/utils/converter'

Expand All @@ -30,7 +29,6 @@ export default function ModalCancelDownload({
isFromList,
}: Props) {
const { modelDownloadStateAtom } = useDownloadState()
useGetPerformanceTag()
const downloadAtom = useMemo(
() => atom((get) => get(modelDownloadStateAtom)[suitableModel.name]),
// eslint-disable-next-line react-hooks/exhaustive-deps
Expand Down
45 changes: 21 additions & 24 deletions web/hooks/useGetPerformanceTag.ts
Original file line number Diff line number Diff line change
@@ -1,40 +1,37 @@
import { useState } from 'react'

import { ModelVersion } from '@janhq/core/lib/types'
import { useAtomValue } from 'jotai'

import { ModelPerformance, TagType } from '@/constants/tagType'

import { totalRamAtom } from '@/helpers/atoms/SystemBar.atom'

// Recommendation:
// `Recommended (green)`: "Max RAM required" is 80% of users max RAM.
// `Slow on your device (yellow)`: Max RAM required is 80-100% of users max RAM
// `Not enough RAM (red)`: User RAM is below "Max RAM required"

export default function useGetPerformanceTag() {
const [performanceTag, setPerformanceTag] = useState<TagType | undefined>()
const totalRam = useAtomValue(totalRamAtom)

const getPerformanceForModel = async (modelVersion: ModelVersion) => {
async function getPerformanceForModel(
modelVersion: ModelVersion,
totalRam: number
): Promise<{ title: string; performanceTag: TagType }> {
const requiredRam = modelVersion.maxRamRequired
setPerformanceTag(calculateRamPerformance(requiredRam, totalRam))
}

let title = ''
switch (performanceTag) {
case ModelPerformance.PerformancePositive:
title = 'Recommended'
break
case ModelPerformance.PerformanceNeutral:
title = 'Slow on your device'
break
case ModelPerformance.PerformanceNegative:
title = 'Not enough RAM'
break
const performanceTag = calculateRamPerformance(requiredRam, totalRam)

let title = ''

switch (performanceTag) {
case ModelPerformance.PerformancePositive:
title = 'Recommended'
break
case ModelPerformance.PerformanceNeutral:
title = 'Slow on your device'
break
case ModelPerformance.PerformanceNegative:
title = 'Not enough RAM'
break
}
return { title, performanceTag }
}

return { performanceTag, title, getPerformanceForModel }
return { getPerformanceForModel }
}

const calculateRamPerformance = (
Expand Down
27 changes: 22 additions & 5 deletions web/screens/ExploreModels/ExploreModelItemHeader/index.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/* eslint-disable react-hooks/exhaustive-deps */
import { useCallback, useEffect, useMemo } from 'react'
import { useCallback, useEffect, useMemo, useState } from 'react'

import { ModelCatalog, ModelVersion } from '@janhq/core/lib/types'
import { Badge, Button } from '@janhq/uikit'
Expand All @@ -20,6 +20,8 @@ import { useMainViewState } from '@/hooks/useMainViewState'

import { toGigabytes } from '@/utils/converter'

import { totalRamAtom } from '@/helpers/atoms/SystemBar.atom'

type Props = {
suitableModel: ModelVersion
exploreModel: ModelCatalog
Expand All @@ -32,18 +34,33 @@ const ExploreModelItemHeader: React.FC<Props> = ({
const { downloadModel } = useDownloadModel()
const { downloadedModels } = useGetDownloadedModels()
const { modelDownloadStateAtom, downloadStates } = useDownloadState()
const { performanceTag, title, getPerformanceForModel } =
useGetPerformanceTag()
const { getPerformanceForModel } = useGetPerformanceTag()
const [title, setTitle] = useState<string>('Recommended')
const totalRam = useAtomValue(totalRamAtom)
const [performanceTag, setPerformanceTag] = useState<TagType>(
ModelPerformance.PerformancePositive
)
const downloadAtom = useMemo(
() => atom((get) => get(modelDownloadStateAtom)[suitableModel.name]),
[suitableModel.name]
)
const downloadState = useAtomValue(downloadAtom)
const { setMainViewState } = useMainViewState()

const calculatePerformance = useCallback(
(suitableModel: ModelVersion) => async () => {
const { title, performanceTag } = await getPerformanceForModel(
suitableModel,
totalRam
)
setPerformanceTag(performanceTag)
setTitle(title)
},
[totalRam]
)

useEffect(() => {
getPerformanceForModel(suitableModel)
// eslint-disable-next-line react-hooks/exhaustive-deps
calculatePerformance(suitableModel)
}, [suitableModel])

const onDownloadClick = useCallback(() => {
Expand Down

0 comments on commit 6110de4

Please sign in to comment.