Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,11 @@ jobs:
- name: Test
run: dotnet test Filee.slnx --no-build -c Release --logger "trx" --results-directory TestResults

# Compiles installer/Filee.iss against a stub app without compression: catches script errors in about a minute.
- name: Check installer script
shell: pwsh
run: ./build/build-installer.ps1 -CheckOnly

- name: Upload UI screenshots
if: always()
uses: actions/upload-artifact@v4
Expand Down
63 changes: 9 additions & 54 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
# Builds the Windows installer and publishes it to GitHub Releases.
# Trigger: push a tag like v1.0.0 (git tag v1.0.0 && git push origin v1.0.0)
#
# Output (Velopack): Filee-<version>-win-Setup.exe, Filee-<version>-win-Portable.zip, and the update feed
# (releases.win.json + full/delta .nupkg) the next release builds its delta package from.
# Output (build/build-installer.ps1): Filee-<version>-win-Setup.exe (Inno Setup, installer/Filee.iss),
# Filee-<version>-win-Portable.zip and Filee-<version>-SHA256SUMS.txt.
# Release notes are generated by GitHub from the pull requests merged since the previous release, grouped by label
# (.github/release.yml), with their authors and new contributors.
# Large engines are not in the installer; the app offers them on first run and in Settings > Engines.
# Large engines are not in the installer; its engine page (or the app, on first run and in Settings > Engines)
# downloads them.
name: Release

on:
Expand All @@ -18,8 +19,6 @@ permissions:
jobs:
windows:
runs-on: windows-latest
env:
PUBLISH_DIR: publish/win-x64
steps:
- uses: actions/checkout@v4

Expand Down Expand Up @@ -58,61 +57,17 @@ jobs:
- name: Test
run: dotnet test Filee.slnx -c Release

- name: Publish
run: >
dotnet publish src/Filee.App/Filee.App.csproj -c Release -r win-x64 --self-contained
-p:Version=${{ steps.version.outputs.value }}
-p:PublishReadyToRun=true
-o ${{ env.PUBLISH_DIR }}

# Must sit next to Filee.exe: the package's external location is the install folder.
- name: Add Explorer menu extension
shell: pwsh
run: Copy-Item build/.cache/explorer-menu/FileeExplorerMenu.dll, build/.cache/explorer-menu/FileeExplorerMenu.msix "${{ env.PUBLISH_DIR }}"

# Only the small rhwp is bundled. LibreOffice (+ H2Orestart, Java) and Pandoc are large and are downloaded by
# the app when the user picks them (first-run setup or Settings > Engines), see engines.json.
- name: Bundle conversion engines (rhwp, 7-Zip)
shell: pwsh
run: ./build/fetch-engines.ps1 -Only rhwp,7zip -Destination "${{ env.PUBLISH_DIR }}/engines"

- name: Install Velopack CLI
run: dotnet tool install -g vpk

- name: Download previous release (for delta updates)
run: vpk download github --repoUrl ${{ github.server_url }}/${{ github.repository }} --token ${{ secrets.GITHUB_TOKEN }} -o Releases
continue-on-error: true

- name: Pack
run: >
vpk pack --packId Filee --packVersion ${{ steps.version.outputs.value }}
--packDir ${{ env.PUBLISH_DIR }} --mainExe Filee.exe --packTitle Filee
--icon src/Filee.App/Assets/Icons/filee.ico -o Releases

# People download these two, so their names carry the version. The update feed keeps Velopack's names.
- name: Name downloads after the version
# Publishes the app (Release, self-contained, ReadyToRun) with the Explorer menu extension and the bundled rhwp
# and 7-Zip, then compiles the installer (portable Inno Setup, pinned and verified) and zips the portable copy.
- name: Build installer and portable zip
shell: pwsh
run: |
$version = '${{ steps.version.outputs.value }}'
Get-ChildItem Releases -Filter '*-Setup.exe' | Rename-Item -NewName "Filee-$version-win-Setup.exe"
Get-ChildItem Releases -Filter '*-Portable.zip' | Rename-Item -NewName "Filee-$version-win-Portable.zip"
Get-ChildItem Releases | Format-Table Name, Length
run: ./build/build-installer.ps1 -Version ${{ steps.version.outputs.value }} -Portable

