# Contributing to FancyWin

Thank you for considering a contribution to FancyWin. Bug reports, focused
feature proposals, documentation improvements, testing, and code contributions
are all welcome.

Please remember that FancyWin interacts directly with desktop windows through
the Windows API. Changes that appear small can behave differently across
applications, monitor arrangements, DPI settings, and Windows integrity levels.

## Before contributing

- Search the existing issues and pull requests before opening a duplicate.
- Keep proposals focused on FancyWin's purpose as a lightweight, portable
  window-zone manager.
- For a substantial feature or architectural change, open an issue first so the
  approach can be discussed before significant work begins.
- Read [AI.md](AI.md) for the project's AI-assisted development disclosure.

## Reporting a bug

Include enough information for another person to reproduce the problem:

- FancyWin version and whether the official release or a source build was used
- Windows 11 version and system architecture
- Monitor count, arrangement, resolution, and DPI scaling
- The affected application's name and whether it was running as administrator
- The relevant YAML configuration, with any sensitive information removed
- Exact steps to reproduce the behaviour
- Expected and actual behaviour
- Output from `fancywin.exe --debug`, where relevant

Do not include credentials, private paths, or other sensitive data in logs or
configuration examples.

## Suggesting a feature

Describe the use case before proposing an implementation. Explain what problem
the feature solves, how a user would configure or operate it, and any expected
interaction with existing layouts, hotkeys, overlays, or tray behaviour.

FancyWin aims to remain portable and self-contained. Features that require an
installer, service, driver, administrator access, or a large runtime dependency
need especially strong justification.

## Development workflow

1. Fork the repository and create a branch for one focused change.
2. Make the change and add or update tests where practical.
3. Run `make build` from the repository root.
4. Test Windows-specific behaviour on Windows 11 when the change affects the
   platform backend, tray icon, overlay, hotkeys, or window movement.
5. Update `README.md`, `BUILD.md`, and the example YAML when user-visible
   behaviour or configuration changes.
6. Commit with a concise message that explains the purpose of the change.
7. Open a pull request describing the change and how it was verified.

Detailed build commands, architecture notes, and the Windows smoke-test
checklist are available in [BUILD.md](BUILD.md).

## Code expectations

- Keep the project buildable as a single portable Go executable with
  `CGO_ENABLED=0`.
- Format Go code with `gofmt`.
- Prefer standard-library functionality and the existing dependencies. Discuss
  new dependencies before adding them.
- Keep platform-neutral configuration and geometry logic separate from Win32
  implementation details.
- Check every Windows API result for meaningful failure where possible and
  release native resources deterministically.
- Preserve existing YAML compatibility unless a deliberate format-version
  change has been agreed.
- Add tests for validation, geometry, parsing, and other platform-neutral logic.
- Avoid unrelated formatting or refactoring in a focused pull request.

## Pull requests

A good pull request:

- Addresses one coherent problem
- Links the relevant issue, if one exists
- Explains important implementation choices and trade-offs
- Lists the commands and Windows scenarios used for verification
- Includes screenshots for visible overlay or tray changes
- Calls out compatibility changes, limitations, and remaining risks
- Does not contain generated binaries or unrelated files

Maintainers may ask for changes or decline work that does not fit the project's
scope. Review comments are about improving the contribution and keeping the
application dependable for its users.

## Security and elevated applications

Do not publish a security vulnerability as a public issue. Contact the
repository owner privately with a clear description, reproduction steps, and
the potential impact.

FancyWin is intended to work without administrator privileges. Windows normally
prevents a standard-integrity process from manipulating elevated windows; do
not bypass that boundary or introduce privilege escalation mechanisms.

## Conduct

Be respectful, constructive, and patient when discussing issues and reviewing
the work of others.
