# Wallpaper Companion — User Manual

> Illustrated edition: real application widgets with isolated demo data. All screenshots show the Chinese app. Displayed paths and rule values are examples; no live wallpaper, personal settings, speech API, or payment was used. Keep the `images` folder beside this Markdown file when viewing or exporting to PDF. Download the illustrated ZIP to obtain all files.


Documentation baseline: v0.8.1. Prepared: October 31, 2026. Later releases may use different labels; consult the bundled manual and repository for changes. English labels below describe the corresponding controls in the Chinese application; this website translation does not translate the desktop application itself.

Project: https://github.com/Abs0lutely/wallpaper-companion

Download: https://github.com/Abs0lutely/wallpaper-companion/releases/latest

## Contents

1. Purpose and requirements
2. Download and installation
3. Interface and saving changes
4. Bind your first wallpaper
5. Import voice clips and music
6. Create your first F8 rule
7. Mouse events and scheduled greetings
8. BGM playback and conflict prevention
9. Dialogue library and dialogue packs
10. Generate audio with a TTS service
11. Multiple wallpapers and shared resources
12. Sharing, backups, and updates
13. Appearance, tray, and runtime settings
14. Frequently asked questions
15. Report a problem

## 1. Purpose and requirements

Wallpaper Companion is a standalone Windows audio companion for Wallpaper Engine (WE). It plays voice clips in response to input events or time rules and plays music from a selected folder. It does not modify WE or downloaded wallpapers. Wallpapers do not need built-in interaction support.

Prepare Windows 10/11 x64, WE if you want automatic wallpaper following, and at least one playable voice clip. A known-good WAV or MP3 is suitable for the first test. A music folder and a configured TTS service are optional.

Packaged Windows releases do not require Python or Conda. A source installation or local GPT-SoVITS setup requires its own environment.

**Text, audio, and rules are separate.** The dialogue library stores text. Imported or generated audio supplies the sound. Rules determine when to play it. Importing text does not automatically generate speech or call a paid service.

Releases do not include wallpapers, character models, or personal audio. Supply resources you are entitled to use.

## 2. Download and installation

### Choose the correct release asset

1. Open the latest release page and expand Assets.
2. Download `*-setup.exe` for an installer, or `*-portable.zip` for a portable installation.
3. GitHub's automatic Source code ZIP/TAR archives are source packages, not ready-to-run Windows applications.

### Installer

1. Run setup.exe and follow the installation wizard.
2. Open Wallpaper Companion. The installer normally does not need administrator rights.
3. User configuration is stored in `%LOCALAPPDATA%\WallpaperCompanion`.
4. Default shared audio is stored in `shared` inside the application installation directory, separate from user configuration.

### Portable ZIP

1. Extract the entire ZIP to a writable directory.
2. Keep `WallpaperCompanion.exe`, `_internal`, and `portable.flag` in their supplied relative locations.
3. Run `WallpaperCompanion.exe` after extraction, not inside the archive preview.
4. Portable configuration is in the adjacent `data` folder. Default shared resources are in the adjacent `shared` folder.

Before testing, check the Windows output device and volume. Apply a wallpaper in WE, then open Companion. Optional hover tips appear after about one second when enabled.

## 3. Interface and saving changes

![Figure 1 · Home: choose a profile before testing playback](images/01-home.png)

*Figure 1 · Home: choose a profile before testing playback*

**Look at the picture, then follow these controls**

| Location in the screenshot | What to do |
|---|---|
| Left profile list | Choose the intended profile; use 配置管理 → 新建配置 for an unbound test profile. |
| Center 正在编辑 selector | Verify the editing profile; it is not necessarily the playing profile. |
| 声音设置 tab | Adjust voice/music levels and cooldowns. |
| Bottom 随机试听语音 and 保存配置 | Save and preview first, then return to the desktop for automatic input triggers. |

> Success check: you can identify the profile, preview button, and save button.



| Area | Purpose |
|---|---|
| Home (陪伴主页) | Status, playback, sound settings, resource bindings, interaction rules |
| Wallpaper library (壁纸库) | Read-only scans, search, bulk binding |
| Audio library (音频库) | Preview, import by copying, manage shared folders |
| Dialogue library (台词库) | Categorized text, import/export, selected-line generation |
| Speech generation (语音生成) | Services, character presets, generation parameters |
| Settings (设置) | WE paths, monitor, appearance, startup, extensions |
| Runtime log (运行记录) | Trigger, playback, scan, and generation information |