- name: Publish the GitHub release
shell: pwsh
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
$version = '${{ steps.version.outputs.value }}'
# Releases/ also holds the previous version's full package, downloaded only to build the delta: publish this
# version's files, and trim the update feed to them so the release lists only what it carries.
$feedPath = 'Releases/releases.win.json'
$feed = Get-Content $feedPath -Raw | ConvertFrom-Json
$feed.Assets = @($feed.Assets | Where-Object Version -eq $version)
$feed | ConvertTo-Json -Depth 5 -Compress | Set-Content $feedPath -Encoding utf8 -NoNewline
$pattern = "-$([regex]::Escape($version))-"
(Get-Content Releases/RELEASES) | Where-Object { $_ -match $pattern } | Set-Content Releases/RELEASES -Encoding utf8BOM
$files = Get-ChildItem Releases -File |
Where-Object { $_.Name -in 'releases.win.json', 'RELEASES' -or $_.Name -like "Filee-$version-*" } |
ForEach-Object FullName
$files = Get-ChildItem Releases -File -Filter "Filee-$version-*" | ForEach-Object FullName
gh release create '${{ github.ref_name }}' --title "Filee $version" --generate-notes --verify-tag @files
12 changes: 10 additions & 2 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -53,5 +53,13 @@ Read [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md) first. In short:

## Releasing (maintainers)

Push a tag `vX.Y.Z`. `.github/workflows/release.yml` builds, bundles the engines, packs with Velopack and publishes
the installer and update packages to GitHub Releases.
Bump `<Version>` in `Directory.Build.props`, merge, then push a tag `vX.Y.Z`. `.github/workflows/release.yml` runs the
tests and `build/build-installer.ps1 -Portable`: it publishes the app (`-p:FileeRelease=true`, which lets it register
Explorer and startup entries), adds the Explorer menu extension and the bundled rhwp and 7-Zip, compiles
`installer/Filee.iss` with a pinned, portable Inno Setup, and uploads `Filee-X.Y.Z-win-Setup.exe`, the portable zip and
their SHA-256 sums with release notes generated from the merged pull requests.

To try the installer locally run `pwsh build/build-installer.ps1` (output in `Releases/`). Setup needs administrator
rights; `pwsh build/build-installer.ps1 -CheckOnly` only compiles the script. The installer's engine page and some of
its texts are generated from `EngineDownloads` and the app's translations (`build/tools/make-installer-engines.cs`);
its own texts are in the `[CustomMessages]` section of `installer/Filee.iss` (English, Korean, Simplified Chinese).
2 changes: 1 addition & 1 deletion Directory.Build.props
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
parameters of a member is fine (CS1573). -->
<NoWarn>$(NoWarn);CS1591;CS1573</NoWarn>

<Version>1.1.0</Version>
<Version>1.2.0</Version>
<Product>Filee</Product>
<Authors>Filee contributors</Authors>
<Copyright>Copyright (c) Filee contributors</Copyright>
Expand Down
1 change: 0 additions & 1 deletion Directory.Packages.props
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,6 @@
<PackageVersion Include="Microsoft.Extensions.Logging" Version="10.0.12" />
<PackageVersion Include="Microsoft.Extensions.Logging.Abstractions" Version="10.0.12" />
<PackageVersion Include="SharpHook" Version="8.0.0" />
<PackageVersion Include="Velopack" Version="1.2.161" />
</ItemGroup>

<ItemGroup Label="Conversion engines">
Expand Down
13 changes: 8 additions & 5 deletions README.ko.md
Original file line number Diff line number Diff line change
Expand Up @@ -106,15 +106,18 @@
## 시작하기

