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
41 changes: 41 additions & 0 deletions .github/ISSUE_TEMPLATE/bug_report.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
name: Bug report
description: Report a reproducible Gridnote defect.
title: "[Bug]: "
labels: [bug]
body:
- type: markdown
attributes:
value: "Do not include book contents, private files, access bookmarks, or credentials."
- type: input
id: version
attributes:
label: Version or commit
placeholder: "v0.1.0 or c89333f"
validations:
required: true
- type: input
id: macos
attributes:
label: macOS version and hardware
placeholder: "macOS 27 beta, Apple Silicon"
validations:
required: true
- type: textarea
id: steps
attributes:
label: Steps to reproduce
placeholder: "1. Import a sample TXT..."
validations:
required: true
- type: textarea
id: expected
attributes:
label: Expected behavior
validations:
required: true
- type: textarea
id: actual
attributes:
label: Actual behavior
validations:
required: true
8 changes: 8 additions & 0 deletions .github/ISSUE_TEMPLATE/config.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
blank_issues_enabled: false
contact_links:
- name: Security report
url: https://github.com/ZOB2077/Gridnote/security/advisories/new
about: Report vulnerabilities privately under the security policy.
- name: Commercial licensing
url: https://github.com/ZOB2077
about: Contact the copyright holder for commercial licensing.
24 changes: 24 additions & 0 deletions .github/ISSUE_TEMPLATE/feature_request.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
name: Feature request
description: Suggest a focused improvement to Gridnote.
title: "[Feature]: "
labels: [enhancement]
body:
- type: textarea
id: problem
attributes:
label: Problem to solve
validations:
required: true
- type: textarea
id: proposal
attributes:
label: Proposed behavior
validations:
required: true
- type: textarea
id: boundaries
attributes:
label: Scope and privacy impact
description: "Explain whether this affects local-only behavior, supported formats, or office presentation."
validations:
required: true
14 changes: 14 additions & 0 deletions .github/pull_request_template.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
## Summary

Describe the user-visible change and why it is needed.

## Validation

- [ ] I ran the relevant unit tests.
- [ ] I performed manual verification where UI behavior changed.
- [ ] I updated documentation and release notes when needed.

## Scope And Privacy

- [ ] This change adds no network, analytics, DRM, private API, or office-vendor trademark dependency.
- [ ] This pull request does not contain private books, credentials, or generated build artifacts.
34 changes: 34 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
name: macOS CI

on:
push:
branches: [main]
pull_request:
branches: [main]

permissions:
contents: read

jobs:
unit-tests:
name: Build and unit test
runs-on: macos-26
timeout-minutes: 20
steps:
- name: Check out source
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- name: Show Xcode version
run: xcodebuild -version
- name: Build release configuration
run: >-
xcodebuild -project Gridnote.xcodeproj -scheme Gridnote
-configuration Release -destination 'platform=macOS'
CODE_SIGNING_ALLOWED=NO build
- name: Build and run unit tests
run: >-
xcodebuild -project Gridnote.xcodeproj -scheme Gridnote
-destination 'platform=macOS'
-parallel-testing-enabled NO
-skip-testing:GridnoteUITests
-skip-testing:GridnoteTests/ReleaseFixtureTests/testLargeTXTParserPerformanceSmoke
test
25 changes: 25 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
# Changelog