Older layouts may group sound controls under 声音与互动. Follow the function name if the entry point differs.

Distinguish the wallpaper detected in WE, the profile currently being edited, and the profile currently playing. Editing a profile does not necessarily switch playback. The bottom player controls the playing profile.

Save sound changes with 保存配置, rules with 保存配置与规则, and text with 保存台词库. A successful preview does not save edits.

## 4. Bind your first wallpaper

1. Apply the target wallpaper in WE.
2. Click Detect now (立即检测) in Companion.
3. Verify the detected name/path, then Bind current wallpaper (绑定当前壁纸).
4. Give the profile a recognizable name, enable it, and save.

An existing binding opens its existing profile. If detection fails, check the WE directory containing `wallpaper32.exe` or `wallpaper64.exe`, the Workshop directory, and the followed monitor. Monitor numbering starts at 0; one monitor is followed at a time. WE may save its selection with a delay, so use Detect now again.

You can also create an unbound profile and enable manual use of the selected profile to test sound first. Disable manual mode to resume automatic following. Deleting a profile removes its binding, not the wallpaper or audio files.

## 5. Import voice clips and music

Example resource layout:

```text
WallpaperCompanion/
  WallpaperCompanion.exe
  shared/
    voice/
      Morning/
        hello.wav
      Click/
        take-a-break.wav
    bgm/
      music-01.mp3
    dialogues.json       # created when shared dialogue is saved
```

Names are examples. Rule category names must match the actual subfolders. Do not put personal audio in `_internal`.

### Bind an existing folder

![Figure 2 · Resources: bind the folder that actually contains audio](images/02-resources.png)

*Figure 2 · Resources: bind the folder that actually contains audio*

**Look at the picture, then follow these controls**

| Location in the screenshot | What to do |
|---|---|
| 资源与绑定 tab | Open from Home. |
| 语音文件夹 and 浏览… | Choose a directory containing real WAV/MP3 clips. |
| BGM 文件夹 and 浏览… | Choose a music folder, or leave it empty if unused. |
| 资源根目录 / 共用台词文件 | Check shared paths. D:/WallpaperCompanion is an example, not a required location. |
| Bottom-right 保存配置 | Save, then use the bottom-left voice preview. |

> Success check: a real clip plays, rather than merely a path being entered.



1. Open Resources and bindings (资源与绑定), or the corresponding sound settings.
2. Select the voice folder and optional BGM folder.
3. Save the profile.
4. Use Random voice preview (随机试听语音). Establish working playback before configuring automatic triggers.

### Import through the audio library

1. Open the audio library and choose the copy destination: shared audio or a profile's bound folder.
2. Optionally enter a category subfolder; leave it blank for the destination root.
3. Import audio files. This copies files, preserves originals, and numbers name collisions.
4. If required, use the destination-for-current-profile voice/BGM button and verify the target profile.
5. Preview the imported file and check rule sources.

WAV, MP3, OGG, FLAC, M4A, AAC, WMA, and OPUS are supported subject to Qt/FFmpeg decoding. Test a known-good WAV/MP3 if a particular file fails.

## 6. Create your first F8 rule

![Figure 3 · Rules: edit the rule, then save the profile](images/04-rules.png)

*Figure 3 · Rules: edit the rule, then save the profile*

**Look at the picture, then follow these controls**

| Location in the screenshot | What to do |
|---|---|
| 互动规则 tab | Open rules for the profile being edited. |
| ＋ 添加规则 below the table | Open the editor, or double-click an existing rule. |
| 试听选中规则 | Checks file matching and playback, not real event/time conditions. |
| Bottom 保存配置与规则 | Persist the final rules to the profile. |

> Success check: the rule is listed and the profile/rules are saved.



1. Confirm Random voice preview works and that you are editing the intended profile.
2. Open Interaction rules (互动规则) and add an enabled rule named “F8 test.”
3. Select event trigger (按事件触发), then keyboard (键盘触发).
4. Choose a specific key/combination, click Record key (录制按键), and press F8.
5. For the playback source, choose random audio from the voice root. Leave filename filtering blank for the first test.
6. Set a suitable rule cooldown, for example 5 seconds for testing, and check the global cooldown as well. This is an example, not a stated default.
7. Save the rule and profile.
8. Ensure Companion is not paused and the profile is enabled.
9. Return to the desktop and press F8. Desktop-only input is enabled by default; pressing a key inside the settings window normally does not trigger speech.
10. Wait for both cooldowns before retrying.

