PhpReport 2017

Time for our yearly release of PhpReport! There has been a lot of activity during last year as a part of Igalia Coding Experience program. Thanks to Tony Thomas for having done a great work!

These are my highlights of the PhpReport 2.17 release:

Simplified UI for tasks

We have changed the tasks UI to give more room to the most important fields and sorted them by importance, so the most important fields are first in the tab-navigation order. The goal is to be able to fill tasks faster and more efficiently.

In particular, the new projects field is very interesting because it lets users search both by customer or project name. With this change, we have been able to remove the customer field for every task. Choice in the project field is now limited by default to the most common projects, the one users have been directly assigned to; the full list of open projects can be gathered with the special load all entry.

Simplification extends to the data model, related web services and reports. Now a project can only be assigned to one customer removing the many-to-many relation there used to be. The ability to assign several clients to the same project was barely used, and even felt unnatural in most cases, so it’s not a big loss.

Auto-save tasks

The tasks screen got the ability to auto-save changes every certain number of seconds. We have kept one exception: deleted tasks must be manually saved, and we have kept the save buttons for that purpose. This exception will be around until we have some way to undo task deletion.

Persistent templates

Templates are finally kept on the server side so they can be accessed from any browser and any computer. Their usage is also less cryptic, now a name for the template is explicitly asked upon creation instead of using the description field as a name. Finally, we added one permanent template to create a task that comprises the entire work day. It’s very useful to fill holidays in, because the length of the work day is calculated for that user and day.

User weekly goals

To better keep extra hours under control, we have added a new entry in the User work summary box in the tasks screen. The week goal entry will tell users how many hours they should work every week to finish the year with 0 accumulated hours. It updates every week, taking into account the number of hours accumulated since the beginning of the year. For example, if you worked some extra time in the last month, the weekly goal will give you a figure that is lower to your standard weekly timetable so in the end of the year the extra time is compensated.

It’s possible to define per-user weekly goals, with custom time periods and numbers of accumulated hours.

Weekly hours in a project

A new grid in the project details report will show the number of hours worked every week by project members. It is useful to keep a weekly control of the time devoted to the project.

New manager user profile

We have limited access to standard PhpReport users only to certain reports, and a new user profile called manager has been added. Manager users have the ability to access system-wide reports and details from any existing project.

And more

Days start with an empty task so you can start typing your progress right away, there are keyboard shortcuts to jump to the next or previous days, more direct access to project details reports…

Check the other many features and fixes in the release page, and enjoy PhpReport 2.17!

A new PhpReport for 2016

It’s been three years without any new release of our venerable time tracking tool, PhpReport. It doesn’t mean the project has been still during all this time; despite the slower development pace, you will find more than 80 patches in the repository since the last release, which account for 45 fixes or small features in the project.

It’s time to gather them all in a new release, PhpReport 2.16. These are the highlights:

CSV export

csv export button

All reports have now an option to export data to CSV, so they can be imported into other software. This was made with spreadsheets in mind, and I can confirm it works perfectly with our dear LibreOffice Calc.

Quick-access buttons

Quick access date form

Most reports got quick-access buttons added for the most common time periods: current and previous week, current month and year, etc.

Smarter “copy from yesterday”

The “copy from date” feature allows to copy tasks from a certain date into the current one. Its main use case is to copy everything from your previous work day, because you probably have been doing the same work, more or less during the same timetable… You can conveniently copy the tasks and just add some tweaks. The default date to copy from used to be the previous day, but you don’t usually want to copy your tasks from Sunday to Monday! Now it defaults to the previous date you have worked.


Addressed several slightly annoying behaviors to make the application more enjoyable to use. For example, when you create a project, the grid will scroll automatically to the newly added project so you can keep editing the project attributes. A similar thing happens when you have some row selected in the accumulated hours report and you load a new set of dates: the previously selected row will be kept selected and visible. Opening the project details from a report now pops up a new window so your report remains untouched when you go back to it. Inexplicably small grids now use all the screen space, and we increased the consistency among the different edition screens.

Moved to GitHub

The project sources, releases and the information previously available in the project website has been moved to GitHub, so any potential contributors will find a familiar environment if they happen to be interested in PhpReport.


I’ve bumped the version number from 2.1 straight to 2.16. The intention is to make one release per year, to guarantee some predictability regarding how and when the changes in the repository will arrive to users. You can expect PhpReport 2.17 releasing in March next year; it may look like a long time but I think it’s reasonable for a project with a low level of activity.

Looking for help!

Igalia has recently announced open positions in our Coding Experience program, and one of them is aimed to work in PhpReport. We have many ideas to improve this tool to make it more productive and powerful. Check the conditions of the program in the website if you are interested!

A somehow late recap on 2013

First of all let me wish you a happy new year, dear reader! These kinds of posts are supposed to be published in the last days of the year, but I needed some holidays before being back at full-steam.