All notable changes are documented in this file. Gridnote follows [Semantic Versioning](https://semver.org/) for public releases where practical.

## [0.1.0] - 2026-07-13

### Added

- Local TXT and non-DRM EPUB import, parsing, search, bookmarks, and persistent reading locations.
- Original office-style phone-rental data workspace with formula-bar reading presentation.
- Floating reader, Super Stealth mode, configurable appearance, progress indicator, and menu-bar controls.
- Default shortcut profile: `F7` previous, `F8` next, and `F9` show or hide the floating reader.
- Per-book aliases, local workbook titles, dense synthetic office templates, and privacy shielding when the app loses focus.
- Source-available non-commercial license and commercial-licensing path.

### Changed

- Office formula-bar navigation and the floating reader now synchronize reading progress in both directions.
- The office workspace uses an original presentation and does not expose book text inside spreadsheet cells.

### Known Limitations

- PDF, cloud sync, network features, accounts, DRM handling, XLSX compatibility, notarization, and global shortcuts are not included.

[0.1.0]: https://github.com/ZOB2077/Gridnote/releases/tag/v0.1.0
21 changes: 21 additions & 0 deletions CODE_OF_CONDUCT.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
# Code Of Conduct

## Our Pledge

We are committed to a respectful, professional, and inclusive community. Harassment, personal attacks, discrimination, threats, doxxing, and deliberately disruptive behavior are not acceptable.

## Expected Behavior

- Focus feedback on code, product behavior, and evidence.
- Respect differing experience levels and communicate in good faith.
- Protect private reading material, personal data, and security-sensitive details.

## Unacceptable Behavior

- Harassment, hateful conduct, intimidation, or unwanted sexual attention.
- Publishing private information without permission.
- Submitting malicious code, pirated material, DRM-circumvention tools, or content intended to bypass platform protections.

## Enforcement

Report conduct concerns privately through the repository owner's GitHub profile: [ZOB2077](https://github.com/ZOB2077). Reports will be reviewed in good faith. Responses may include a warning, removal of content, temporary restriction, or permanent ban.
38 changes: 38 additions & 0 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
# Contributing To Gridnote

Thank you for improving Gridnote. Contributions are reviewed for product fit, privacy impact, maintenance cost, and compatibility with the source-available license.

## Before You Start

- Read [PRODUCT_SPEC.md](PRODUCT_SPEC.md), [ARCHITECTURE.md](ARCHITECTURE.md), and [AGENTS.md](AGENTS.md).
- Search existing issues and pull requests before opening a new one.
- Discuss substantial features in an issue before implementation. Keep pull requests narrowly scoped.
- Do not add networking, analytics, DRM handling, private APIs, or office-suite trademark assets.
- Use synthetic fixtures only. Never commit real business data, private books, customer records, or screenshots containing them.

## Development Setup

1. Fork and clone the repository.
2. Open `Gridnote.xcodeproj` in Xcode 27 beta.
3. Select the `Gridnote` scheme and run it on macOS.
4. Run the unit-test command from the README before submitting a pull request.

## Pull Request Expectations

- Describe the user-visible behavior and technical approach.
- Add or update unit tests for changed business logic.
- Keep parser, persistence, and UI responsibilities separate.
- Update documentation when behavior, shortcuts, support boundaries, or release status change.
- Do not include build products, DerivedData, local test fixtures containing private material, or unrelated formatting churn.

## Commit Style

Use concise imperative subjects, such as `Synchronize office and floating reader progress`. Prefer one logical change per commit when practical.

## Contributor License Grant

By submitting a contribution, you confirm that you have the right to submit it and agree to the contribution terms in [LICENSE](LICENSE), including the copyright holder's right to use and commercialize accepted contributions as part of Gridnote.

## Reporting Problems

Use the bug-report template for reproducible defects. Do not include book contents, personally identifiable information, or private source files in public issues. Security-sensitive reports must follow [SECURITY.md](SECURITY.md).
4 changes: 2 additions & 2 deletions Gridnote.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -319,8 +319,8 @@
/* Begin XCBuildConfiguration section */
B10000000000000000000001 /* Debug */ = {isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; MACOSX_DEPLOYMENT_TARGET = 26.0; SDKROOT = macosx; SWIFT_VERSION = 6.0; }; name = Debug; };
B10000000000000000000002 /* Release */ = {isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; MACOSX_DEPLOYMENT_TARGET = 26.0; SDKROOT = macosx; SWIFT_VERSION = 6.0; }; name = Release; };
B10000000000000000000003 /* Gridnote Debug */ = {isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; ENABLE_TESTABILITY = YES; EXECUTABLE_NAME = DataHub; GENERATE_INFOPLIST_FILE = NO; INFOPLIST_FILE = Gridnote/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; MACOSX_DEPLOYMENT_TARGET = 26.0; PRODUCT_BUNDLE_IDENTIFIER = com.gridnote.app; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = macosx; SWIFT_EMIT_LOC_STRINGS = YES; SWIFT_VERSION = 6.0; }; name = Debug; };
B10000000000000000000004 /* Gridnote Release */ = {isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; ENABLE_TESTABILITY = YES; EXECUTABLE_NAME = DataHub; GENERATE_INFOPLIST_FILE = NO; INFOPLIST_FILE = Gridnote/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; MACOSX_DEPLOYMENT_TARGET = 26.0; PRODUCT_BUNDLE_IDENTIFIER = com.gridnote.app; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = macosx; SWIFT_EMIT_LOC_STRINGS = YES; SWIFT_VERSION = 6.0; }; name = Release; };
B10000000000000000000003 /* Gridnote Debug */ = {isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; ENABLE_TESTABILITY = YES; EXECUTABLE_NAME = DataHub; GENERATE_INFOPLIST_FILE = NO; INFOPLIST_FILE = Gridnote/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; MACOSX_DEPLOYMENT_TARGET = 26.0; MARKETING_VERSION = 0.1.0; PRODUCT_BUNDLE_IDENTIFIER = com.gridnote.app; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = macosx; SWIFT_EMIT_LOC_STRINGS = YES; SWIFT_VERSION = 6.0; }; name = Debug; };
B10000000000000000000004 /* Gridnote Release */ = {isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; ENABLE_TESTABILITY = YES; EXECUTABLE_NAME = DataHub; GENERATE_INFOPLIST_FILE = NO; INFOPLIST_FILE = Gridnote/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; MACOSX_DEPLOYMENT_TARGET = 26.0; MARKETING_VERSION = 0.1.0; PRODUCT_BUNDLE_IDENTIFIER = com.gridnote.app; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = macosx; SWIFT_EMIT_LOC_STRINGS = YES; SWIFT_VERSION = 6.0; }; name = Release; };
B10000000000000000000005 /* GridnoteTests Debug */ = {isa = XCBuildConfiguration; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; GENERATE_INFOPLIST_FILE = YES; MACOSX_DEPLOYMENT_TARGET = 26.0; PRODUCT_BUNDLE_IDENTIFIER = com.gridnote.tests; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = macosx; SWIFT_VERSION = 6.0; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Gridnote.app/Contents/MacOS/DataHub"; }; name = Debug; };
B10000000000000000000006 /* GridnoteTests Release */ = {isa = XCBuildConfiguration; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; GENERATE_INFOPLIST_FILE = YES; MACOSX_DEPLOYMENT_TARGET = 26.0; PRODUCT_BUNDLE_IDENTIFIER = com.gridnote.tests; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = macosx; SWIFT_VERSION = 6.0; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Gridnote.app/Contents/MacOS/DataHub"; }; name = Release; };
B10000000000000000000007 /* GridnoteUITests Debug */ = {isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_STYLE = Automatic; GENERATE_INFOPLIST_FILE = YES; MACOSX_DEPLOYMENT_TARGET = 26.0; PRODUCT_BUNDLE_IDENTIFIER = com.gridnote.uitests; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = macosx; SWIFT_VERSION = 6.0; TEST_TARGET_NAME = Gridnote; }; name = Debug; };
Expand Down
Loading