Expected result: one clip plays and the runtime log shows the trigger. Repeated input should not create a long speech queue.

![Figure 4 · Complete F8 keyboard-rule example](images/05-rule-keyboard.png)

*Figure 4 · Complete F8 keyboard-rule example*

**Look at the picture, then follow these controls**

| Location in the screenshot | What to do |
|---|---|
| ① 触发分类 | Select 按事件触发 (event). |
| 事件分类 / 键盘方式 | Choose keyboard and a specific key/combination. |
| 录制按键 beside 绑定按键 | Record F8; the screenshot shows the finished binding. |
| ② 播放什么 | Start with random playback from the voice root, with no filename filter. |
| 更多设置 → 规则冷却 | The shown 5 seconds is a test example; the global cooldown also applies. |
| Bottom-right 保存规则 | Then save the profile/rules and test F8 on the desktop. |

> Success check: F8 plays one clip on the desktop; wait for both cooldowns before retrying.



## 7. Mouse events and scheduled greetings

### Mouse response

Add an event rule, choose Mouse (鼠标触发), and choose a button or wheel direction. Select the audio source and cooldown, save, and test on the desktop. Mouse rules do not require keyboard bindings.

### Daily fixed time

![Figure 5 · Daily scheduled greeting: 09:00 example](images/06-rule-scheduled.png)

*Figure 5 · Daily scheduled greeting: 09:00 example*

**Look at the picture, then follow these controls**

| Location in the screenshot | What to do |
|---|---|
| ① 触发分类 | Choose time-based triggering. |
| 时间方式 / 每天几点 | Choose a fixed daily time, using the computer local clock. |
| ② 播放什么 / 台词分类 | The example uses the morning category, which must contain audio. |
| 保存规则 | Save both rule and profile; keep the app running during the scheduled minute. |

> Success check: test a few minutes ahead. Past minutes are not replayed.



1. Add a time rule and select the daily fixed-time mode.
2. Enter a local time such as `09:00` and select the greeting audio.
3. Save and keep Companion running, unpaused, and eligible to play during that minute.

Past minutes are not replayed later. Restarting within the same scheduled minute may trigger again. For testing, schedule a few minutes ahead, then restore the desired time.

### Random playback in a time window

![Figure 6 · Overnight random greeting: 22:00–06:00, 600–1200 seconds](images/07-rule-random.png)

*Figure 6 · Overnight random greeting: 22:00–06:00, 600–1200 seconds*

**Look at the picture, then follow these controls**

| Location in the screenshot | What to do |
|---|---|
| 时间方式 | Choose random playback within a time window. |
| 播放时段 | This example crosses midnight; equal start/end means all day. |
| 随机间隔 | Set minimum and maximum seconds. The values shown are examples, not defaults. |
| 台词分类 / 子目录 | Select a category with existing night clips and save. |

> Success check: wait for the initial random interval while inside the active window.



1. Add a time rule and select random playback within a window.
2. Set the window, for example `22:00–06:00`, which crosses midnight.
3. Set minimum/maximum intervals, for example 600–1200 seconds, and select the audio folder.
4. Save and wait. The first clip is not played immediately; the minimum interval is 5 seconds.

Times use the computer's local clock. Equal start/end times mean all day; the end time is excluded. Event rules can optionally use time restrictions in More settings.

Speech does not overlap or build a long queue. If several rules qualify together, list order determines selection. Rule preview checks file matching/playback, not whether real event/time conditions are met.

## 8. BGM playback and conflict prevention

![Figure 7 · Resource page, scrolled down: BGM conflict prevention](images/03-audio-policy.png)

*Figure 7 · Resource page, scrolled down: BGM conflict prevention*

**Look at the picture, then follow these controls**

| Location in the screenshot | What to do |
|---|---|
| Right scrollbar | Scroll to 原壁纸声音与防冲突. |
| 防冲突策略 | The default policy can pause music when wallpaper audio is present or unknown. |
| 手动覆盖检测 | Override only after you have verified that the wallpaper is silent or muted. |
| 保存配置 and bottom player | Save and distinguish a music-only pause from pausing all Companion audio. |