**설치:** [Releases](https://github.com/KnifeLemon/Filee/releases/latest)에서 최신 `Filee-<버전>-win-Setup.exe`를
받으세요(Windows 10/11, 64비트).
받아 실행하세요(Windows 10/11, 64비트). 관리자 권한을 한 번 요청하고, 모든 사용자를 위해 Program Files에 설치해요.
설치 없이 쓰고 싶다면 `Filee-<버전>-win-Portable.zip`을 원하는 곳에 풀고 `Filee.exe`를 실행하면 돼요.

- **자주 쓰는 형식은 설치 파일에 다 들어 있어요.** 이미지, PDF, 워드, 엑셀, 파워포인트, HWP, 전자책, 압축 파일, 글꼴, CAD는
설치하자마자 변환돼요.
- **큰 엔진은 골라서 설치해요.** 처음 실행하면 동영상·오디오용 엔진(FFmpeg, 약 100MB)과 드문 형식용 엔진(LibreOffice,
calibre, Ghostscript, Pandoc)을 크기와 함께 보여 줘요. 설정 → 변환 엔진에서 다운로드 속도와 남은 시간을 보며 언제든
설치하거나 지울 수 있어요.
- **설치하면서 골라요.** 탐색기 우클릭 메뉴의 “Filee로 변환”(Windows 11에서는 “추가 옵션 표시” 없이 기본 메뉴에도),
로그인할 때 시작, 그리고 추가 엔진을 크기를 보며 고를 수 있어요: 동영상·오디오(FFmpeg, 약 100MB)와 드문
형식(LibreOffice, calibre, Ghostscript, Pandoc). 고른 엔진은 설치가 끝나고 Filee가 시작되면서 내려받고, 설정 → 변환
엔진에서 다운로드 속도와 남은 시간을 보며 언제든 설치하거나 지울 수 있어요.
- **업데이트는 알려 드려요.** 새 버전이 나오면 메뉴 하단, 알림, 트레이 메뉴에 표시되고 누르면 최신 릴리스 페이지가
열려요. 새 설치 파일을 실행하면 설정은 그대로 유지돼요.
열려요. 새 설치 파일을 실행하면 Filee를 닫고 업데이트하며, 설정과 엔진은 그대로 유지돼요. 사용자별로 설치된
Filee 1.1 이하도 같은 방법으로 넘겨받아요.

macOS 지원은 계획 중입니다.

Expand Down
19 changes: 13 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -109,15 +109,20 @@ never uses programs installed on your PC. Optional engines Filee offers to downl
## Get started

**Install:** download the latest `Filee-<version>-win-Setup.exe` from
[Releases](https://github.com/KnifeLemon/Filee/releases/latest) (Windows 10/11, 64-bit).
[Releases](https://github.com/KnifeLemon/Filee/releases/latest) (Windows 10/11, 64-bit) and run it. Setup asks for
administrator rights once and installs Filee for all users in Program Files. Prefer no installer? Unzip
`Filee-<version>-win-Portable.zip` anywhere and run `Filee.exe`.

- **Everything common is in the installer.** Images, PDF, Word, Excel, PowerPoint, HWP, e-books, archives, fonts and
CAD work right away.
- **Large engines are optional.** On first start Filee offers the engines for video and audio (FFmpeg, ~100 MB) and for
rare formats (LibreOffice, calibre, Ghostscript, Pandoc), each with its size. Install or remove them any time in
Settings → Engines, which shows download speed and time left.
- **Choose in Setup.** Add “Convert with Filee” to the File Explorer menu (on Windows 11 also at the top of the menu,
not only under “Show more options”), start Filee when you sign in, and pick optional engines: video and audio
(FFmpeg, ~100 MB) and rare formats (LibreOffice, calibre, Ghostscript, Pandoc), each with its size. Filee downloads
the chosen engines when Setup starts it; install or remove them any time in Settings → Engines, which shows download
speed and time left.
- **You hear about updates.** When a new release is out, Filee says so at the bottom of the menu, in a notice and in
the tray menu, and opens the latest release to download it. Run the new installer; your settings are kept.
the tray menu, and opens the latest release to download it. Run the new installer: it closes Filee, updates it and
keeps your settings and engines. Filee 1.1 and earlier (installed per user) are taken over the same way.

macOS support is planned.

Expand All @@ -135,7 +140,9 @@ dotnet run --project src/Filee.App
dotnet test
```

Settings live in `%APPDATA%\Filee`. Debug builds never touch the Explorer context menu or auto-start.
Settings live in `%APPDATA%\Filee`. Builds from source never touch the Explorer context menu or auto-start.
`pwsh build/build-installer.ps1` publishes Filee and builds the installer into `Releases/` (it downloads a pinned,
portable Inno Setup into `build/.cache`; nothing is installed).

| Project | What it is |
|---|---|
Expand Down
11 changes: 7 additions & 4 deletions README.zh-CN.md
Original file line number Diff line number Diff line change
Expand Up @@ -103,13 +103,16 @@
## 快速开始

**安装:** 在 [Releases](https://github.com/KnifeLemon/Filee/releases/latest) 下载最新的
`Filee-<版本>-win-Setup.exe`(Windows 10/11,64 位)。
`Filee-<版本>-win-Setup.exe`(Windows 10/11,64 位)并运行。安装程序会请求一次管理员权限,为所有用户安装到
Program Files。不想安装?把 `Filee-<版本>-win-Portable.zip` 解压到任意位置,运行 `Filee.exe` 即可。

- **常用格式都已包含在安装包中。** 图片、PDF、Word、Excel、PowerPoint、HWP、电子书、压缩包、字体和 CAD 装好即用。
- **大型引擎按需下载。** 首次启动时会列出视频/音频引擎(FFmpeg,约 100 MB)和少见格式引擎(LibreOffice、calibre、
Ghostscript、Pandoc)及其大小;之后可随时在“设置 → 转换引擎”中安装或删除,并显示下载速度和剩余时间。
- **安装时即可选择。** 在资源管理器右键菜单中添加“用 Filee 转换”(Windows 11 上还可直接显示在主菜单,无需点
“显示更多选项”)、登录时启动,并按大小挑选可选引擎:视频/音频(FFmpeg,约 100 MB)和少见格式(LibreOffice、
calibre、Ghostscript、Pandoc)。所选引擎会在安装完成、Filee 启动后下载;之后可随时在“设置 → 转换引擎”中安装或
删除,并显示下载速度和剩余时间。
- **有更新会提醒你。** 新版本发布后,Filee 会在菜单底部、通知和托盘菜单中提示,点击即可打开最新发布页面下载。
运行新的安装程序即可更新,设置会保留。
运行新的安装程序会关闭 Filee 并完成更新,设置和引擎都会保留。按用户安装的 Filee 1.1 及更早版本也会以同样方式接管。

macOS 版本正在计划中。

Expand Down
10 changes: 9 additions & 1 deletion THIRD-PARTY-NOTICES.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ Each component remains under its own license.
| Avalonia UI | MIT | https://github.com/AvaloniaUI/Avalonia |
| CommunityToolkit.Mvvm | MIT | https://github.com/CommunityToolkit/dotnet |
| SharpHook (libuiohook) | MIT (libuiohook: GPL-3.0 with linking exception / LGPL-3.0) | https://github.com/TolikPylypchuk/SharpHook |
| Velopack | MIT | https://github.com/velopack/velopack |
| Magick.NET / ImageMagick | Apache-2.0 / ImageMagick License | https://github.com/dlemstra/Magick.NET |
| ImageMagick delegate libraries (libheif, libde265, libwebp, libjpeg-turbo, libpng, libtiff, zlib, …) | Various (LGPL-2.1+, BSD, zlib) | bundled inside Magick.NET |
| PDFsharp | MIT | https://github.com/empira/PDFsharp |
Expand Down Expand Up @@ -74,6 +73,15 @@ Windows headers, without a C runtime. Pieces of these projects that can end up i
| Zig compiler_rt (compiler support routines) | MIT | https://github.com/ziglang/zig |
| mingw-w64 Windows headers and import library definitions | Public domain / ZPL-2.1 | https://www.mingw-w64.org |

## Installer

`Filee-<version>-win-Setup.exe` is built with Inno Setup (a build tool, not part of the app); the setup and uninstall
programs inside it are Inno Setup's.

| Component | License | Project |
|---|---|---|
| Inno Setup (Copyright (C) 1997-2026 Jordan Russell, portions Copyright (C) 2000-2026 Martijn Laan) | Inno Setup License | https://jrsoftware.org/isinfo.php |

## Fonts and icons

| Component | License | Project |
Expand Down
Loading
Loading