That’s because 2013 has been quite a ride from the professional point of view. I have never touched so many different technologies and frameworks in such a relatively short time period:

  • I started the year Introducing KiCad, one of the best free software EDA software suites. I have been contributing to KiCad for some months and even gave a talk to the students at the Facultade de Informática da Coruña.
  • PhpReport got a new release in the first months of 2013.
  • I was also Playing with HTML5 in my spare time to develop a full, albeit short, arcade game.
  • I have helped my fellow Igalian Juan A. Suárez to debug the XML meta-plugin for Grilo, which will allow the development of simpler Grilo plugins using an XML based language. We hope to release it (and blog about it!) in the months to come.
  • I also took some steps into Android application development.
  • And finally, I joined the LibreOffice community where I have been happily contributing to the support of OOXML standard and helping to detect and correct accessibility problems. I’ve already been granted commit permission on the main repo and invited to join ESC meetings. I feel really honored and grateful about that.


Another feat of 2013 is that Igalia has turned 12, and we celebrated it as a part of the last Igalia summit. We spent the weekend in a really beautiful location in Galicia where we were able to relax, eat, drink, compete in the first official Igalia gymkhana and we even had time to sit down together to discuss how to face the future, spread our values and keep enjoying what we do.

I am really happy to show how Igalia keeps going forward on its compromise with Free Software. In the last year we joined a number of consortia and associations and sponsored FLOSS-related events all around the world. I would like to highlight our membership to the W3C, with whom we will contribute shaping the Web of the future, our partnership with Adobe to implement new web standards, our sponsorship to multiple Linux Foundation events or our support to The Document Foundation.

2014 is ahead and it bring new challenges for sure; my only wish is having the energy to face them with passion!

Playing with HTML5

In the last weeks I have been playing with HTML5 in a very literal way, merging two of my interests: web development and video games. The result is a small arcade game which makes use of several features from the new web standard.

You can take a look at the code on GitHub at any time and even play it online here. Let me comment on some of the implementation details below:

The game loop

The game loop is implemented using the function setInterval() from the standard JS libraries. In particular, a callback is invoked 30 times per second: it checks the state of the game entities, updates them and then redraws the scene. This was the best option given that I’m not using any development framework.


The game area is contained in a canvas. The canvas has been around long before HTML5 took shape, but it has received quite a lot of love recently in the form of acceleration. The game code is not specially designed for performance (after all, it was mostly developed in a week), and the scene is being completely redrawn 30 times per second. Nonetheless, I could try it in a first-generation Atom laptop with no noticeable lag.


The canvas element has primitive operations to draw vector graphics (lines, bezier curves, text…) but 99% of the scene has been implemented using bitmaps, piled in several layers. This way of working is really similar to using a low-level graphic abstraction like SDL in the end.

What’s more, the bitmaps are sent to the browser packed in sheets that contain several sprites. It is a common technique in web development to save bandwidth and to overcome the limit in the number of simultaneous requests that browsers can send, but its use in video games dates from longer ago, when programmers had to deal with memory limitations.


The game is controlled with the keyboard, and I use callbacks for standard key events (keyupkeydown) to check its state. These events act asynchronously and independently from the game loop, so the state of the keys is stored in an object which is checked in the update entities phase of the loop.

It also has to be taken into account that the key event callbacks are set on the canvas object, as a consequence events are lost if the focus moves out of the canvas. I have found some weird interactions when the focus changes while keys are pressed, so this part of the code definitely needs some work yet to become more robust.


I’ve used the web audio API to be able to manipulate sound with a high level of detail. Though I haven’t used most of its capabilities by far, it was worth connecting all the wires to make it work.

This API is designed as an audio flow going through several nodes, similarly to other popular multimedia frameworks. Each node has the ability to process the input in some way before sending it to the next node. I used only one intermediate node, the GainNode, to be able to mute the audio output at will, but it could have been used to implement an internal volume control.


A project is never complete with a list of things one would like to add, complete or polish. I’ve already mentioned some details worth revisiting, but there are also some features that I would have liked to use; examples are local storage to implement high score boards or network code to implement some sort of interaction between players. But in the end of the day, this has been a worthwhile exercise; I’m satisfied with the result and  I might still improve it in the future!

New release: PhpReport 2.1!

Although I’ve recently changed of scene, there’s still some love for one of the eldest tools we have in Igalia, PhpReport. I’ve been gathering some hours here and there in the last months to be able to develop and ship a new batch of improvements. I would like to highlight some of them:

  • Now we have a way to block the edition of tasks after some time. You can configure a number of days after which users will not be able to insert new tasks or modify existing ones. This will prevent that huge changes in the past affect to your numbers without notice.
  • There is also a new report for users to check their list of tasks and search among them. It gives a higher-level view of your work than the day-to-day tasks interface, while providing more detail than the user or projects details screens. There is also a complementary web service that can be accessed by external scripts. The first commit of this feature dates back from 2010, so it has indeed been stopped for too much!
  • The annoying bug in the tasks screen that prevented you from saving correct tasks under certain conditions is finally gone. And since we were at it, we have modified the notification banners to show up only once.
  • Finally there’s some documentation for system administrators beyond the installation instructions.
  • We added a new boolean field to the tasks to mark specific tasks as done “on site”.
  • Implemented some keyboard shortcuts to increase the productivity in the tasks screen. In particular, you can quick jump to a task with CTRL + 1, 2, etc., save with CTRL + S or add a new task with CTRL + N. Alternatives with ALT exists for browsers not allowing to override these specific combinations, see the corresponding section in the user documentation for details.

The list could be wider, but you can already read it in the changelog. Meanwhile, you can download the new version, or try it online [EDIT: online demo not available any more]. Enjoy!