> Success check: identify whether silence comes from a pause, audio policy, folder, or volume.



1. Bind a music folder and enable folder BGM.
2. Set voice and music volumes; optionally enable shuffle.
3. Use the bottom player to pause/resume, skip, and adjust the playing profile's music volume.
4. Set the percentage of BGM retained during speech. With normal BGM at 40% and retention at 25%, speech-time BGM is approximately 10% overall.

Pause BGM affects music only. Pause Companion (暂停伴随) pauses Companion's speech triggers and BGM, not WE. An optional fullscreen setting pauses Companion while a fullscreen application is foregrounded.

The default conflict-prevention policy pauses Companion BGM when the wallpaper has audio evidence or its audio state cannot be confirmed. Voice interactions remain available. An audio track or asset does not prove audible playback right now.

If you have already muted the wallpaper yourself, select the manual “silent/already muted” override and save. Alternatively choose a different conflict policy. Companion does not change WE or system volume for you.

## 9. Dialogue library and dialogue packs

![Figure 8 · Dialogue library: save text separately from audio generation](images/08-dialogues.png)

*Figure 8 · Dialogue library: save text separately from audio generation*

**Look at the picture, then follow these controls**

| Location in the screenshot | What to do |
|---|---|
| Left 台词库 | Open categorized dialogue. |
| Generation checkboxes | Select the lines you want synthesized. |
| Import/export and 保存台词库 below the table | Save after importing JSON/TXT. |
| 按分类生成勾选台词 | Configure a TTS provider first; outputs use category subfolders. |

> Success check: the text is saved and each line intended to play has real audio.



1. Open the dialogue library. In v0.8.1 you can edit shared dialogue before binding a wallpaper.
2. Add entries with a category and text. Category names must not contain path separators.
3. Save. Profiles sharing the same `dialogues.json` share its edits.
4. Add missing default lines (补充默认台词) adds absent text without replacing custom entries.
5. JSON imports preserve category metadata. UTF-8 TXT imports one line per entry, assigned to the default click-response category. Save after deduplication/import.

### The original Chinese dialogue pack

Download `heartfelt-zh-CN.json` from the latest release or repository dialogue examples, import it through 导入台词 JSON / TXT, review the text, and save. It contains 72 original Chinese lines in six categories. The English website/manual does not translate the pack's actual contents. v0.8.0 users can create a profile before importing.

### Generate by category

1. Configure and save a TTS service first.
2. Select the lines to generate.
3. Choose whether to skip existing same-name audio.
4. Use category generation (按分类生成勾选台词). WAV files go into category subfolders of the current voice directory.
5. Applying category trigger rules replaces the rules being edited after confirmation; review before saving.

Changing text does not rename or regenerate existing audio. Deleting a text entry does not delete its WAV. Text in the ordinary generation box is not automatically saved to the dialogue library.

## 10. Generate audio with a TTS service

### Test one sentence first

![Figure 9 · Speech generation: configure a provider, then test one line](images/09-tts.png)

*Figure 9 · Speech generation: configure a provider, then test one line*

**Look at the picture, then follow these controls**

| Location in the screenshot | What to do |
|---|---|
| Top 语音生成扩展 | Choose local GPT-SoVITS, Azure, or a compatible provider. |
| Scrollable parameters | Supply model/reference details or endpoint, credentials, model and voice, as appropriate. |
| 生成保存目录 | Choose the active profile voice directory so rules can find the result. |
| Multiline text box | Use a single short line first. Text in this screenshot is demonstration input, not proof of synthesis. |
| Bottom 生成并保存语音 | Generate, open the output folder, and preview the WAV. |

> Success check: a playable WAV exists; a connection check/model scan alone is not synthesis success.



