We welcome contributions to the Fess project! This page explains how to contribute to Fess, community guidelines, and the process for creating pull requests.
Introduction
Fess is an open source project that grows through community contributions. Anyone can contribute regardless of programming experience level.
Ways to Contribute
There are various ways to contribute to Fess.
Code Contributions
Adding new features
Bug fixes
Performance improvements
Refactoring
Adding tests
Documentation Contributions
Improving user manuals
Adding/updating API documentation
Creating tutorials
Translations
Reporting Issues
Bug reports
Feature requests
Questions and suggestions
Community Activities
Discussions on GitHub Discussions
Answering questions on forums
Writing blog posts and tutorials
Presenting at events
First Contribution
If you are contributing to Fess for the first time, we recommend the following steps.
Step 1: Understand the Project
Check basic information on the Fess Official Site
Understand the development overview in Open Source Full-text Search Server - Fess Development Overview
Learn the code structure in Architecture and Code Structure
Step 2: Find an Issue
On the GitHub Issues page, look for issues labeled good first issue.
These issues are relatively simple tasks suitable for first-time contributors.
Step 3: Set Up Development Environment
Follow Development Environment Setup to set up your development environment.
Step 4: Create a Branch and Work
Follow Development Workflow to create a branch and start coding.
Step 5: Create Pull Request
Commit your changes and create a pull request.
Coding Conventions
Fess follows these coding conventions to maintain consistent code.
Java Coding Style
Basic Style
Indentation: 4 spaces
Line endings: LF (Unix style)
Encoding: UTF-8
Line length: 120 characters or less recommended
Naming Conventions
Packages: lowercase, dot-separated (e.g.,
org.codelibs.fess)Classes: PascalCase (e.g.,
SearchService)Interfaces: PascalCase (e.g.,
Crawler)Methods: camelCase (e.g.,
executeSearch)Variables: camelCase (e.g.,
searchResult)Constants: UPPER_SNAKE_CASE (e.g.,
MAX_SEARCH_SIZE)
Class and Method Design
Single Responsibility Principle: One class has only one responsibility
Small methods: One method does only one thing
Meaningful names: Class and method names should clearly indicate intent
Exception Handling
// Good example: Proper exception handling
try {
executeSearch(query);
} catch (IOException e) {
logger.error("Error occurred during search", e);
throw new SearchException("Failed to execute search", e);
}
// Example to avoid: Empty catch block
try {
executeSearch(query);
} catch (IOException e) {
// Do nothing
}
Handling null
Avoid returning
nullwhen possibleRecommend using
OptionalExplicitly indicate null possibility with
@Nullableannotation
// Good example
public Optional<User> findUser(String id) {
return Optional.ofNullable(userMap.get(id));
}
// Usage example
findUser("123").ifPresent(user -> {
// Process when user exists
});
Writing Tests
Write tests for all public methods
Test method names start with
testUse Given-When-Then pattern
@Test
public void testSearch() {
// Given: Test preconditions
SearchService service = new SearchService();
String query = "test";
// When: Execute test target
SearchResponse response = service.search(query);
// Then: Verify results
assertNotNull(response);
assertEquals(10, response.getDocuments().size());
}
Code Review Guidelines
Pull Request Review Process
Automated checks: CI automatically runs builds and tests
Code review: Maintainers review the code
Feedback: Request modifications if necessary
Approval: Review is approved
Merge: Maintainers merge to main branch
Review Criteria
Reviews check the following points:
Functionality
Does it meet requirements
Does it work as intended
Are edge cases considered
Code Quality
Follows coding conventions
Readable and maintainable code
Appropriate abstraction
Tests
Sufficient tests written
Tests pass
Tests perform meaningful validation
Performance
No negative performance impact
Appropriate resource usage
Security
No security issues
Proper input validation
Documentation
Necessary documentation updated
Javadoc written appropriately
Responding to Review Comments
Respond to review comments promptly and politely.
When modifications are needed:
Thank you for pointing that out. I've made the correction.
[Brief description of the modification]
When discussion is needed:
Thank you for your feedback.
I implemented it this way because of ○○,
but would △△ implementation be better?
Pull Request Best Practices
PR Size
Keep PRs small and easy to review
Include one logical change per PR
Split large changes into multiple PRs
PR Title
Use clear and descriptive titles:
feat: Add search result filtering feature
fix: Fix crawler timeout issue
docs: Update API documentation
PR Description
Include the following information:
Changes: What was changed
Reason: Why this change is necessary
Testing method: How it was tested
Screenshots: For UI changes
Related Issue: Issue number (e.g., Closes #123)
## Changes
Added a feature to filter search results by file type.
## Reason
Many users requested the ability to "search only specific file types."
## Testing Method
1. Select file type filter on search screen
2. Execute search
3. Verify that only results of selected file type are displayed
## Related Issue
Closes #123
Commit Messages
Write clear and descriptive commit messages:
<type>: <subject>
<body>
<footer>
Example:
feat: Add search filter feature
Enabled users to filter search results by file type.
- Added filter UI
- Implemented backend filter processing
- Added tests
Closes #123
Using Draft PRs
Create work-in-progress PRs as Draft PRs, then change to Ready for review when complete.
1. Select "Create draft pull request" when creating PR
2. Click "Ready for review" when work is complete
Community Guidelines
Code of Conduct
The Fess community follows these codes of conduct:
Be respectful: Respect everyone
Be collaborative: Provide constructive feedback
Be open: Welcome different perspectives and experiences
Be polite: Use courteous language
Communication
Where to ask questions:
GitHub Discussions: General questions and discussions
Issue Tracker: Bug reports and feature requests
Fess Forum: Community forum
How to ask questions:
Be specific
Explain what you’ve tried
Include error messages and logs
Include environment information (OS, Java version, etc.)
How to answer:
Be polite and kind
Provide specific solutions
Provide links to reference materials
Expressing Gratitude
We express gratitude for contributions. Even small contributions are valuable to the project.
Frequently Asked Questions
Q: Can beginners contribute?
A: Yes, welcome! We recommend starting with issues labeled good first issue. Documentation improvements are also suitable contributions for beginners.
Q: How long does it take for pull requests to be reviewed?
A: Usually within a few days. However, it may vary depending on maintainers’ schedules.
Q: What if my pull request is rejected?
A: Check the reason for rejection and resubmit with modifications if needed. Feel free to ask questions if you’re unsure.
Q: What if I violate coding conventions?
A: It will be pointed out in the review, so you can fix it. You can check in advance by running Checkstyle.
Q: What if I want to add a large feature?
A: We recommend creating an Issue first to discuss the proposal. Getting agreement in advance avoids wasted work.
Q: Can I ask questions in Japanese?
A: Yes, both Japanese and English are fine. Since Fess is a project from Japan, Japanese support is also comprehensive.
Type-Specific Contribution Guides
Documentation Improvements
Fork the documentation repository:
git clone https://github.com/codelibs/fess-docs.git
Make changes
Create pull request
Bug Reports
Search existing issues to check for duplicates
Create new issue
Include the following information:
Bug description
Reproduction steps
Expected behavior
Actual behavior
Environment information
Feature Requests
Create issue
Explain:
Feature description
Background and motivation
Proposed implementation method (optional)
Code Reviews
Reviewing other people’s pull requests is also a contribution:
Find a PR you’re interested in
Review the code
Provide constructive feedback
License
Fess is released under the Apache License 2.0. Contributed code will also be subject to the same license.
By creating a pull request, you are agreeing that your contribution will be released under this license.
Acknowledgments
Thank you for contributing to the Fess project! Your contribution makes Fess better software.
Next Steps
When you’re ready to contribute:
Set up development environment with Development Environment Setup
Check development flow with Development Workflow
Find issues on GitHub
References
Community Resources
GitHub: codelibs/fess
Discussions: GitHub Discussions
Forum: Fess Forum
Twitter: @codelibs
Website: fess.codelibs.org
Comments
Javadoc:
Write Javadoc for public classes, methods, and fields.
Implementation comments:
Add comments in Japanese or English for complex logic.