Choose the provider, save its settings, select an output directory (preferably the current profile's voice folder), and generate one short line. Open the resulting WAV and preview it before a batch. Each line in the generation box is a separate request. Completed files survive a later failure/cancellation.

Cloud services receive the synthesis text and may charge the service account.

### Local GPT-SoVITS

| Field | What to enter |
|---|---|
| API address | Local api_v2 address, e.g. `http://127.0.0.1:9880` |
| Project directory | Root containing `api_v2.py`, not the WAV output directory |
| Python | Matching python.exe; if blank, project `runtime/python.exe` is used |
| GPT / SoVITS models | A compatible `.ckpt` and `.pth` pair |
| Reference audio | A real clip matching the character/model |
| Reference transcript | The exact words spoken in that reference clip, not the new text |
| Languages and speed | Codes supported by the model, such as zh/en/ja; 1.0 is normal speed |

1. Scan the project and select a candidate pair, or choose both weights manually.
2. Select reference audio, verify its exact transcript, and set both languages.
3. Optionally save a character preset. Saving service settings alone does not update a character preset.
4. Generation starts the managed API and loads models when needed. Scanning, selecting a preset, saving, and connection checks do not preload models.
5. Quitting Companion stops its own managed API, but does not stop an externally started API.

Candidate pairing is a hint, not a compatibility test. Leaving both weights blank can reuse the currently loaded model; do not arbitrarily leave only one missing. Switching models on an external API changes shared global state and requires explicit permission in the app. An independent free port is preferable for isolated use.

### Azure Speech

Enter the resource's complete synthesis endpoint, API Key or the name of its environment variable, supported voice ID, locale, and speed. Save, then generate a short sentence. A cloud connection check validates address format; it does not establish working credentials, quota, or voice availability.

### OpenAI-compatible TTS

Enter the provider's complete `/audio/speech` endpoint, supported model ID and voice ID, and its Key/environment-variable name. Remote endpoints require HTTPS. The service must return WAV; other JSON/MP3 protocols require an extension adapter. Test a short sentence after saving.

Keys use Windows Credential Manager. Do not include them in shared files or screenshots.

## 11. Multiple wallpapers and shared resources

Voice, BGM, and dialogue can each be shared or dedicated. Shared folders save space; dedicated folders suit separate characters or soundtracks.

Select a profile, open its shared/dedicated resource dialog, choose each resource mode, verify the actual paths, and save/confirm. Rebinding does not move or delete old files. Use the audio library to copy files when separate copies are wanted.

Changing the default shared root affects new bindings or the next explicit shared selection, not every existing profile. Check each profile rather than assuming a migration occurred.

For bulk binding, scan the wallpaper library, search, and check the intended wallpapers. Filtered-out rows may remain checked. Choose shared audio, shared complete resources, or independent folders; optionally use a profile as the rule/volume/dialogue template. Existing bindings are skipped by default unless the update-existing option is selected.

## 12. Sharing, backups, and updates

### Share interaction JSON

Export selected profiles from the interaction page. On import, review names and counts, then create an unbound profile or apply to the current one. New profiles still need wallpaper and audio bindings. Applying to the current profile replaces rules, dialogue, and playback settings, preserves wallpaper/audio paths, and detaches shared dialogue association. Back up first.

Shared JSON excludes audio, models, keys, local absolute paths, and plugin code. It is not a complete ready-to-play sound pack.

### Back up completely

1. Save edits, wait for generation/copying, and quit from the tray.
2. Back up `%LOCALAPPDATA%\WallpaperCompanion` for the installed version or adjacent `data` for portable.
3. Also back up installation-directory `shared` and all custom external audio/dialogue directories.
4. Preserve personal plugins, models, and reference clips at their actual locations.
5. Interaction JSON alone does not include the real audio or keys.

### Update

Back up, quit fully, then run the new installer or use a complete new portable package. Preserve personal `data`, `shared`, plugins, and external resources; do not overwrite them with empty default folders. Reopen and check profiles, paths, voice preview, F8, and BGM. Normal update/uninstall behavior preserves user data, but a backup is still advisable.

## 13. Appearance, tray, and runtime settings

![Figure 10 · Settings: verify paths, monitor, and runtime options](images/10-settings.png)

*Figure 10 · Settings: verify paths, monitor, and runtime options*

**Look at the picture, then follow these controls**

| Location in the screenshot | What to do |
|---|---|
| Left 设置 | Open runtime and appearance options. |
| WE / Workshop directories | Use actual paths on your computer, not the tutorial examples. |
| Monitor and polling interval | Monitor numbers start at 0; check these when detection seems delayed. |
| Save/startup controls | Save as indicated; backend/extension changes may require a restart. |

> Success check: Detect now identifies the right wallpaper and manual mode is not unintentionally enabled.



- Import a local background; the app processes a copy without modifying the original. Automatic color extraction can be disabled and defaults restored.
- Closing the window usually leaves the app in the tray. Double-click the tray icon to reopen; choose Exit to stop it.
- Login startup is off by default. Enabling it does not preload GPT-SoVITS.
- Polling can be set to 2–60 seconds and reads WE's saved selection.
- Optional ffprobe improves video audio-track detection; without it, detection may be unknown while other functions still work.
- Backend/extension changes may require a restart. Enable only trusted plugin code.

## 14. Frequently asked questions

![Figure 11 · Runtime log: locate the failing stage](images/11-runtime-log.png)

*Figure 11 · Runtime log: locate the failing stage*

**Look at the picture, then follow these controls**

| Location in the screenshot | What to do |
|---|---|
| Left 运行记录 | Inspect actual trigger, selection, generation, or error messages. |
| Right text area | The screenshot is clearly marked as tutorial text, not successful live execution. |
| When reporting an issue | Include relevant real messages, version, steps, and preview results; redact private data. |

> Success check: distinguish no trigger, no matching audio, and playback failure.



### No voice after a key or mouse event

First try Random voice preview. If that fails, check files, folder bindings, Windows output, and volume. If preview works, check the playing profile, enabled/saved rule, desktop foreground, pause/fullscreen state, time restrictions, filename/category filters, and both cooldowns. Then inspect the runtime log.

### BGM is silent but voice works

Check BGM enablement, volume, manual pause, conflict prevention, and folder. Unknown wallpaper audio can trigger default conflict prevention. If already muted manually, set the override and save.

### Imported text does not speak

Generate WAV files or import audio. Text alone is not playable and does not automatically start synthesis.

### Generated files are not selected by a rule

Compare the output directory with the bound voice directory, category subfolders, filename filter, and saved source. Ordinary generation and category generation can use different destinations.

### Time rules do not fire

Fixed-time rules require the app to be eligible during that minute and do not replay missed minutes. Random rules wait an initial random interval. Check the local clock, window, pauses, and cooldowns.

### F8 does not work in the settings window

Desktop-only input is enabled by default. Save and return to the desktop to test.

### Wallpaper changes but the voice profile does not

Check manual mode, followed monitor, WE's saved selection, and the playing profile. Use Detect now if appropriate.

### Changing dialogue affects several wallpapers

They may share `dialogues.json`. Assign dedicated dialogue resources to the intended profile; old shared files remain in place.

### Deleting a profile leaves audio behind

That preserves resources for reuse and other shared profiles. To remove files, inspect their paths/use in the audio library and move them to the Recycle Bin.

### Cloud connection check succeeds but synthesis fails

Address-format validation is not authentication. Check the complete endpoint, credentials, quota, supported model/voice, and WAV response protocol. Generate a short test line and inspect the error.

### GPT-SoVITS fails

Check the Python environment, project directory, compatible weights, version, reference clip/exact transcript, language codes, port, and GPU memory. Inspect `sovits-api.log` in the data directory. Candidate scanning does not validate model compatibility.

### The app still speaks after its window is closed

It is running in the tray. Pause Companion temporarily or choose tray Exit to stop it.

### Audio disappears after moving/updating the app

Check whether only the EXE was moved, `data`/`shared` were omitted, or external paths still point to the old location. Restore a full backup and rebind as required.

### Can it run offline?

Local audio, BGM, and rules can work offline. Cloud synthesis and downloads need network access. Local GPT-SoVITS needs its environment and models ready.

## 15. Report a problem

Issues: https://github.com/Abs0lutely/wallpaper-companion/issues

Include the app version, installer/portable type, Windows version, reproduction steps, expected/actual behavior, relevant runtime messages, and whether manual preview works. Redact keys and private information.

- Upstream detailed manual: https://github.com/Abs0lutely/wallpaper-companion/blob/main/USER_GUIDE.md
- Dialogue examples: https://github.com/Abs0lutely/wallpaper-companion/tree/main/examples/dialogues
- Build guide: https://github.com/Abs0lutely/wallpaper-companion/blob/main/BUILDING.md
- Extensions: https://github.com/Abs0lutely/wallpaper-companion/blob/main/EXTENSIONS.md

This Markdown file can be converted to PDF. The English PDF filename expected by the website is `Wallpaper-Companion-Manual-en.pdf`.
